指针
如果用const关键字修饰指针类型,被修饰的指针无法被重新赋值,也不能通过该指针来修改所指向的数据。
一、指针与数组
由黄色区域的代码可以看出,数组的内容是连续排列的,并且索引号最小的数在低字节。
由红框内的代码可以看出,数组地址为数组中第一个数据所在的地址。
下图蓝色区域的代码可以看出,sizeof应当是在编译的过程中得出了数组占用内存的大小,由于数组是整型的,16/4=4是数组内数据的个数。
1.&arry 和 arry 的区别
对于数值而言,两者是相同的。但是 &arry 指向的是整个数组, arry 指向的是数组中第一个元素的地址。如果对指针进行整数的加减操作时,前者以整个数组为颗粒度,后者以一个元素为颗粒度。
二、函数指针与指针函数
指针函数:本质是一个函数,返回值是指针。
函数指针:本质是一个指针变量,指向一个函数。
函数的地址可以用函数名来表示,如下图紫色区域所示,将func1函数的地址赋给函数指针func:
1.函数指针与指针数组
指针数组:本质是数组,数组里存储的是指针。
int *p1[5];
数组指针:本质是指针,指针变量指向数组。
int (*p2)[5];
以此类推,函数指针与指针数组结合后,本质是数组,数组中存储的指针指向函数。
通过数组中的指针调用函数,蓝色区域中第一条指令通过当前指令地址计算出数组第一个元素的地址为404039,强制对齐后为404040,接下来用call指令
调用此函数,并打印函数返回值:
数组不加参数只表示函数地址,加参数表示调用此函数,数组对应位置为函数返回地址:
三、指针使用注意事项
1.解引用未初始化的指针;
2.函数返回指向其内部局部变量的指针;
3.非指向同一数组内元素的两个指针之间的减法操作;
4.使用被释放的指针;
5.忘记释放指针;