`
蒙面考拉
  • 浏览: 161098 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

指针深究

 
阅读更多

在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例:

1. 指向整型指针

先看如下示例:

View Code
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int a = 5;
 7     int * p = &a;
 8     cout << "a  = " <<  a << endl
 9          << "&a = " << &<< endl 
10          << "*p = " << *<< endl 
11          << "p  = " << p << endl 
12          << "&p = " << &<< endl;
13 
14     return 0;
15 }
复制代码

运行结果如下:

我们先看下内存分配图:

由上图可以清楚的知道,输出整形变量a的值是5,指针变量p的值是001BFD18,而*号的作用是取值,*p即取地址001BFD18中存放的值,即5。

2. 指向字符型指针

先看如下示例:

View Code
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char a[] = "hello";
 7     char *= a;
 8 
 9     cout << "p = " << p << endl
10          <<"p = " << (void *) p << endl
11          << "*p = " << *<< endl;
12         
13         
14     for(int i = 0 ; i < 5; i++)
15     {
16         cout << "&a[" << i << "] = "<< (void *)&a[i] << endl;
17     }
18     return 0;
19 }
复制代码

运行结果图如下:

为什么整型指针p输出的是地址,而字符型指针输出的是字符串呢,字符型指针里存放的不是地址吗?

我们先看下内存分配图:

由上图可以看出,其实p中存放的是地址,只是当cout时,如果指针是字符型指针,那么会输出p中地址指向的内存中的内容(这里是h)直到遇到'\0'才结束。所以直接输出p时会输出hello,而将p强制转换为void *时输出的是地址。

3. 指向整型指针的指针

先看如下示例:

View Code
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int a[5= {12345};
 7     int *= a;
 8     int **point = &p;
 9 
10     cout << "a = " << a << endl
11         << "p = " << p << endl
12         << "&p = " << &<< endl
13         << "point = " << point << endl
14         << "&point = " << &point << endl;
15 
16     for (int i = 0; i < 5; i++)
17     {
18         cout << "&a[" << i << "] = " << &a[i] << endl;
19     }
20     return 0;
21 }

运行结果图如下:

我们先看下内存分配图:

从上图可以看出point指针中存放的是p指针的地址,而p指针中存放的是a[0]的地址。所以*point和p是一样的,前者是取point指针中存放的地址(0025F754)中的值,即取地址0025F754中存放的值(0025F760),而后者就是0025F760,所以两者是等价的。**point和a[0]是等价的,前者可以写成*p,*p是取p中存放的地址(0025F760)中的值,即地址0025F760中存放的值1。由上可以得出*point等于p, **point 等于 a[0]。通过上图可以清晰的对付诸如*point++等问题。

4. 指向字符串指针的指针

先看如下示例:

 

View Code
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char *a[] = {"Wel""To""China"};
 7     char **= a;
 8     for(int i = 0; i < 3; i++)
 9     {
10         for (int j = 0; j < strlen(a[i]) + 1; j++)
11         {
12             cout << a[i][j] << "\t" << (void *)&a[i][j] << endl;
13         }
14         cout << endl;
15     }
16     
17     for (int i = 0; i < 3; i++)
18     {
19         cout << "a[" << i << "] = " << (void *) a[i] << endl
20              << "&a[" << i << "] = " << &a[i] << endl;
21     } 
22 
23 
24     cout << "p  = " << p << endl
25          << "&p = " << &<< endl;
26     return 0;
27 }

 

运行结果图如下:

我们先看下内存分配图:

由上图可以看出a[0]中存放着'W'的地址,a[1]中存放着'T'的地址,a[2]中存放着'C'的地址,只是这些地址都是指向字符型的,所以直接cout的会输出字符串,而指针p中存放着a[0]的地址,所以*p等于a[0],都是获得'W'的地址,即00A778CCC,而**p和a[0][0]等价都获得了地址00A778CCC中存放的值W。由上图我们可以看到字符地址相隔1个字节,而指针地址相隔4个字节,这样就便于++运算,获得下一个地址了,列如++p后,p就指向a[1],p中存放的是a[1]的地址。

分享到:
评论

相关推荐

    C语言外挂编写深究相关

    这就涉及到内存地址、指针和内存管理的知识。理解如何安全有效地进行内存操作,避免内存泄漏或崩溃,是编写稳定外挂的关键。 此外,我们还需要学习如何实现钩子技术。钩子是一种监视系统事件的技术,通过安装钩子...

    深究标准IO的缓存

    关于FILE的定义和运作,它是标准I/O库内部使用的结构体类型,包含了文件描述符、指向缓冲区的指针、缓冲区长度、文件指针位置、错误状态等信息。程序员在使用标准I/O函数时,通常是通过FILE*类型的指针操作具体的...

    RHCE技术培训-Linux文件系统深究.pptx

    另一方面,符号链接(软链接)类似于Windows系统中的快捷方式,它是一个指向其他文件的指针。符号链接有自己的inode和文件名,但内容仅包含目标文件的路径。使用`ln`命令创建符号链接,例如`ln -s 目标文件 链接名`...

    详解C++引用

    【C++ 引用详解】 C++中的引用是一种特殊的变量,它并不是一个新的数据类型,而是已存在变量的别名。引用一旦初始化后,就不能再改变...在实际编程中,开发者应主要关注引用如何使用,而不是过于深究其底层实现细节。

    科大C语言每章节上机试题

    《科大C语言每章节上机试题解析与深入探讨》 C语言,作为一种基础且强大的编程语言,被广泛应用于...对于每一个题目,不仅要追求正确答案,更应深究其背后的原理,以便在未来面对更为复杂的编程挑战时能游刃有余。

    embedded C and C

    2. **C++中的extern "C"含义深究**: 在C++中,extern "C"用于告诉编译器按照C语言的规则处理特定的函数和变量,因为C++支持名字修饰(name mangling),而C语言则不支持。这对于在C++程序中调用C库或使C++代码与C...

    C语言数组和指针的问题一道非常值得深思的笔试题

    谁都不敢说自己的C/C++能有多精通,当然,工作一久,很多老毛病也就容易犯了,所以说,理论是真的很重要的,下面这道题,说实话还是挺基础的,虽然当时笔试被我给猜对了,但还是要深究一下具体的转换细节。...

    从汇编看C++系列前4篇

    当遇到较大较复杂的编程任务时,用 C 就会比较吃力,这个时候就应该使用 C++,因此有必要对 C++ 再深究一下。从汇编角度研究 C++,能看到最彻底最本质的东西,学习效果也最好,也更容易看清C++面向对象的底层实质。...

    03-KeilSTM32F1xx相关库文件

    启动文件负责微控制器上电后的初始化,如设置堆栈指针和系统时钟等。内核相关文件涉及中断和异常处理等与内核相关的内容。外设驱动文件针对 GPIO、USART、SPI、I2C 等各种外设提供驱动函数和配置参数。 其功能特点...

    非计算机专业的C语言程序设计教学实践.pdf

    例如,在指针的教学上,不必让学生深入理解复杂的指针概念,通过简单的案例和形象的比喻,帮助他们掌握指针的基本使用就已足够。对于递归这一复杂概念,让学生理解其核心思想,即问题的递归转化和终止条件,而不是...

    嵌入式经典面试题嵌入式经典面试题

    因此,嵌入式系统的面试题目往往深究基础概念和编程实践能力,下面将详细解释在嵌入式系统开发中常见的经典面试题目。 1. 预处理指令#define的使用与注意事项 在C语言中,#define预处理指令用于创建宏定义,可以...

    c程序设计语言清晰中文版

    该书旨在通过实际的程序实例来引导读者逐步掌握C语言的基本元素,而不深究语言的每一个细节和技术层面。在第一章中,作者首先介绍了C语言的基础概念,包括变量、常量、算术运算、控制流、函数和基本的输入/输出操作...

    高级语言程序设计

    高级语言如C、Java、Python等,提供了更为人性化的语法,使得程序员可以更专注于逻辑和算法,而无需深究底层机器语言的细节。 C语言,作为压缩包子文件中的重点,是高级语言程序设计中的经典代表。由Dennis Ritchie...

    计算机等级考试C语言考试经验

    5. 数组和指针:这两个概念极其灵活,需要深入理解和应用,特别是字符串和数组指针的交互。 总的来说,学习C语言需要耐心和毅力,不断地实践和总结,形成良好的编程习惯。通过针对性的复习和大量的上机练习,能够...

    ATL介绍(潘爱民)

    1. **智能指针**:ATL引入了智能指针的概念,如CComPtr和CComQIPtr,这些指针可以自动管理COM对象的引用计数,避免了常见的内存泄漏问题。 2. **类型安全的宏**:提供了如 STDMETHOD 和 STDMETHODIMP 这样的宏,它们...

    总结IOS中nil、Nil、NULL和NSNull区别

    这就是在 C/C++ 中的空指针。 在 C 语言中, NULL 是无类型的,只是一个宏,它代表空。我们不研究 C++ 中的 NULL ,因为在 C++11 以后又有了新的定义,我们不深究。 这就是 C 语言中所谓的 NULL ( C++ 的定义比较...

    人教五年级数学下册旋转PPT学习教案.pptx

    ”学生在学习旋转时,不应仅仅停留在记忆和应用规则的层面,而应深究旋转背后的原理,通过不断的思考和实践来深化对概念的理解。这种教学理念鼓励学生主动探索,激发他们的学习兴趣和创新思维。 本课程的目标不仅是...

    多类型数据库存储及访问实现-数据库理论-计算机.pdf

    这样的设计可以大大简化数据库操作的复杂性,使程序员不必深究各种数据库访问技术的细节,而是将精力集中在业务逻辑的实现上。同时,该接口技术可以轻松地应用于不同的应用软件系统,极大地提高了代码的复用性和可...

    lvglImgTool

    LVGLImgTool的使用有助于简化嵌入式GUI开发流程,让开发者可以专注于设计美观、用户友好的界面,而不必深究底层图像处理的细节。同时,由于LVGL库本身具有跨平台和高度可定制的特点,因此,LVGLImgTool也适用于各种...

    上思2020年事业编招聘考试真题及答案解析可复制版.docx

    13. 括号内的句子可能是在讨论人们对于自然世界认识的局限,即只看表面而不深究本质。 14. 题目将“闹钟”与“指针”关联,表明它们在功能上的对应,如同时间指示工具。 这些题目覆盖了法律、医学、哲学、文化、...

Global site tag (gtag.js) - Google Analytics