OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4428|回复: 14

关于结构体指针用const修饰的问题,求助!

[复制链接]

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
发表于 2017-12-23 11:23:56 | 显示全部楼层 |阅读模式
20金钱
请教下我想实现如下功能是否可以实现?struct SControl//定义一个结构体。
{
    uint8_t     nMode:2;// = 0x01,
    uint16_t    nLAim;// = 260,
    uint16_t    nPAim;// = 960,
    uint16_t    nMaxL;// = 900,
    uint16_t    nMinL;// = 100,

    uint16_t    nFLum;// = 240,
    uint16_t    nRLum;// = 40,
    uint16_t    nSLum;// = 150,

    uint16_t    nP_85;// = 765,
    uint16_t    nP_75;// = 675,
    uint16_t    nP_50;// = 450,

    uint16_t    nD_85;// = 85,
    uint16_t    nD_75;// = 90,
    uint16_t    nD_50;// = 95,
};

struct SControl g_Scon = {//初始化该结构体
    0,      260,    960,    900,    100,
    240,    40,     150,
    765,    675,    450,
    850,    900,    950,
};
struct SControl* const p_Scon = (&g_Scon);

我想实现定义一个指针,该指针想用const类型,并把指针指向定义的结构体g_Scon;
按上面写的我已经测试过,结果如图:

如果想让p_Scon和g_Scon的数值一样,即指向同一个地址,怎么才可以实现?

p_Scon和g_Scon并不指向同一个地址

p_Scon和g_Scon并不指向同一个地址

最佳答案

查看完整内容[请看2#楼]

注意:图222和333中,printf的参数传*p_Scon的话,整个结构体入栈了,结果就是按照整个结构体的内存布局打印出前两个(图222)或前一个(图333)的整型变量。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-23 11:23:57 | 显示全部楼层
csmjmcc 发表于 2017-12-26 20:27
我加const修饰符也一样的,不过我用的C++测试。

注意:图222和333中,printf的参数传*p_Scon的话,整个结构体入栈了,结果就是按照整个结构体的内存布局打印出前两个(图222)或前一个(图333)的整型变量。
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
 楼主| 发表于 2017-12-23 11:25:21 | 显示全部楼层
在MDK523中编译的!
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2017-12-23 16:47:54 | 显示全部楼层
struct SControl//定义一个结构体。
{
        unsigned int     nMode: 2;// = 0x01,
        unsigned int    nLAim;// = 260,
        unsigned int    nPAim;// = 960,
        unsigned int    nMaxL;// = 900,
        unsigned int    nMinL;// = 100,

        unsigned int    nFLum;// = 240,
        unsigned int    nRLum;// = 40,
        unsigned int    nSLum;// = 150,

        unsigned int    nP_85;// = 765,
        unsigned int    nP_75;// = 675,
        unsigned int    nP_50;// = 450,

        unsigned int    nD_85;// = 85,
        unsigned int    nD_75;// = 90,
        unsigned int    nD_50;// = 95,
};

struct SControl g_Scon = {//初始化该结构体
        0, 260, 960, 900, 100,
        240, 40, 150,
        765, 675, 450,
        850, 900, 950,
};
const struct SControl* p_Scon = (&g_Scon);

如下,结果图111
void main(void)
{
        printf("%d   -    %d\r\n", p_Scon, &g_Scon);
        printf("%d   -    %d\r\n", p_Scon -> nMinL,  g_Scon.nMinL);
        getchar();

}
改成如下,结果图222:
void main(void)
{
        printf("%d   -    %d\r\n", p_Scon, &g_Scon);
        printf("%d   -    %d\r\n", *p_Scon,  g_Scon.nMinL);
        getchar();

}


改成如下,结果图333:
void main(void)
{
        printf("%d   -    %d\r\n", p_Scon, &g_Scon);
        printf("%d   -    %d\r\n", g_Scon.nMinL, *p_Scon);
        getchar();

}



是不是感觉很奇怪?!!
333.png
222.png
111.png
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
 楼主| 发表于 2017-12-25 09:31:29 | 显示全部楼层
csmjmcc 发表于 2017-12-23 16:47
struct SControl//定义一个结构体。
{
        unsigned int     nMode: 2;// = 0x01,

图222,0-260   按道理260显示是不正常的,应该是100才对吧!
我没看太明白,你想给我传达的意思。能不能讲明白点。
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
 楼主| 发表于 2017-12-25 09:35:22 | 显示全部楼层
csmjmcc 发表于 2017-12-23 16:47
struct SControl//定义一个结构体。
{
        unsigned int     nMode: 2;// = 0x01,

什么原因造成,输出结果不正确的,你知道吗?指教下吧!
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2017-12-25 09:44:47 | 显示全部楼层
footprint 发表于 2017-12-25 09:35
什么原因造成,输出结果不正确的,你知道吗?指教下吧!

111图是正确的,但222图及333图是笔误,写成printf("%d   -    %d\r\n", *p_Scon,  g_Scon.nMinL);  或者 printf("%d   -    %d\r\n", g_Scon.nMinL, *p_Scon);  将 *p_Scon 位置兑换下结果不一样,这个我很迷惑,所以贴出来供大家思考。
另外,你问的问题,主要是不理解你贴出的图中几个变量值,所以无法直接回答你。
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-25 10:57:45 | 显示全部楼层
C语言的基础而已,没看出奇怪在什么地方。
图222和333中,printf的参数传*p_Scon的话,整个结构体入栈了,结果就是按照整个结构体的内存布局打印出前两个(图222)或前一个(图333)的整型变量。
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
 楼主| 发表于 2017-12-25 16:15:37 | 显示全部楼层
cxf0153 发表于 2017-12-25 10:57
C语言的基础而已,没看出奇怪在什么地方。
图222和333中,printf的参数传*p_Scon的话,整个结构体入栈了, ...

我没想明白,我的两个指针的指向的地址不一样,也就是说,我不能实现将g_Scon这个参数的地址保存在p_Scon中。而我没找到语法错误,想要的功能没有实现,所以才有了这个帖子。
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
 楼主| 发表于 2017-12-25 16:19:03 | 显示全部楼层
csmjmcc 发表于 2017-12-25 09:44
111图是正确的,但222图及333图是笔误,写成printf("%d   -    %d\r\n", *p_Scon,  g_Scon.nMinL);  或者 ...

我的问题和变量的值没有关系。你打印出来的*p_Scon和g_Scon总是相等的,而我的显示*p_Scon和g_Scon的值不想等,就因为struct SControl* const p_Scon = (&g_Scon);这句话中,我比你多了一个const修饰吗?我没想明白……
回复

使用道具 举报

0

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-10-12
在线时间
83 小时
发表于 2017-12-25 16:53:12 | 显示全部楼层
footprint 发表于 2017-12-25 16:15
我没想明白,我的两个指针的指向的地址不一样,也就是说,我不能实现将g_Scon这个参数的地址保存在p_Scon ...

我看到你的p_Scon后面有__initial_sp关键字,说明你断点里看到的这个p_Scon是指向了函数内的局部变量(堆栈地址),而不是g_Scon所代表的全局变量,请你把断点所在的函数贴出来看看。
回复

使用道具 举报

7

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2016-1-20
在线时间
78 小时
 楼主| 发表于 2017-12-26 17:23:51 | 显示全部楼层
cxf0153 发表于 2017-12-25 16:53
我看到你的p_Scon后面有__initial_sp关键字,说明你断点里看到的这个p_Scon是指向了函数内的局部变量(堆 ...

先谢谢了。
那个变量是全局变量,在一开始调试的时候就初始化好了,程序内有没有断点,对它丝毫不起作用。这块内容和主函数都没有关系。如果你说的没错的话,我想可能是&这个符号算法产生出来的吧!只是个猜测,我也看不到是什么情况。再等等看有人知道不。
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2017-12-26 20:27:44 | 显示全部楼层
footprint 发表于 2017-12-25 16:19
我的问题和变量的值没有关系。你打印出来的*p_Scon和g_Scon总是相等的,而我的显示*p_Scon和g_Scon的值不 ...

我加const修饰符也一样的,不过我用的C++测试。
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2017-12-27 08:58:38 | 显示全部楼层
cxf0153 发表于 2017-12-26 23:06
注意:图222和333中,printf的参数传*p_Scon的话,整个结构体入栈了,结果就是按照整个结构体的内存布局 ...

感谢大侠指教!
为了证实您的观点,我作如下变动:
void main(void)
{
        printf("%d   -    %d\r\n", p_Scon, &g_Scon);
        printf("%d - %d - %d - %d - %d - %d\r\n", *p_Scon, g_Scon.nMinL, g_Scon.nMinL, g_Scon.nMinL, g_Scon.nMinL);
        getchar();

}

结果如444图,疑惑中,看来得去看printf源码了,同时也请大侠指教,为何后续指定的g_Scon.nMinL参数无效呢?


444.png
回复

使用道具 举报

15

主题

317

帖子

0

精华

高级会员

Rank: 4

积分
863
金钱
863
注册时间
2015-2-12
在线时间
354 小时
发表于 2017-12-27 09:04:14 | 显示全部楼层
csmjmcc 发表于 2017-12-27 08:58
感谢大侠指教!
为了证实您的观点,我作如下变动:
void main(void)

又将其改为:void main(void)
{
        printf("%d   -    %d\r\n", p_Scon, &g_Scon);
        printf("%d - %d - %d - %d - %d - %d\r\n", *p_Scon);
        getchar();

}

得到如555结果,终于明白了其问题所在了。。。谢谢大侠!!

555.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-16 08:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表