全部博文(161)
分类: LINUX
2011-05-05 18:57:06
char a[]="123456";
char *p = "abcdef"
*(p 4):先取出p里面存储的地址值,然后加4个sizeof(p)的偏移量
P[4]和A[4]都是把其解析为指针形式的操作。
*(a 4):a代表数组首元素的的首地址,加上4字符偏移量,然后取出其地址上的值
a与&a对于数组而言
a是数组首元素的首地址
&a是数组的首地址
&a 1:为去数组a的首地址,再加上sizeof(a)[整个a数组的大小]的值,也就是下一个数组的首地址
*(a 1):a与&a的值一样,但意思不一样,a是数组首元素的首地址,也就是a[0]的首地址,&a是数组的首地址,a 1是数组下一个元素的首地址,即是a[1]的首地址,&a 1是下一个数组的首地址
指针:
存储的内容:保存数据的地址,任何存入的指针变量p的数据都会被当做地址来处理,p本身的地址由编译器另外存储,存储在哪,我们并不知道。
访问数据的方式:间接访问数据,首先取得指针变量p的内容,把它作为地址,然后从这个地址提取数据或向这个地址写入数据。指针可以指针的现实访问*(p i)也可以下标的形式访问p[i],但本质都是先提取p的内容然后加上i*sizeof(类型)字节作为数据的真实地址。
常用于动态数据结构,通过malloc和free来分配删除,通常指向匿名或者具名数据
数组:
存储的内容:保存数据,数组名a代表的是数组的首元素的首地址,而不是数组的首地址,&a才是整个数组的首地址。a本身的地址由编译器另外存储,存储在哪,我们并不知道。
访问数据的方式:直接访问数据,数组名a是整个数组的名字,数组内每个元素没有名字。只能通过“具名 匿名”的方式来访问其中的某一元素,不能把数组当成一个整体来进行读写操作。数组可以指针的形式访问*(a i);也可以以下标的形式访问a[i],但本质都是a所代表的数组首元素的首地址加上i*sizeof(类型)字节作为数据的真正地址。
通常用于存储固定数目且数据类型相同的元素
隐式分配和删除,自身即为数组名;
sizeof(a)是整个数组的大小!
char a[5]={'A','B','C','D','E'};
char (*p3)[5] = &a;//类型一致
char (*p4)[5] = a;//等号两边数据类型不一致,左边类型是指向整个数组的指针,右边是指向当个字符的指针;
int a[5][5];
int (*p)[4];
p = a;
&p[4][4] - &a[4][4] = -4;
a[4]表示一维数组a的第五个元素
&a[4][2]表示:&a[0][0] 5*4*sizeof(int) 2*sizeof(int);
&p[4]表示&p[0]+4*4*sizeof(int)
p指向的数组,所以p被初始化为&a[0],所以&p[4][2]表示为&a[0][0]+4*4*sizeof(int)+2*sizeof(int);
所以两者相差四个int类型的元素。