指针理解

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

运行结果:
在这里插入图片描述
所以这种题只要会画变量在内存中的存储图,答案容易出来,在运用多级指针时,其实就是指针指着指针的地址,依次下去,想要调用上一级就解引用,想要同一级左右边就++,–。一定要看变量类型的字节数是多少。搞懂这一点多级指针就不太饶了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值