C语言中指针是什么?
学习交流可加
微信读者交流①群 (添加微信: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有话说 ],专注于编程,职场,英语(外企)
最新文章
- Linux kernel 文件夹说明
- TortoiseSVN和VisualSVN-Server的配置使用,外网访问SVN版本库
- Android ORM 框架之 greenDAO 使用心得
- python学习历程之split()方法获取cmd mysql 结果集
- alert()、confirm()和prompt()的区别
- Java调用JavaScript
- RowDataBound事件
- Jquery scrollTop animate 實現動態滾動到頁面頂部
- ie6 7 8 9 firefox的css兼容问题
- W25Q32的使用
- <;php>;json小结
- DataTable数据转换为实体
- 候选键(unique)
- 中软卓越IT培训:给IT程序员的18个忠告
- EFI、UEFI、MBR、GPT的区别
- Leetcode解题-链表(2.2.6)RotateList
- Web前端-关于jQuerry
- A1082. Read Number in Chinese
- Writing A Better JavaScript Library For The DOM 阅读记录
- html5引擎开发 -- 引擎消息中心和有限状态机 - 初步整理 一
热门文章
- Ajax方式导出Excel,浏览器显示下载Excel表
- python2 手动安装更新pip
- vue install 组件
- shell基础知识6-在不按回车键的情况下读入N个字符
- SQL Server常用方法
- 【论文阅读】3DMM-A Morphable Model for The Synthesis of 3D Faces
- Centos7根据yum源安装指定版本docker
- git merge合并分支; already up to date 现象, merger算法
- python学习-32 zip函数
- SQL语句报错:Incorrect string value: &#39;\xE9\x98\xBF\xE6\x96\xAF...&#39;