指针的理解

一级指针:

理解:就是用来指向一个变量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
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值