热度 14
2012-9-17 17:30
1372 次阅读|
0 个评论
int *a; //a是一个地址,在32位系统下占4个字节空间 int a ; printf("\n%d\n",sizeof(a));//名字a表示整块内存的名字,4*100 printf("%d\n",sizeof(a ));//并不出错,sizeof是关键字,关键字求值是在编译的时候,不想函数求值,在运行的时候。此处虽然不存在a 这个元素,但这里没有真正访问a ,而是仅仅根据数组元素类型确定其值。 printf("%d\n",sizeof(a));//数组a的首地址 printf("%d\n",sizeof(a ));//数组元素a 的首地址,它与a的值应该是一样的,但代表不同的意义。 a不能作为左值,不能操作整个数组,只能通过数组元素(a )赋值。 a作为右值时代表数组首元素a 的首地址,不是数组的首地址。 指针 int * p = NULL;//p变量的值是0x00000000,指针变量初始化,在编译时进行 *p = NULL;//p指向的内存中存的值是0x00000000,计算在运行时进行 对指针的加1操作,得到的是下一个元素的地址,不是在原有地址上直接加1,所以一个类型为T的指针的移动,是以sizeof(T)为单位移动的。 定义int a ; a, a , a的区别,a+1, a +1, a+1的区别。 :作为右值,表示数组首元素的首地址,与a 的意义一样。 :表示取整个数组的首地址。 a+1:表示移动一个元素,即得到a 的地址,与a +1意义一样,加1表示移动一个元素。 a+1:表示移动一个数组长度,即得到下一个数组的地址。整个数组的首地址移动sizeof(a)的值,即a+5*4。得到下一个数组首地址,指向a 。 例子 #include stdio.h void main() { int a = {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 ,它是在a的值(与a的地址相同)的基础上加上5* sizeof(int)=20,所以得到a+1的地址为0x002af7d4+0x14=0x002af7e8。ptr-1指向a 。可以看到当改变a 的值时,a+1的第一个元素的值也跟着改变,因为a+1指向a 。