专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
理解一般指针和指向指针的指针
2019-07-20 14:11
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
13841
0
1575
在说指向指针的指针之前,不得不说指向变量的指针。先看如下示例:
1. 指向整型指针
先看如下示例:
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 =
"
<< &a << endl
10
<<
"
*p =
"
<< *p << endl
11
<<
"
p =
"
<< p << endl
12
<<
"
&p =
"
<< &p << endl;
13
14
return
0
;
15
}
运行结果如下:
我们先看下内存分配图:
由上图可以清楚的知道,输出整形变量a的值是5,指针变量p的值是001BFD18,而*号的作用是取值,*p即取地址001BFD18中存放的值,即5。
2. 指向字符型指针
先看如下示例:
1
#include <iostream>
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
<< endl;
17
}
18
return
0
;
19
}
运行结果图如下:
为什么整型指针p输出的是地址,而字符型指针输出的是字符串呢,字符型指针里存放的不是地址吗?
我们先看下内存分配图:
由上图可以看出,其实p中存放的是地址,只是当cout时,如果指针是字符型指针,那么会输出p中地址指向的内存中的内容(这里是h)直到遇到' '才结束。所以直接输出p时会输出hello,而将p强制转换为void *时输出的是地址。
3. 指向整型指针的指针
先看如下示例:
1
#include <iostream>
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
<< 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. 指向整型指针的指针
先看如下示例:
1
#include <iostream>
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
) +
1
; j++)
11
{
12
cout << a
[j] <<
"
"
<< (
void
*)&a
[j] << endl;
13
}
14
cout << endl;
15
}
16
17
for
(
int
i =
0
; i <
3
; i++)
18
{
19
cout <<
"
a[
"
<< i <<
"
] =
"
<< (
void
*) a
<< endl
20
<<
"
&a[
"
<< i <<
"
] =
"
<< &a
<< endl;
21
}
22
23
24
cout <<
"
p =
"
<< p << endl
25
<<
"
&p =
"
<< &p << endl;
26
return
0
;
27
}
[url=]
[/url]
运行结果图如下:
我们先看下内存分配图:
由上图可以看出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]的地址。
发送
看不清?
0条回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
一周热门 更多>