C语言学习第20篇---指针的本质剖析

举报
CodeAllen 发表于 2021/10/30 00:06:11 2021/10/30
【摘要】 知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取   *号的意义 在指针声明时,*号表示所声明的变量为指针 在指针使用时,*号表示取指针所指向的内存空间中的值   我将其理解为“钥匙”,如图 &n...

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取

 

*号的意义

在指针声明时,*号表示所声明的变量为指针

在指针使用时,*号表示取指针所指向的内存空间中的值

 

我将其理解为“钥匙”,如图

 

实例1:指针使用


  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. int* pI;
  6. char* pC;
  7. float* pF;
  8. pI = &i;
  9. *pI = 10;
  10. printf("%p, %p, %d\n", pI, &i, i);
  11. printf("%d, %d, %p\n", sizeof(int*), sizeof(pI), &pI);
  12. printf("%d, %d, %p\n", sizeof(char*), sizeof(pC), &pC);
  13. printf("%d, %d, %p\n", sizeof(float*), sizeof(pF), &pF);
  14. return 0;
  15. }

传值调用和传址调用

  • 指针是变量,因此可以声明指针参数
  • 当一个函数体内部需要改变实参的值,则需要使用指针参数(很多新手容易在这里犯错误)
  • 函数调用时实参值将复制到形参
  • 指针适用于复杂数据结构作为参数的函数中

实例2:利用指针交换变量


  
  1. #include <stdio.h>
  2. int swap(int* a, int* b)
  3. {
  4. int c = *a;
  5. *a = *b;
  6. *b = c;
  7. }
  8. int main()
  9. {
  10. int aa = 1;
  11. int bb = 2;
  12. printf("aa = %d, bb = %d\n", aa, bb);
  13. swap(&aa, &bb);
  14. printf("aa = %d, bb = %d\n", aa, bb);
  15. return 0;
  16. }

 

常量与指针 (这个意思是说怎么分辨是指针还是常量)

方法是:左数右指

当const出现在*号左边时指针指向的数据为常量

当const出现在*后右边时指针本身为常量

 

实例3:常量与指针分析


  
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. const int* p1 = &i;
  6. int const* p2 = &i;
  7. int* const p3 = &i;
  8. const int* const p4 = &i;
  9. *p1 = 1; // compile error
  10. p1 = NULL; // ok
  11. *p2 = 2; // compile error
  12. p2 = NULL; // ok
  13. *p3 = 3; // ok
  14. p3 = NULL; // compile error
  15. *p4 = 4; // compile error
  16. p4 = NULL; // compile error
  17. return 0;
  18. }

 

小结:

  • 指针是C语言中一种特别的变量
  • 指针所保存的值是内存的地址
  • 可以通过指针修改内存中的任意地址的内容

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/80439812

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。