(C)指针与数组 的那些事
要清楚指针和数组,必须清楚三个问题:
- 什么是指针?
- 什么是数组?
- 指针和数组之间的联系?
- 数组:根据元素个数和元素类型,开辟一段连续的空间,以一个标识符来标识这段空间
-
指针:用来存储地址的数据类型。32位下为4字节,64位下为8字节
一、指针与数组的区别:
1、把数组作为参数传递的时候,会退化成指针
2、数组名可作为指针常量 ,例如 :
会编译出错,数组名可以转换为指向其指代实体的指针,但是它只能被看作一个指针常量,不能被修改。
3、数组和指针的内存分配:
数组是开辟一段连续的存储空间,数组本身的标识符代表整个数组,可以用sizeof求取其真实大小,
指针是只分配一个指针大小的内存,并可把他的值指向一个有效的内存空间二、指针和数组的联系:
1.访问指针
char *p = “abcdef”; 读取字符e
以指针形式: * (p+4),先取出p里存储的地址值,然后加上4个字符的偏移量,p+4位e的地址。*(p+4)就读取了e
-
以下标的形式:
p[4] ,以下标的形式访问在本质上与以指针的形式访问没有区别,只是写法上不同罢了2.访问数组:
char a[] = “123456”
以指针的形式:
*(a+4) , a为数组首元素的地址,加上4字节的偏移量以下标的形式:
a[4] , a 为数组首元素的首地址,加上中括号中 4 个元素的偏移量
三、&a[0]和&a的区别:
a[0]是一个元素,a是整个数组,虽然值一样,但意义不一样,&a[0]代表数组首元素的地址,&a是整个数组的首地址,例子:湖南的省*在长沙,而长沙的市*也在长沙。两个*都在长沙,
&a + 1: 表示下一个数组的首地址
a+1:表示数组下a[1]的地址
地址计算:
char a[]=”abcdef”
假设首地址为0x9fff0
五、指针和数组特性总结:
六、指针数组和数组指针:
- 指针数组:
首先它是一个数组,数组的元素都是指针,数组占多少字节有数组本身决定 - 数组指针:
首先它是一个指针:它指向一个数组,32位占4字节,64位占8字节,他指向的数组占多少不知道
七、二维数组:
可以想成一个以为数组,每个元素里存储一个数组
char a[3][4];
- 地址计算
a[i]的首地址为 :& a[0]+ i*sizof(char)*4。
a[i][j]的首地址为:&a[i]+j*sizof(char)
a[i][j]元素的首地址为:a+ i*sizof(char)4+ j*sizof(char)。也可表示为(*(a+i)+j)
例如:
int a[5][5];
&a[4][2]=&a[0][0]+4*5*sizeof(int) + 2*sizeof(int)
详细内容请看《C语言深度解剖》
注:图片都来自《C语言深度解剖》
上一篇: NSDictionary