这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » const char *p和char * const p区别

共7条 1/1 1 跳转至

const char *p和char * const p区别

高工
2012-11-23 11:27:45     打赏
const char *p; 是不是指p这个变量所代表的地址的内容是只读的啊?? 而char *const p;是不是指这个变量放在只读区域? 不知道理解是否正确,求高手!!



关键词: const     区别    

高工
2012-11-23 13:09:49     打赏
2楼
不是吧,没人解答啊!! 自己顶个~~

高工
2012-11-23 13:40:36     打赏
3楼
一个是指向常量的指针,但指针可以指向其他常量,一个是指针常量,初始化后就不能再指向其他的的……具体地待会再去搜一下常量指针和指针常量吧……

工程师
2012-11-23 14:53:17     打赏
4楼
楼上正解^^^^^^^

高工
2012-11-23 14:54:10     打赏
5楼
谢谢!!我去搜搜~~

高工
2012-11-23 15:01:58     打赏
6楼
是不是我也可以这样理解啊:就是const char *p;指向的内容在只读区, 而char *const p;定义时必须初始化,而这个变量放在了只读区!!

高工
2012-12-05 10:53:36     打赏
7楼
此程序在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是可以改变的!!
有错误的地方请指正,不胜感激!!

共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]