扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
初学const int* 和 const char*
创新互联建站是一家集网站建设,武邑企业网站建设,武邑品牌网站建设,网站定制,武邑网站建设报价,网络营销,网络优化,武邑网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。const int* 和 const char* 看起来虽然只有int 和 char 的差异,但实际上差别还有些大。
1,先从const int * 说起,const int* 和int const *是一样的,这个const 修饰词修饰的是变量,也就是这个指针对应的内存的值不可修改,指针的指向可以修改。
int a = 10;
int b = 100;
const int *p_int = &a;
p_int = &b;
//*p = 5;// 提示 *p不是可修改的左值
2,按照这个思路看一下 const char*
char chr[] = "hello";
const char *p_chr = chr;// chr 不需要用&取地址,因为chr本身就是chr[]的首地址
//*p_chr = 'a'; // 同const int* 一样,提升*p_chr 不是可修改的左值
p_chr = "world";//!
虽然*p_chr = 'a'; 这个表达式时错误的,但是p_chr = "world";时可执行的,看起来p_chr 指向的字符串被修改了!
为什么会出现上面这个现象?我理解有两个差异。
1,编译器对于指向 int 类型的指针和指向 char 类型的指针处理不同。如果在代码中使用p_int , 它是一个地址;但如果在代码中使用p_chr, 它时一个字符串(虽然本质上它也是一个地址,但是编译器对于指向char的指针,会自动调出字符串。而*p_chr 仅代表字符串的首字母)
2,字符串(“world”)和整数(10)的不同。字符串world是左值,而常数10是右值。“world”本身会在内存中分配一块地址存放这个字符串,并返回的的首地址。
综合上面两点,p_chr = "world";这个表达式就可以理解了。相当于重新开辟了一个内存位置存放了world,然后把这个内存地址返回给p_chr, 这样和const char* p_chr 并不矛盾,因为没有取试图修改p_chr 指向的内存位置,而是修改了指针的指向。类似于上面的 p_int = &b; 重新定向了指针指向。
初次看到这个还是有些混乱的,现在清楚多了。
关于左值和右值,(72条消息) 初识 C++ 函数参数引用和指针及左值和右值_weixin_52352638的博客-博客
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流