在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例:
1. 指向整型指针
先看如下示例:
运行结果如下:
我们先看下内存分配图:
由上图可以清楚的知道,输出整形变量a的值是5,指针变量p的值是001BFD18,而*号的作用是取值,*p即取地址001BFD18中存放的值,即5。
2. 指向字符型指针
先看如下示例:
2 using namespace std;
3
4 int main()
5 {
6 char a[] = "hello";
7 char *p = a;
8
9 cout << "p = " << p << endl
10 <<"p = " << (void *) p << endl
11 << "*p = " << *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. 指向整型指针的指针
先看如下示例:
2 using namespace std;
3
4 int main()
5 {
6 int a[5] = {1, 2, 3, 4, 5};
7 int *p = a;
8 int **point = &p;
9
10 cout << "a = " << a << endl
11 << "p = " << p << endl
12 << "&p = " << &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. 指向字符串指针的指针
先看如下示例:
2 using namespace std;
3
4 int main()
5 {
6 char *a[] = {"Wel", "To", "China"};
7 char **p = 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 = " << &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]的地址。
发表评论
-
set容器的反向迭代器
2013-05-02 16:56 3755#include <iostream> #in ... -
对于CRITICAL_SECTION用法的介绍和理解[转]
2013-04-08 11:50 2191很多人对CRITICAL_SECTION ... -
二维数组知识
2012-09-15 17:20 821二维数组和指针⑴ 用 ... -
Realloc的使用
2012-08-14 11:04 833realloc 用过很多次了。 ... -
extern C的由来
2012-08-09 10:14 698时常在cpp的代码之中看到这样的代码: #ifdef ... -
C++类对象的创建过程
2012-07-26 16:02 941分配空间(Allocation) ... -
静态数据成员和静态成员函数
2012-07-26 15:04 3115静态类成员包括静态数据成员和静态函数成员两部分。 与 ... -
复制构造函数(拷贝构造函数)以及深浅拷贝
2012-07-25 22:39 1433对于普通对象而言复制是很简单的,一般是将变量或者常量赋值给某 ... -
cin、cin.get、cin.getline()、getline()、gets()的用法【转】
2012-07-24 20:05 833学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了 ... -
编程笔记(07-24)
2012-07-24 15:15 6691 #include < stdio.h ... -
堆、栈解疑
2012-07-12 21:53 586一、预备知识—程序的内存分配 一个由C/C++编译的程序 ... -
指针和内存分配的深度理解
2012-07-12 18:57 1033一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种 ... -
数组指针和指针数组
2012-07-12 18:56 1189先看一下基本的形式,我们从这里起步! ----------- ... -
const指针和指向const的指针
2012-07-12 10:30 2124指向const对象的指针 ... -
typedef的学习
2012-07-11 15:03 744typedef,顾名思义,为“类型定义”,可以解释为:将一种数 ... -
函数指针和指针函数
2012-07-11 11:21 600【函数指针】 ... -
Define学习
2012-07-11 10:12 1075宏替换是C/C++系列语言的技术特色,C/C++语言提 ... -
sizeof 深研
2012-07-11 09:39 6721、什么是sizeof 首先看一下sizeof ... -
内存对齐问题
2012-07-10 22:35 11021.内存数据对齐的原因: 无论如何,为了提高程序的性 ... -
C语言文件使用方式详解
2012-07-04 10:23 770文件的打开(fopen函数) f ...
相关推荐
这就涉及到内存地址、指针和内存管理的知识。理解如何安全有效地进行内存操作,避免内存泄漏或崩溃,是编写稳定外挂的关键。 此外,我们还需要学习如何实现钩子技术。钩子是一种监视系统事件的技术,通过安装钩子...
关于FILE的定义和运作,它是标准I/O库内部使用的结构体类型,包含了文件描述符、指向缓冲区的指针、缓冲区长度、文件指针位置、错误状态等信息。程序员在使用标准I/O函数时,通常是通过FILE*类型的指针操作具体的...
另一方面,符号链接(软链接)类似于Windows系统中的快捷方式,它是一个指向其他文件的指针。符号链接有自己的inode和文件名,但内容仅包含目标文件的路径。使用`ln`命令创建符号链接,例如`ln -s 目标文件 链接名`...
【C++ 引用详解】 C++中的引用是一种特殊的变量,它并不是一个新的数据类型,而是已存在变量的别名。引用一旦初始化后,就不能再改变...在实际编程中,开发者应主要关注引用如何使用,而不是过于深究其底层实现细节。
《科大C语言每章节上机试题解析与深入探讨》 C语言,作为一种基础且强大的编程语言,被广泛应用于...对于每一个题目,不仅要追求正确答案,更应深究其背后的原理,以便在未来面对更为复杂的编程挑战时能游刃有余。
2. **C++中的extern "C"含义深究**: 在C++中,extern "C"用于告诉编译器按照C语言的规则处理特定的函数和变量,因为C++支持名字修饰(name mangling),而C语言则不支持。这对于在C++程序中调用C库或使C++代码与C...
谁都不敢说自己的C/C++能有多精通,当然,工作一久,很多老毛病也就容易犯了,所以说,理论是真的很重要的,下面这道题,说实话还是挺基础的,虽然当时笔试被我给猜对了,但还是要深究一下具体的转换细节。...
当遇到较大较复杂的编程任务时,用 C 就会比较吃力,这个时候就应该使用 C++,因此有必要对 C++ 再深究一下。从汇编角度研究 C++,能看到最彻底最本质的东西,学习效果也最好,也更容易看清C++面向对象的底层实质。...
启动文件负责微控制器上电后的初始化,如设置堆栈指针和系统时钟等。内核相关文件涉及中断和异常处理等与内核相关的内容。外设驱动文件针对 GPIO、USART、SPI、I2C 等各种外设提供驱动函数和配置参数。 其功能特点...
例如,在指针的教学上,不必让学生深入理解复杂的指针概念,通过简单的案例和形象的比喻,帮助他们掌握指针的基本使用就已足够。对于递归这一复杂概念,让学生理解其核心思想,即问题的递归转化和终止条件,而不是...
因此,嵌入式系统的面试题目往往深究基础概念和编程实践能力,下面将详细解释在嵌入式系统开发中常见的经典面试题目。 1. 预处理指令#define的使用与注意事项 在C语言中,#define预处理指令用于创建宏定义,可以...
该书旨在通过实际的程序实例来引导读者逐步掌握C语言的基本元素,而不深究语言的每一个细节和技术层面。在第一章中,作者首先介绍了C语言的基础概念,包括变量、常量、算术运算、控制流、函数和基本的输入/输出操作...
高级语言如C、Java、Python等,提供了更为人性化的语法,使得程序员可以更专注于逻辑和算法,而无需深究底层机器语言的细节。 C语言,作为压缩包子文件中的重点,是高级语言程序设计中的经典代表。由Dennis Ritchie...
5. 数组和指针:这两个概念极其灵活,需要深入理解和应用,特别是字符串和数组指针的交互。 总的来说,学习C语言需要耐心和毅力,不断地实践和总结,形成良好的编程习惯。通过针对性的复习和大量的上机练习,能够...
1. **智能指针**:ATL引入了智能指针的概念,如CComPtr和CComQIPtr,这些指针可以自动管理COM对象的引用计数,避免了常见的内存泄漏问题。 2. **类型安全的宏**:提供了如 STDMETHOD 和 STDMETHODIMP 这样的宏,它们...
这就是在 C/C++ 中的空指针。 在 C 语言中, NULL 是无类型的,只是一个宏,它代表空。我们不研究 C++ 中的 NULL ,因为在 C++11 以后又有了新的定义,我们不深究。 这就是 C 语言中所谓的 NULL ( C++ 的定义比较...
”学生在学习旋转时,不应仅仅停留在记忆和应用规则的层面,而应深究旋转背后的原理,通过不断的思考和实践来深化对概念的理解。这种教学理念鼓励学生主动探索,激发他们的学习兴趣和创新思维。 本课程的目标不仅是...
这样的设计可以大大简化数据库操作的复杂性,使程序员不必深究各种数据库访问技术的细节,而是将精力集中在业务逻辑的实现上。同时,该接口技术可以轻松地应用于不同的应用软件系统,极大地提高了代码的复用性和可...
LVGLImgTool的使用有助于简化嵌入式GUI开发流程,让开发者可以专注于设计美观、用户友好的界面,而不必深究底层图像处理的细节。同时,由于LVGL库本身具有跨平台和高度可定制的特点,因此,LVGLImgTool也适用于各种...
13. 括号内的句子可能是在讨论人们对于自然世界认识的局限,即只看表面而不深究本质。 14. 题目将“闹钟”与“指针”关联,表明它们在功能上的对应,如同时间指示工具。 这些题目覆盖了法律、医学、哲学、文化、...