呼唤功能

时间:2012-01-03 13:09:56

标签: c

  

可能重复:
  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个元素的数组!

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}}函数接收指针值,而不是数组。在函数参数声明的上下文中,intdupes等同于T a[N]

因此,在T a[]函数中,T *a相当于dupes,在您的情况下为{<1}}。