一级指针:
理解:就是用来指向一个变量a的内存直接地址的变量,并能通过地址的解引用访问该变量a的值,在32位系统下,指针的大小一般都是4字节,在64位操作系统下为8字节,
二级指针:
理解:世界上本来没有二级指针,只不过一个指针指向了另外一个指针的地址,那么二级指针就出现了,同理多级指针也就是这么出现的。
指针和数组:
数组:是多个同类型数据的集合,在物理空间中存储是连续的,大小相同的空间。
指针:指针就是一个变量,它存储的是其他变量在内存中的位置。
当数组作为参数传递给函数时,会退化为指针。
理解:这本就是两种不同的概念,但有着千丝万缕的联系,一方面,我们可以通过指针来访问数组的元素,另一方面我们的数组名就是整个数组的首地址。
指针数组
int* p[10];
这就是指针数组的定义形式,指针数组本质就是一个数组,只不过数组的每一个元素都是指针。
举例:
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);
return 0;
}
这里面就有着指针数组,指针,数组,字符串,运算符优先级的考查知识。
这两张图解释了第一句( char *c[] = {“ENTER”,“NEW”,“POINT”,“FIRST”}; )指针数组的实质,即四个字符串的首地址放在同一个指针数组中保存。
这二级指针数组的实质,指向一个一级指针自身的地址并保存在数组。
这张图是 char**cp[] = {c+3,c+2,c+1,c}; 实质,要注意的是,指针的加减是加减一个类型,而不是地址加一!我们从这种图可以看到这个数组保存的是c数组中各元素的地址。
这是三级指针,指向了二级指针数组的首地址,即是 char***cpp = cp; 的实质
到这,这个题的准备工作完成了,下来我么只需要按图索骥即可
例如:printf("%s\n", **++cpp);
cpp -> 0xB00
_++ -> 0xB04
** -> 0xA08 -> 0x300 -> POINT
注意:++的优先级高于解引用
例如: printf("%s\n", –++cpp+3);
这里运算的先后顺序为:++ * – * +3
cpp ->0xB04
++ ->0xB08
*-> 0xA04
(- -)-> 0xA00
*-> 0x100
+3 -> ER
例如: printf("%s\n", *cpp[-2]+3);
cpp-> 0xB08
[-2] -> 0x400
*->FIRST
+3 ->ST
例如: printf("%s\n", cpp[-1][-1]+1);
cpp[-1] ->0xA08
cpp[-1][-1]->0x0x200
+1->EW