共7条
1/1 1 跳转至页
const char *p和char * const p区别

此程序在linux下测试,内核版本为2.6.18,gcc版本为4.1.2.
程序为:
1# include <stdio.h>
2
3 const char *p_c = "cc";
4 char * const p_d = "dd";
5
6 int main(void)
7 {
8 char c[10] = "china";
9 char *p = "hello world";
10 const char *p_const = "welcome";
11 char *const p_a = c;
12
13 printf("p's address = %x\n", p);
14 printf("p_const address = %x\n", p_const);
15
16 printf("&p address = %x\n", &p);
17 printf("&p_const address = %x\n", &p_const);
18
19 printf("&p_c address = %x\n", &p_c);
20 printf("&p_d address = %x\n", &p_d);
21
22 printf("p_c = %x\n", p_c);
23 printf("p_d = %x\n", p_d);
24
25 p_c = c;
26 printf("p_c = %s\n", p_c);
27 printf("p_c second = %x\n", p_c);
28 printf("c address = %x\n", c);
29 printf("p_a address = %x\n", p_a);
30 printf("&p_a address = %x\n", &p_a);
31 while(1);
32 return 0;
33 }
运行程序后./a.out结果为:
编译以后用cat /proc/进程号/maps查看它的堆栈及数据域信息如下:
要想查看详细信息用如下命令:readelf -S ./a.out
通过上述三张图片可获得关于const char *p与char * const p的区别如下
全局变量的const char *p与char * const p与局部变量const char *p与char * const p在内存中位置是有区别的,
局部变量的const char *p与char * const p放在栈区,局部变量的它两个的区别是const char *p指向的内容是可读的,而变量p的内容是可变的,
而char * const p变量p是只读的,而它指向的内容是可以改变的,也就是说用char * const p定义时必须初始化,否则再引用会报错, 比如 char b[10] = "china"; char *const p = "hello world"; p = b; 则编译器编译上边程序时会报错,但是将p = b;改为*p= 'c';不会出现报错。 你这是在打印printf("p = %s\n", p); 此时结果为cello world. 而全局变量放在data区或bss区,这与变量定义时有没有初始化有关系,但是const char *p与char * const p在内存中存放区域是有区别的,当二者只定义了,而没有初始化,都放在bss区, 但是当二者均初始化后,const char *p放在data区,而char * const p放在只读内存区,它和代码段放在一块。
而且变量char * const p无论是全局变量还是局部变量必须定义时初始化,否则想要在引用该变量时,编译时报错。
变量char * const p为只读变量p,而它指向的内容是可变的。 变量const char *p它指向的内容为可读的,但是变量p是可以改变的!!
有错误的地方请指正,不胜感激!!



局部变量的const char *p与char * const p放在栈区,局部变量的它两个的区别是const char *p指向的内容是可读的,而变量p的内容是可变的,
而char * const p变量p是只读的,而它指向的内容是可以改变的,也就是说用char * const p定义时必须初始化,否则再引用会报错, 比如 char b[10] = "china"; char *const p = "hello world"; p = b; 则编译器编译上边程序时会报错,但是将p = b;改为*p= 'c';不会出现报错。 你这是在打印printf("p = %s\n", p); 此时结果为cello world. 而全局变量放在data区或bss区,这与变量定义时有没有初始化有关系,但是const char *p与char * const p在内存中存放区域是有区别的,当二者只定义了,而没有初始化,都放在bss区, 但是当二者均初始化后,const char *p放在data区,而char * const p放在只读内存区,它和代码段放在一块。
而且变量char * const p无论是全局变量还是局部变量必须定义时初始化,否则想要在引用该变量时,编译时报错。
变量char * const p为只读变量p,而它指向的内容是可变的。 变量const char *p它指向的内容为可读的,但是变量p是可以改变的!!
有错误的地方请指正,不胜感激!!
共7条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 |