学习交流可加

微信读者交流①群 (添加微信:coderAllen)

程序员技术QQ交流①群:736386324


恶名昭著的指针究竟是什么

“ 指针是一种保存变量地址的变量,在 C 中频繁地使用。”

“指针类型”其实不是单独存在的,它是由其他类型派生而成的

因为“指针类型”是类型,所以它和 int 类型、double 类型一样,也存在“指针类型变量”和“指针类型的值”。糟糕的是,“指针类型”、“指针类型变量”和“指针类型的值”经常被简单地统称为“指针”,所以非常容易造成歧义,这一点需要提高警惕*

注意:

先有“指针类型”。

因为有了 “指针类型”,所以有了“指针类型的变量 ”和 “指针类型的值”。

指针类型同样如此,既存在指针类型的变量,也存在指针类型的值

因此,几乎所有的处理程序中,所谓的“指针类型的值”,实际是指内存的地址

举个例子:

#include <stdio.h>

int main(void)
{
int hoge = 5;
int piyo = 10;
int *hoge_p; /*输出每个变量的地址*/
printf("&hoge..%p\n", &hoge);
printf("&piyo..%p\n", &piyo);
printf("&hoge_p..%p\n", &hoge_p); /*将hoge 的地址赋予hoge_p*/
hoge_p = &hoge;
printf("hoge_p..%p\n", hoge_p); /*通过hoge_p 输出hoge 的内容*/
printf("*hoge_p..%d\n", hoge_p); /*通过hoge_p 修改hoge 的内容*/
*hoge_p = 10;
printf("hoge..%d\n", hoge); return 0;
}

在我的环境下输出:

//Red Hat 4.4.7-17   gcc version 4.4.7
&hoge..0x7ffefe4950ac
&piyo..0x7ffefe4950a8
&hoge_p..0x7ffefe4950a0
hoge_p..0x7ffefe4950ac
*hoge_p..-28749652
hoge..10

因为存在“指针类型”,所以存在“指针类型的变量”和“指针类型的值”。这里输出的“地址”,是指“指针类型的值”

指针变量 hoge_p 保存了另外一个变量 hoge 的地址,我们认为“hoge_p 指向hoge“

变量不一定按照声明的顺序保存在内存中

在指针前面加上*,可以表示指针指向的变量

因为hoge_p 和 hoge 表示同一个事物,通过hoge_p 输出 hoge 的值之外,还可以赋值。在第 22 行,通将 10 赋给*hoge_p,修改了 hoge 的值。在第 23 行输出 hoge 的值,运行结果为 10。

总结:

对变量使用&运算符,可以取得该变量的地址。这个地址称为指向该变量的指针。

指针变量 hoge_p 保存了指向其他变量的地址的情况下,可以说“hoge_p 指向 hoge”。

对指针变量运用运算符,就等同于它指向的变量。如果 hoge_p 指向 hoge,hoge_p 就等同于 hoge

int *hoge_p;

似乎这里声明了一个名为*hoge_p 的变量,而实际上,这里声明的变量是hoge_p,hoge_p 的类型是“指向 int 的指针”。

int* a, b;

声明两个“指向int 的指针”?——其实不是printf("a = %p, b = %d\n",a, b);

int hoge[10];

这本身是不符合 “ 类型 变量名” 的的形式的(C语言就是这样乱的)

Java 在声明“int 的数组”时,通常写成 int[] hoge; 感觉更合理一些

关于main只有这两种形式

int main(int argc, char *argv[]) or int main(void)

更多精彩文章扫码关注 [ Allen有话说 ],专注于编程,职场,英语(外企)

最新文章

  1. Linux kernel 文件夹说明
  2. TortoiseSVN和VisualSVN-Server的配置使用,外网访问SVN版本库
  3. Android ORM 框架之 greenDAO 使用心得
  4. python学习历程之split()方法获取cmd mysql 结果集
  5. alert()、confirm()和prompt()的区别
  6. Java调用JavaScript
  7. RowDataBound事件
  8. Jquery scrollTop animate 實現動態滾動到頁面頂部
  9. ie6 7 8 9 firefox的css兼容问题
  10. W25Q32的使用
  11. &lt;php&gt;json小结
  12. DataTable数据转换为实体
  13. 候选键(unique)
  14. 中软卓越IT培训:给IT程序员的18个忠告
  15. EFI、UEFI、MBR、GPT的区别
  16. Leetcode解题-链表(2.2.6)RotateList
  17. Web前端-关于jQuerry
  18. A1082. Read Number in Chinese
  19. Writing A Better JavaScript Library For The DOM 阅读记录
  20. html5引擎开发 -- 引擎消息中心和有限状态机 - 初步整理 一

热门文章

  1. Ajax方式导出Excel,浏览器显示下载Excel表
  2. python2 手动安装更新pip
  3. vue install 组件
  4. shell基础知识6-在不按回车键的情况下读入N个字符
  5. SQL Server常用方法
  6. 【论文阅读】3DMM-A Morphable Model for The Synthesis of 3D Faces
  7. Centos7根据yum源安装指定版本docker
  8. git merge合并分支; already up to date 现象, merger算法
  9. python学习-32 zip函数
  10. SQL语句报错:Incorrect string value: &#39;\xE9\x98\xBF\xE6\x96\xAF...&#39;