`
蒙面考拉
  • 浏览: 160645 次
  • 性别: 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程序设计语言清晰中文版

    该书旨在通过实际的程序实例来引导读者逐步掌握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++ 的定义比较...

    lvglImgTool

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

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

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

    c/c++面試精髓題

    通过以上分析,我们可以了解到,即使是最基础的字符串操作函数,其背后的原理和细节也是值得深究的。面试题的设计旨在检验面试者对C/C++语言的理解深度和解决问题的能力,而不仅仅是语法知识。因此,扎实的基础和...

    java经典面试题集锦

    str.equals(""))`,当`str`为`null`时,`str.equals()`不会执行,避免了空指针异常。另一方面,`&`始终会评估两个表达式,即使左侧为假,这在需要同时检查两个条件或者进行位运算时(例如按位与)是有用的。 Java并...

    dllforvc.dll(dll动态链接库,通过串口发送、接收短消息)

    3. **调用函数**:根据函数指针调用相应的串口操作函数,如`OpenSerialPort()`打开串口,`SendData()`发送数据,`ReceiveData()`接收数据,`CloseSerialPort()`关闭串口。 4. **错误处理**:在每个函数调用后检查...

    浙工大研究生考试845C++历年真题(2012-2018)

    1. **基础语法**:包括变量、数据类型、运算符、流程控制语句(如if-else、switch-case、for、while)、函数定义与调用、数组、指针等基础知识。 2. **面向对象编程**:C++的核心特性之一,考生需掌握类的定义、...

Global site tag (gtag.js) - Google Analytics