共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |