您的位置:首页 > 编程语言 > C语言/C++

c语言深度剖析笔记5

2016-10-21 11:17 330 查看
2016.8.27 DAGE

复习内容:c语言深度剖析笔记5

a.指针&数组

1.指针

int *p = NULL;  //表示把这个指针置为0,NULL在C语言里面被宏定义为0,不是指针指向的内容*p为0,而是这个地址p为0
int *p = (int *)0x123456;   //如果要修改某个地址的内容,将这个地址赋值给一个指针时要强制转换类型,也可以*(int *)0x123456 = 245;
指针就是表示一个地址

一个指针变量p,p[4]这个操作会被解析成:先取出 p 里存储的地址值,然后加上中括号中 4 个元素的偏移量,计算出新的地址,然后从新的地址中取出值。也就是说以下标的形式访问在本质上与以指针的形式访问没有区别,只是写法上不同罢了。
就类似于*(p+4)
注意偏移的是元素而不是byte

char *p = "abcdef";这儿的字符串大小为7byte,放在内存的静态区,不能被改变
此时的p保存的是这个字符串的首地址*p = 'a';


2.数组

int a[5];
求sizeof(a[5])也会求出为4, sizeof 是关键字不是函数。函数求值是在运行的时候,而关键字 sizeof 求值是在编译的时候。
虽然并不存在a[5]这个元素,但是这里也并没有去真正访问 a[5],而是仅仅根据数组元素的类型来确定其值。所以这里使用 a[5]并不会出错。

a+1和&a+1
a 是数组首元素的首地址,也就是 a[0]的首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即 a[1]的首地址,&a+1 是下一个数组的首地址。
即&a+1是a[MAX]的首地址


3.区别

访问数据:
指针:间接访问数据, 首先取得指针变量 p 的内容, 把它作为地址,然后从这个地址提取数据或向这个地址写入数据。
指针可以以指针的形式访问*(p+i); 也可以以下标的形式访问 p[i]。
但其本质都是先取 p 的内容然后加上i*sizeof(类型)个 byte 作为数据的真正地址。
数组:直接访问数据,数组名 a 是整个数组的名字,数组内每个元素并没有名字。
只能通过“具名+匿名”的方式来访问其某个元素,不能把数组当一个整体来进行读写操作。
数组可以以指针的形式访问*(a+i);也可以以下标的形式访问 a[i]。
但其本质都是 a 所代表的数组首元素的首地址加上 i*sizeof(类型)个 byte 作为数据的真正地址。


4.指针数组和数组指针

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在 32 位系统下永远是占 4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。

int *p[4];  一个指针数组,因为[]优先级高于*,先定义为一个有4个元素的数组,int *修饰的是这个数组元素的类型
int (*p)[4];一个数组指针,先定义为了一个指针,指针指向一个4个int数据的数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: