c中的数组名到底是什么?
我很难理解C中数组名称的类型和用法。这可能是一篇很长的文章,但请耐心听我说 我理解以下语句声明c中的数组名到底是什么?,c,arrays,pointers,memory-address,C,Arrays,Pointers,Memory Address,我很难理解C中数组名称的类型和用法。这可能是一篇很长的文章,但请耐心听我说 我理解以下语句声明a为int[]类型,即整数数组 int a[30]; 而a也指向数组的第一个元素,像*(a+2)这样的东西是有效的。因此,使a看起来像指向整数的指针。但是实际上int[]和int*的类型是不同的;前者是数组类型,后者是指向整数的指针 int a[30]; 当传递给函数时,类型为int[]的变量也会转换为类型为int*的变量;正如在C中一样,数组是通过引用传递的(除了sizeof操作符) 这一点让我心
a
为int[]
类型,即整数数组
int a[30];
而a
也指向数组的第一个元素,像*(a+2)
这样的东西是有效的。因此,使a
看起来像指向整数的指针。但是实际上int[]
和int*
的类型是不同的;前者是数组类型,后者是指向整数的指针
int a[30];
当传递给函数时,类型为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
来打印指针变量的值。因为使用整数占位符可能会打印截断的地址。但我只想让事情简单一些
&用于存储数组a[]的一个-->地址位置,它存储第一个元素位置,但知道每个元素的位置
类似地,其他元素的位置将是(a+2),(a+4)等等,直到阵列的末端
因此,你得到了这样的结果
(void *) a == (void *) &a
a + 1 /* address of the second element of the array */
&a + 1 /* address one past the last element of the array */
编辑:由于大众的需求,我在下面添加了一些有关阵列转换的信息
除了三个例外,在表达式中,数组类型为T
的对象转换为指向数组第一个元素的指针类型为T
的值。例外情况是,如果对象是sizeof
或&
一元运算符的操作数,或者如果对象是初始化数组的字符串文字
例如,本声明:
printf("a:%d\t&a:%d\n", a, &a);
实际上相当于:
printf("a:%d\t&a:%d\n", &a[0], &a);
另外请注意,d
转换说明符只能用于打印有符号整数;要打印指针值,必须使用p
说明符(参数必须是void*
)。因此,要正确做事,请使用:
printf("a:%p\t&a:%p\n", (void *) a, (void *) &a);
分别为:
printf("a:%p\t&a:%p\n", (void *) &a[0], (void *) &a);
在回答问题1时,这只是C语言设计的一个方面,与大多数其他现代语言不同,C/C++允许直接操作内存中的地址,并内置了“理解”这些地址的工具。网上有很多文章比我在这个小空间里能更好地解释这一点。这里有一个,我相信还有很多其他的:来自6.3.2.1 p3 除非它是sizeof运算符或一元数的操作数& 运算符,或是用于初始化数组的字符串文字 类型为“”的数组“”的表达式转换为 类型为“指向类型的指针”且指向初始值的表达式 数组对象的元素,并且不是左值。如果数组对象 已注册存储类,行为未定义 其他答案已经解释了这个问题。我试图用一些图表来解释它。希望这会有所帮助
当您声明数组时
int a[3] = {5, 4, 6}
内存安排看起来像
现在回答你的问题:
a
和&a
具有相同的值。如何设置李>
正如您所知,a
是数组类型,数组名a
成为指向数组a
的第一个元素(衰减后)的指针,即它指向地址0x100
。请注意,0x100
也是内存块的起始地址(数组a
)。你应该知道