可能重复:
C sizeof a passed array
而不是发送sizeof:
void main()
int x[] = {1, 2, 3, 1, 3, 0, 6};
dupes(x, sizeof x / sizeof x[0]);
...
}
int dupes(int a[], int n)
...
...
为什么我只能用数组调用它:
int main()
{
int x[] = {1, 2, 3, 1, 3, 0, 6};
dupes(x);
...
}
int dupes(int a[])
{
int n = sizeof a / sizeof a[0];
当我这样做时,大小总是为1 - 而且它不能是1 casue我发送一个包含7个元素的数组!
答案 0 :(得分:3)
sizeof
不是函数,它是编译器操作符(因此您不“调用”sizeof
,只需使用 sizeof
运算符) 。编译器无法知道函数a
的正式参数dupes
的大小(并且处理为int* a
,即指针正式)。
sizeof
。
答案 1 :(得分:1)
当数组传递给函数时,它们会衰减成指向第一个元素的指针。 sizeof
仅在传递实际原始数组时有效。
在其他语言中,数组引用总是带有它们的长度,但C哲学反对这种隐藏的性能惩罚,所以你必须自己通过它。
答案 2 :(得分:1)
这个原型用C:
int dupes(int a[])
{
}
相当于这个原型:
int dupes(int *a)
{
}
您将数组参数a
转换为指向int
的指针。
关于函数声明符,它出现在C99标准的6.7.5.3p7中
参数声明为''数组类型''应调整为 ''类型''的限定指针,类型限定符(如果有的话) 在数组类型派生的[和]中指定的那些。
C中的数组是二等公民,你不能将数组传递给函数。您只需将指针传递给数组的第一个元素即可。
因此,当您计算sizeof a
时,结果是指针的大小而不是数组的大小。
sizeof a / sizeof a[0]
实际上会计算:sizeof (int *) / sizeof (int)
在系统中产生1,因为int *
的大小与{int
的大小相同1}}在您的系统中。
答案 3 :(得分:0)
sizeof a [0]; 重新打造数组的第一个元素
当你传递一个数组时,它返回数组第一个元素的地址,所以你也必须指定长度。
在内部遍历数组如下:
int a[]={1,2,3};
when you pass a[] as a function argument it sends the address of the element a[0]
是1的内部地址,并将[1]计算为
address of a[0] + size of int (type of an array)
sizeof(a[]) it will return the sizeof(int pointer) as a[0] contains the internal address(integer pointer).
时输入
答案 4 :(得分:0)
这是因为当您将数组传递给函数时,它会被复制到指针中,并且有关它的大小的信息会丢失。在被调用的函数中,它只是一个普通的指针。
因此(a)的大小变为4(因为它的指针)和sizeof(a [0])也是4(因为它是一个整数),所以n等于1
答案 5 :(得分:0)
这是因为你无法将数组直接传递给函数。您只能将指针传递给此类数组中的元素。
在函数参数中,[] 不表示数组,它表示指针
int dupes(int a[])
与
完全相同 int dupes(int *a)
当您使用数组的名称作为值时,它实际上意味着指向该数组中的1.元素的指针。而指针就是指针。它不知道它指向一个给定大小的数组。
所以,例如int *a = x;
会将指向x
中第一个元素的指针指定给a
- 调用函数时,dupes(x)
会将指针传递给x
中的第一个元素。 1}}作为dupes函数的参数。这与调用dupes(&x[0])
在dupes()函数中,它的参数只是一个指针。所以sizeof x/sizeof x[0]
与sizeof(int*)/sizeof(int)
是等价的,如果你的指针与int的大小相同,则为1。
(但是,由于你传递了一个指向数组中1.元素的指针,你可以增加该指针来访问其他元素。例如x + 2
会使x
指向3.元素(从1开始计算)在该数组中。如果你取消引用该指针,你会得到它的值:*(x + 2)
。请记住,作为一个值,x[2]
与*(x + 2)
相同
答案 6 :(得分:0)
当大多数上下文中出现“N元素数组T
”类型的表达式时,它会隐式转换为“指向T
的指针”类型的表达式,其值为数组中的第一个元素。当数组表达式是sizeof
和一元&
运算符的操作数时,或者是用于在声明中初始化数组的字符串文字时,会出现此规则的唯一例外。
当您致电dupes
时,表达式x
将从“{元素{1}}的7元素数组”转换为“指向int
的指针”,因此{{ 1}}函数接收指针值,而不是数组。在函数参数声明的上下文中,int
和dupes
等同于T a[N]
。
因此,在T a[]
函数中,T *a
相当于dupes
,在您的情况下为{<1}}。