指针的指针理解

  1. #include <stdio.h>
  2.  
  3. int main(){
  4. int a =100;
  5. int *p1 = &a;
  6. int **p2 = &p1;
  7. int ***p3 = &p2;
  8.  
  9. printf("%d, %d, %d, %d\n", a,*p1,**p2,***p3);
  10. printf("&p2 = %#X, p3 = %#X\n",&p2, p3);
  11. printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n",&p1, p2,*p3);
  12. printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\n",&a, p1,*p2,**p3);
  13. return 0;
  14. }
100, 100, 100, 100
&p2 = 0X28FF3C, p3 = 0X28FF3C
&p1 = 0X28FF40, p2 = 0X28FF40, *p3 = 0X28FF40
 &a = 0X28FF44, p1 = 0X28FF44, *p2 = 0X28FF44, **p3 = 0X28FF44

 

以上三级指针p3为例来分析上面的代码,***p3等价于*(*(*p3)),  *p3得到的是 p2的值,也即 p1的地址;

**p3得到的是p1的值,也即a的地址,经过三次取值操作后,***a得到的才是a的值。

 

假设 a、p1、p2、p3 的地址分别是 0X00A0、0X1000、0X2000、0X3000,它们之间的关系可以用下图来描述:

方框里面是变量本身的值,方框下面是变量的地址。

void *malloc(size_t size),这个函数请求分配大小为size字节的内存,并返回指向该内存起始位置的指针

 

 二级指针的应用:

   看下面代码:有两个变量a,b,指针q,q指向a,我们想让q指向b,在函数里面实现

int a=10;

int b=100;

int *q;

void func(int *p)

{

    p=&b;

}

int main()

{

      q=&a;

      func(q);

     return 0;

}

最终的结构还是*q==a,并没有改变结果。

因为p 和q 都有自己的单元地址,p q 都指向a,调用函数之后,调用函数之后

只是改变了p单元存放的地址,并没有改变q单元存放的地址。

int a=10;

int b=100;

int *q;

void func(int **p)

{

   *p=&b ;

}

int main()

{

     q=&a;

     func(&q);

     return 0;

}

运行结果 *q=b;

因为函数在调用时较q的地址传递,

*p=q;同时也将q单元存放的地址改为&b

所以调用完函数后*q=b;


再看一个例子 内存分配

void my_malloc(char **s)

{

    *s=(char *)malloc(100);

}

void main()

{

    char *p=null;

    my_malloc(&p);

   if(p)

    free(p);

    *p=null;

}

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值