找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 上位机编程 查看内容

使用int()显式类型转换指针来修改const char的值

2022-7-10 12:41| 发布者: gk-auto| 查看: 441| 评论: 0

摘要: 0.摘要  记得之前看过一篇文章说所有的指针其实都可以视为一个int类型,这句话催生了我很多想法,这篇博文即为其一。1.举例  举例代码:#includeiostream using namespace std; int main() { const char str = ...

0.摘要

  记得之前看过一篇文章说所有的指针其实都可以视为一个int类型,这句话催生了我很多想法,这篇博文即为其一。

1.举例

  举例代码:

复制代码
#include<iostream>
using namespace std;

int main()
{
    const char str[] = "123456";
    cout << str << endl;
    char* p = (char*)(int(str));
    *p = 48;    //0的ASCII
    cout << str << endl;

    return 0;
}
复制代码

   效果图:

 

  显然重点在于 char* p = (char*)(int(str));

  在代码中声明为const限制的变量,其实在内存层面和没有const的是一样的,区别在于如果声明为const,则编译器会去检查是否有对这个变量进行修改。而指针存放的地址可以看做是一个int类型的值,因此显示把const char*转为int,再转为char*即可,接着我们就可以用char* p来修改身为const char的str了。

   这不仅对于const char的数据,对于其他声明为const的数据都可以用这个方法去修改。

 

  但这里有一个地方需要注意,如果我们把str的声明由 const char[] 改为 const char * 呢?

复制代码
#include<iostream>
using namespace std;

int main()
{
    const char* str = "123456";
    cout << str << endl;
    char* p = (char*)(int(str));
    *p = 48;    //0的ASCII
    cout << str << endl;

    return 0;
}
复制代码

  这样的话编译的可以通过的,但运行时会出错

   此时在用p修改str时出现写入失败,那同为const char的str,为什么这里就不能修改呢?

  因为这里是把str声明为一个指向const char的指针,字符串“123456”是位于静态区的一块内存,静态区是从内存层面限制开发者不能去修改的,而str就指向了这块内存,但上面的例子不一样,const char str[]时,是给str分配了一块内存,然后把字符串"123456“复制给str,这块内存是可以修改的,虽然声明是const char,但只是编译时会检查你有没有去修改它,有则不会编译通过。显然我们显示转换类型成功绕过了编译器的检查。

 

  当然c++也提供了一些方法可以去掉str的const限制:const_cast<>,它的使用方法在百度上很多,如果需要请自行百度了解。

关注公众号,加入500人微信群,下载100G免费资料!

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 05:27 , Processed in 0.060134 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部