数组名、数组地址、数组首字节地址之间的关系
程序员文章站
2022-06-24 20:49:53
定义一个数组
int a[5] = {0};
此处a的类型看似为整个数组,实际上该数组名a为一个常量指针,也就是数组第一个元素a[0]的地址,同理a+1为第二个元素a[1]的地址。在上例中,数组...
定义一个数组
int a[5] = {0};此处a的类型看似为整个数组,实际上该数组名a为一个常量指针,也就是数组第一个元素a[0]的地址,同理a+1为第二个元素a[1]的地址。在上例中,数组名的类型就是指向int类型的常量指针,该值不可修改。 but! but! but!在数组名作为sizeof操作符或者单目操作符&的操作数时数组名a不作为常量指针,对数组名&a实际得到的是数组的首地址,其值在数值上与a、&a[0]相同,但含义不同,&a+1实际已经增加了整个数组的长度。
#include int main(int argc, char *argv[]) { int a[5] = {0}; printf("a = %p\n", a); printf("a + 1 = %p\n", a + 1); printf("&a = %p\n", &a); printf("&a + 1= %p\n", &a + 1); printf("&a[0] = %p\n", &a[0]); printf("a[0] = 0x%x\n", a[0]); printf("sizeof(a) = %d\n", sizeof(a)); printf("sizeof(&a) = %d\n", sizeof(&a)); return 0; }
结果:
a= 0xbf840eac //首元素地址 a + 1 = 0xbf840eb0 &a = 0xbf840eac //数组首地址 &a + 1 = 0xbf840ec0 //(&a+1) - (a) = 0x14 = 20 = 5*sizeof(int) &a[0] = 0xbf840eac //取首元素地址 a[0]= 0x0 sizeof(a) = 20 sizeof(&a) = 4
下一篇: C语言程序设计练习之2011 多项式求和