1.一级指针
其实指针指的就是变量中内存地址,在32位中指针变量占4个字节,而在64位中占8位字节。
2.二级指针
二级指针就是指向一级指针所指向变量地址,他和一级指针所占内存字节数相同,所以,多级指针依次退出。
3.指针和数组
指针和数组其实并没有关系,但是在c中数组可以隐式类型转换为指针,也就间接产生关系,比如
arr[] = {1, 2, 3, 4};
其中 数组名arr 可理解为数组首元素地址。
而且数组还可以用指针表示
*p = arr;
p[0] = arr[0];
*p = a[0];
4.指针数组
指针数组就是数组中的元素为指针,也就是地址.
下面可以看一个例子:
#include <stdio.h>
#include <stdlib.h>
int main(){
char *c[] = { "ENTER", "NEW", "POINT", "FIRST"};
char **cp[] ={ c + 3, c + 2, c + 1, c};
char ***cpp = cp;
printf("%s\n", *++cpp);
printf("%s\n", *--*++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", *cpp[-1] [-1] + 1);
system("pause");
return 0;
}
一般做这种多级指针求值问题,可以画一张变量在内存中存储情况,之后这些问题一目了然。
看图可得到这几个指针数组在内存中的存储。
下来这个题就简单了。
printf("%s\n", *++cpp);
开始cpp 0xB00
++后 0xB04
*后 0xA08
*后 0x300
再用%s打印从当前地址出发直到遇到‘\0’。
所以输出 PIUNT
printf("%s\n", *--*++cpp + 3);
开始cpp 0xB04
++后 0xB08
*后 0xA04
--后 0xA00
*后 0x100
在 +3 为 0x103 (因为是字符类型为1字节)。
再用%s打印从当前地址出发直到遇到‘\0’。
所以输出 ER
printf("%s\n", *cpp[-2] + 3);
开始cpp 0xB08
[-2]地址减2后解引用
[-2]后 0xA0c
*后 0x400
在 +3 为 0x403 (因为是字符类型为1字节)。
再用%s打印从当前地址出发直到遇到‘\0’。
所以输出 ST
printf("%s\n", cpp[-1] [-1] + 1);
[-i] 不改变地址
开始cpp 0xB08
[-1] 后 0xA08
[-1] 后 0x200
+1 后 0x201 (因为是字符类型为1字节)。
再用%s打印从当前地址出发直到遇到‘\0’。
所以输出 EW
运行结果:
所以这种题只要会画变量在内存中的存储图,答案容易出来,在运用多级指针时,其实就是指针指着指针的地址,依次下去,想要调用上一级就解引用,想要同一级左右边就++,–。一定要看变量类型的字节数是多少。搞懂这一点多级指针就不太饶了。