【发布时间】:2014-08-19 12:03:30
【问题描述】:
我很难理解 C 中数组名称的类型和使用。这可能看起来很长,但请多多包涵。
我了解以下语句将a 声明为int [] 类型,即整数数组。
int a[30];
虽然a 也指向数组的第一个元素,但*(a+2) 之类的东西是有效的。因此,使a 看起来像一个指向整数的指针。但实际上int [] 和int* 的类型是不同的;而前者是数组类型,而后者是指向整数的指针。
当将int [] 类型的变量传递给函数时,它也会被转换为int* 类型的变量;如C 数组通过引用传递(sizeof 运算符除外)。
这就是让我摇摆不定的地方。看看下面这段代码:
int main()
{
int (*p)[3];
int a[3] = { 5, 4, 6 };
p = &a;
printf("a:%d\t&a:%d\n",a,&a);
printf("%d",*(*p + 2));
}
输出:
a:2686720 &a:2686720
6
那么,上面的代码是如何工作的呢?我有两个问题:
-
a和&a具有相同的值。为什么? -
int (*p)[3];到底是做什么的?它声明了一个指向数组的指针,我知道这一点。但是,指向数组的指针与指向数组第一个元素的指针和数组的名称有何不同?
谁能澄清一下?我有很多困惑。
我知道我应该使用%p 作为占位符,而不是使用%d 来打印指针变量的值。因为使用整数占位符可能会打印截断的地址。但我只想保持简单。
【问题讨论】:
-
c-faq.com 第 6 节。
-
sizeof不是函数。它是一个运算符。括号通常不是必需的。sizeof(int)需要它们的原因是因为(int)是一种类型。因此,例如,如果您有int a[10],那么您可以像sizeof a一样使用 sizeof,而无需任何括号。 -
您可以根据需要搜索 SO 帖子。如果您要证明
sizeof不是函数,请参阅C99 Standard,第 6.4.1 节,其中它被列为 关键字,因此不能是函数。另请参阅第 6.5.3 节(一元运算符)和第 6.5.3.4 节(sizeof 运算符)。 -
声明
int a[30]时a的类型不是int [];这是int [30]。数组长度是类型的一部分。 -
关于
sizeof,即使不检查标准,你也应该能够意识到sizeof不可能是一个函数。实现 sizeof 所做的函数是不可能的:不仅需要的信息对 C 函数不可用,而且在编译时需要答案。只有编译器本身才能提供 sizeof 的结果。
标签: c arrays pointers memory-address