gpt4 book ai didi

c - 当数组作为参数传递时会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:48 24 4
gpt4 key购买 nike

我最近痛苦地了解到,如果您将数组传递给函数,它会“衰减”为指针。

那么我的问题是,数组在其创建范围内被视为什么以及 sizeof 是如何区分的?我以为所有数组都是指针,方括号将指针向前移动并一次性取消引用。观察以下代码:

[name@localhost lab03]$ cat arraysAsArguments.c
#include <stdio.h>

void function(int array[]) //Treated as pointer
{
printf("%x", array);
int size = sizeof array;
int firstElement = sizeof array[0];
printf("size: %d\n", size);
printf("firstElement: %d\n", firstElement);
}

int main()
{
int array[] = {0,1,2,3,4,5}; // expected size = 6*4 = 24 bytes
printf("%x", array);
int size = sizeof array;
int firstElement = sizeof array[0];
printf("size: %d\n", size);
printf("firstElement: %d\n", firstElement);
function(array);
}

[name@localhost lab03]$ clang arraysAsArguments.c
arraysAsArguments.c:5:12: warning: conversion specifies type 'unsigned int' but the argument has type 'int *' [-Wformat]
printf("%x", array);
~^ ~~~~~
arraysAsArguments.c:15:12: warning: conversion specifies type 'unsigned int' but the argument has type 'int *' [-Wformat]
printf("%x", array);
~^ ~~~~~
2 warnings generated.
[name@localhost lab03]$ ./a.out
57c84940size: 24
firstElement: 4
57c84940size: 8
firstElement: 4

在 main 和 function 中,array 都是 int* 类型。这是怎么回事?!

最佳答案

当作为函数传递时,数组衰减为指向其第一个元素的指针。这就是为什么 function 中的 sizeof 调用不是您所期望的,因为它是在指针上调用 sizeof。在 function 这一行中

int size = sizeof array;

array 已经衰减为一个指针,您正在将 int* 的大小存储在您的 size 变量中。

你仍然可以通过参数访问数组中的元素,尽管作为符号

array[1];

相同
*(array + 1);

如果您已声明您的函数直接接受 int* 作为参数而不是数组,这与您访问数组元素的方式相同。所发生的一切都是指针衰减 - main 中的 int array[] 仍然是一个数组。

关于c - 当数组作为参数传递时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21368522/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com