原创 数组、指针

2012-9-17 17:30 1371 14 14 分类: 软件与OS 文集: C语言深度解剖

 

  1.  

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的值应该是一样的,但代表不同的意义。

 

1.jpg
  1.  

a不能作为左值,不能操作整个数组,只能通过数组元素(a)赋值。

a作为右值时代表数组首元素a[0]的首地址,不是数组的首地址。

  1. 指针

int * p = NULL;//p变量的值是0x00000000,指针变量初始化,在编译时进行

*p = NULL;//p指向的内存中存的值是0x00000000,计算在运行时进行

  1. 对指针的加1操作,得到的是下一个元素的地址,不是在原有地址上直接加1,所以一个类型为T的指针的移动,是以sizeof(T)为单位移动的。
  2. 定义int a[5];

a, &a[0], &a的区别,a+1, &a[0]+1, &a+1的区别。

  1. :作为右值,表示数组首元素的首地址,与&a[0]的意义一样。
  2. :表示取整个数组的首地址。

a+1:表示移动一个元素,即得到a[1]的地址,与&a[0]+1意义一样,加1表示移动一个元素。

&a+1:表示移动一个数组长度,即得到下一个数组的地址。整个数组的首地址移动sizeof(a)的值,即&a+5*4。得到下一个数组首地址,指向a[5]。

  1. 例子

#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。

 

2.jpg

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]。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
14
关闭 站长推荐上一条 /3 下一条