int *a; //a是一个地址,在32位系统下占4个字节空间
int a[100];
printf("\n%d\n",sizeof(a));//名字a表示整块内存的名字,4*100
printf("%d\n",sizeof(a[100]));//并不出错,sizeof是关键字,关键字求值是在编译的时候,不想函数求值,在运行的时候。此处虽然不存在a[100]这个元素,但这里没有真正访问a[100],而是仅仅根据数组元素类型确定其值。
printf("%d\n",sizeof(&a));//数组a的首地址
printf("%d\n",sizeof(&a[0]));//数组元素a[0]的首地址,它与&a的值应该是一样的,但代表不同的意义。
a不能作为左值,不能操作整个数组,只能通过数组元素(a)赋值。
a作为右值时代表数组首元素a[0]的首地址,不是数组的首地址。
int * p = NULL;//p变量的值是0x00000000,指针变量初始化,在编译时进行
*p = NULL;//p指向的内存中存的值是0x00000000,计算在运行时进行
a, &a[0], &a的区别,a+1, &a[0]+1, &a+1的区别。
a+1:表示移动一个元素,即得到a[1]的地址,与&a[0]+1意义一样,加1表示移动一个元素。
&a+1:表示移动一个数组长度,即得到下一个数组的地址。整个数组的首地址移动sizeof(a)的值,即&a+5*4。得到下一个数组首地址,指向a[5]。
#include <stdio.h>
void main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
while(1);
}
结果为2,5。
a的地址为0x002af7d4,a+1表示下一个元素的地址,因为a是整形数据,所以在a的地址上加上sizeof(int)=4,得到0x002af7d8。而&a+1表示下一个数组的地址,指向的是a[5],它是在&a的值(与a的地址相同)的基础上加上5* sizeof(int)=20,所以得到&a+1的地址为0x002af7d4+0x14=0x002af7e8。ptr-1指向a[4]。可以看到当改变a[5]的值时,&a+1的第一个元素的值也跟着改变,因为&a+1指向a[5]。
文章评论(0条评论)
登录后参与讨论