您的位置:首页 > 其它

指针与数组

2014-04-30 18:22 113 查看
指针与数组:

关于今晚突然想到的一些问题:

虽然一维数组与指针的操作方式大部分相同,但是指针与数组存在本质的不同,二维以上数组与指针存在着更大的不同。

int *p

int
p[10]

指针p,与数组名p都可以为数组第一个元素的地址(编译时添加的类型都为int型指针)(C语言中的一个指针的值(无论他是指向一个整数、一个结构或是某个其他程序对象)都是某个存储块的第一个字节的虚拟地址。c编译器把每个指针和类型联系起来,根据指针值的类型生成不同机器级代码访问存储在指针所指向位置处的值。c编译器维护类型信息,但是生成的实际极其程序并不包含关于数据类型信息)。

从概念上说,数组(多元素)是内存上一段数据的集合,指针则是一个内存地址上存着的另一个数据(表示地址的数据)。

数组名不能进行自加操作,因为编译器编译后其就是一个地址,地址是一个常量,自然无法自加,

而指针则是一个地址中存储的数据(表示地址的数据),数据是可以复制到寄存器并通过寄存器进行相应操作的。

对于元素操作层面,都是数组名(首元素地址,也是指针的数值)加上相应的地址偏移,从而得到元素地址。
"012345"
(n为以确定的整数),
"012345"是一个字符串常量,其值是第一个字符所在地址,所以和数组一样,可以进行和数组一样的操作,同样不能进行自加或自减操作。

int **p int
p[10][10]

指针的指针p中存储着一个数据(是一个地址,也就是&*p),*p中依然是一个数据(是一个地址,也就是&**p,这个地址存储着一个整型值),**p便是最终地址存储的整形值。

二维数组名p指向的是一个数组元素为拥有10个整型元素的数组的数组(值为p[0][0]的地址),p
(0<=n<10)的值为p
中第一个元素的地址。

虽然指针p与二维数组名p的值可以相同,但是编译器所添加的指针类型是不一样的,所以不能等同。

而*p与p
(0<=n<10)则回到了一维数组的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: