C 指针的理解
来源:互联网 发布:美亚海淘宝宝用品清单 编辑:程序博客网 时间:2024/05/17 03:00
想想自己曾经学习C语言时,初次见到指针、地址,只能死记硬背,经过一段时间的软磨硬泡,终于有所收获,在此记录自己对C语言中地址、指针的理解。
推荐对C语言有一定理解的程序员阅读。
学习过C语言的程序员们,一定都知道“指针就是地址”的经典描述,到底如何理解指针就是地址。
1. 内存长成啥样?
物理内存条由连续排列芯片组构成,在计算机中内存模型也被抽象为一组连续的存储空间,每个空间都能够存储若干字节的数据,每一块存储空间也有一个特定的序号,从0到N。
备注:为了便于理解,此处,将内存存储空间横向排列(实际横纵排列的意义相同)。
2. 地址是什么?
变量的地址指的实际就是保存变量数据的内存节点序号。
int a = 10; //int 占用4个字节 printf("&a = %08X\n", &a); //打印a的地址 008DF70C
非常简单的一段代码,打印变量a的地址,008DF70C就是内存地址,也是存放数据的起始位置(内存序号),数值10就保存在008DF70C~008DF70F(共4个字节的内存空间),从下图就能直观的看出变量和地址的关系。
图中(蓝色)选中部分的数值0000000a,就是a的数值10的十六进制表示。前面7个0是因为存储的数值过小,数据高位被0填充。
3. 指针是什么?为什么说指针就是地址?两者之间的关系是什么?
指针也是变量,不过是与普通的数据类型(int, long, float, double等)不同的变量,因为指针的值记录的是相同类型变量的地址(内存序号)。
int a = 10; //int 占用4个字节 printf("&a = %08X\n", &a); //打印a的地址005DF740 int *p = &a; //让int*类型的指针p指向int类型变量a的地址 printf("*p = %08X\n", *p); //打印指针p指向的值,10 printf("p = %08X\n", p); //打印指针p指向的地址,005DF740 printf("&p = %08X\n", &p); //打印p的地址,005DF734
代码中定义int类型指针p,初始化指向变量a的地址,并打印p指向地址的值,p的值,以及p的地址。结合下图,可以看出,p的值与a的地址相同(废话,初始化代码都已经知道了 v_v),通过下图可以看出p和&a是同一个地址空间005DF740,记录的值是10。
既然说指针也是变量,指针的地址记录的是什么呢?一起接着看下面这张截图。
图中,查看p的地址(&p),在005DF734~005DF737的地址(内存序号)中保留的数值经过高低位转换(40 F7 5D 00 -> 005DF740),正是变量a的地址。由此可见,指针是记录内存地址的“特殊”变量。
指针就是地址,其实是指平时使用指针过程中,指针变量记录的就是地址,如例子中的int指针p,直接打印的结果就是指向a的地址,如果想获得指向地址的值,需要使用*。
指针指向一块保存变量的地址。
仔细看图的读者会发现,指针存储空间也是4个字节。可以用sizeof()打印指针的长度确认一下,等长的存储空间是任意转换指针类型的基础。
每个人对C指针的理解都有差别,我希望我的理解能对初学新手带来一点点帮助。文中有很多漏洞和不足,望大家提出。
- C 指针的理解
- C 指针的理解
- C 指针的理解
- C 指针的理解
- C 指针的理解
- C 指针的理解
- C指针的理解
- C++this指针的理解
- c中的指针的理解
- 理解c语言的指针
- C++this指针的理解
- c指针的一些理解
- 20170428 C指针的理解
- c语言指针的理解
- 对C的指针的理解
- 深入理解C语言指针的奥秘- -- -
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 【CentOS 7】 Vim 配置文件
- java程序员学C#基本语法两个小时搞定(对比学习)
- hdu1159 Common Subsequence(LCS)
- 按照标题拆分子文档
- spark sql介绍
- C 指针的理解
- notepad++替换notepad
- 项目管理中常用到的简便工具
- leetcode Reverse Integer
- HTML-字体标签
- 查找第n个数
- 重载的操作符成员函数与非成员函数
- DevExpress VCL for C++BUILDER XE6
- 关于1ul 1l 1u 的理解也许有不对的