在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例:
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 3742#include <iostream> #in ... -
对于CRITICAL_SECTION用法的介绍和理解[转]
2013-04-08 11:50 2181很多人对CRITICAL_SECTION ... -
二维数组知识
2012-09-15 17:20 816二维数组和指针⑴ 用 ... -
Realloc的使用
2012-08-14 11:04 829realloc 用过很多次了。 ... -
extern C的由来
2012-08-09 10:14 695时常在cpp的代码之中看到这样的代码: #ifdef ... -
C++类对象的创建过程
2012-07-26 16:02 938分配空间(Allocation) ... -
静态数据成员和静态成员函数
2012-07-26 15:04 3110静态类成员包括静态数据成员和静态函数成员两部分。 与 ... -
复制构造函数(拷贝构造函数)以及深浅拷贝
2012-07-25 22:39 1428对于普通对象而言复制是很简单的,一般是将变量或者常量赋值给某 ... -
cin、cin.get、cin.getline()、getline()、gets()的用法【转】
2012-07-24 20:05 831学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结,为了 ... -
编程笔记(07-24)
2012-07-24 15:15 6661 #include < stdio.h ... -
堆、栈解疑
2012-07-12 21:53 583一、预备知识—程序的内存分配 一个由C/C++编译的程序 ... -
指针和内存分配的深度理解
2012-07-12 18:57 1030一 :关于指针和堆的内存分配 先来介绍一下指针: 指针一种 ... -
数组指针和指针数组
2012-07-12 18:56 1186先看一下基本的形式,我们从这里起步! ----------- ... -
const指针和指向const的指针
2012-07-12 10:30 2119指向const对象的指针 ... -
typedef的学习
2012-07-11 15:03 738typedef,顾名思义,为“类型定义”,可以解释为:将一种数 ... -
函数指针和指针函数
2012-07-11 11:21 594【函数指针】 ... -
Define学习
2012-07-11 10:12 1073宏替换是C/C++系列语言的技术特色,C/C++语言提 ... -
sizeof 深研
2012-07-11 09:39 6671、什么是sizeof 首先看一下sizeof ... -
内存对齐问题
2012-07-10 22:35 10961.内存数据对齐的原因: 无论如何,为了提高程序的性 ... -
C语言文件使用方式详解
2012-07-04 10:23 768文件的打开(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 等各种外设提供驱动函数和配置参数。 其功能特点...
该书旨在通过实际的程序实例来引导读者逐步掌握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. 题目将“闹钟”与“指针”关联,表明它们在功能上的对应,如同时间指示工具。 这些题目覆盖了法律、医学、哲学、文化、...
通过以上分析,我们可以了解到,即使是最基础的字符串操作函数,其背后的原理和细节也是值得深究的。面试题的设计旨在检验面试者对C/C++语言的理解深度和解决问题的能力,而不仅仅是语法知识。因此,扎实的基础和...
str.equals(""))`,当`str`为`null`时,`str.equals()`不会执行,避免了空指针异常。另一方面,`&`始终会评估两个表达式,即使左侧为假,这在需要同时检查两个条件或者进行位运算时(例如按位与)是有用的。 Java并...
3. **调用函数**:根据函数指针调用相应的串口操作函数,如`OpenSerialPort()`打开串口,`SendData()`发送数据,`ReceiveData()`接收数据,`CloseSerialPort()`关闭串口。 4. **错误处理**:在每个函数调用后检查...
1. **基础语法**:包括变量、数据类型、运算符、流程控制语句(如if-else、switch-case、for、while)、函数定义与调用、数组、指针等基础知识。 2. **面向对象编程**:C++的核心特性之一,考生需掌握类的定义、...