目录
摘要
记得之前看过一篇文章说所有的指针其实都可以视为一个int类型,这句话催生了我很多想法,这篇博文即为其一。
示例
- 示例代码:
#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;
}
- 编译可以通过,运行也正常;运行结果:
- 分析
- 可以看到原本定义为const char的str[]的第一个字符"1"被程序在运行时修改为“0”。
- 显然重点在于 char* p = (char*)(int(str));
- 在代码中声明为const限制的变量,其实在内存层面和没有const的是一样的。
- 区别在于如果声明为const,则编译器会在编译时检查是否有对这个变量进行修改,但它不保证运行时不会被修改,因此可以用间接的方法去修改它。
- 指针存放的地址可以看做是一个int类型的值,因此显式把const char*转为int,再转为char*即可,接着我们就可以用char* p来修改身为const char的str了。
- 这不仅对于const char的数据,对于其他声明为const的数据都可以用这个方法去修改。
- 特例:
- 有些const变量(如const int)由于编译器会优化,采用宏定义直接替代,然后运行时也是可以执行修改,虽然不会报错,但修改是没有效果的,这个时候如果真要修改,得修改程序运行时代码区。
不可修改的特例
- 如果我们把str的声明由 const char[] 改为 const char * 呢?
- str声明为 const char[] 时:
- str是一个数组,数组大小取决于初始化的内容的长度,即后面"123456"的长度,除了6个数字外,还有末尾1个 "\0" 的结束符,因此是7个长度;即str的类型是const char[7]。
- 由于是在main函数内声明的,因此存放是在栈上的。
- str声明为 const char*时:
- str是一个指向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“写到这块内存中,由于这是在栈上的,是可以修改的,因此虽然声明是const char,但只是编译时会检查你有没有去修改它,有则不会编译通过。显然我们显示转换类型成功绕过了编译器的检查。
写在最后
* c++本身也提供了一些方法可以去掉str的const限制:比如const_cast<>,它的使用方法在百度上很多,如果需要请自行百度了解。
* 指针着实是相当有意思的东西。
sugar defender reviews For many years, I’ve battled unforeseeable blood
glucose swings that left me feeling drained pipes and lethargic.
However given that incorporating Sugar Defender right into my routine, I have actually discovered a substantial
renovation in my total power and security. The feared mid-day thing of the past, and I
value that this all-natural treatment achieves these
results without any unpleasant or unfavorable reactions.
honestly been a transformative exploration for me.
Тут можно преобрести где купить оружейный сейф оружейный шкаф сейф купить
You have made some really good points there. I checked on the internet for more information about the issue and found most people will go along with your views on this website.
Сервисный центр предлагает ремонт olympus om-d e-m10 mark iii цены ремонт olympus om-d e-m10 mark iii в петербурге
mk sports hiếp dâm trẻ em
Тут можно преобрести сейф противопожарный купить огнестойкий сейф
Тут можно преобрести где купить сейф для оружия сейф под оружие
Тут можно преобрести сейф противопожарный огнестойкий сейф
Truly enjoyed perusing this entry. It’s highly well-written and filled with useful information. Thank you for providing this.
Тут можно преобрести сейф жаростойкий сейф огнестойкий в москве
Adored this post. It’s highly comprehensive and filled with valuable details. Fantastic effort!
Loved this post. It’s very well-researched and full of valuable information. Excellent work!
It’s nearly impossible to find educated people about this subject, however, you sound like you know what you’re talking about! Thanks
Тут можно преобрести купить сейф для карабина сейф сейфы оружейный оружие
Good blog you have here.. It’s hard to find excellent writing like yours these days. I seriously appreciate people like you! Take care!!
Тут можно преобрести купить сейф для ружья сейф оружейный
Тут можно преобрести купить огнестойкий сейф купить огнеупорный сейф
Сервисный центр предлагает чистка системы охлаждения fujitsu siemens lifebook p1510 ремонт платы fujitsu siemens lifebook p1510
Having read this I thought it was very informative. I appreciate you finding the time and energy to put this informative article together. I once again find myself personally spending way too much time both reading and commenting. But so what, it was still worthwhile!
Тут можно преобрести огнеупорный сейф купить огнеупорный сейф
Good post. I’m going through a few of these issues as well..
I appreciate how well-researched and informative each post is It’s obvious how much effort you put into your work
Your blog has quickly become one of my favorites I always look forward to your new posts and the insights they offer
This excellent website certainly has all of the information and facts I wanted about this subject and didn’t know who to ask.
I really like it whenever people get together and share views. Great website, continue the good work.
Alderman Hugh Anthony McKay, JP, Mayor of Larne, County Antrim.
There are plenty of color schemes and patterns to please any dwelling chef in your present list.
There are additionally a host of other colours available in the form of calla lilies, peonies, lavender, hydrangeas, irises, zinnias, magnolias, gardenias, mums and even sunflowers!
Professor John McArthur Reid, Senior Zone Scientific Adviser to Central Authorities.
It is the birthstone for many who were born in December.
Now, despite the sale of O’Riley, they appear to have strengthened their squad considerably.
Overhauling in small increments can be much less time and money-consuming and more immediately gratifying.
Good post. I learn something new and challenging on sites I stumbleupon every day. It’s always exciting to read through content from other writers and use a little something from other sites.
Здесь можно преобрести сейф цена купить сейф цена москва
The UN has added the Israeli army to a “blacklist” of international locations that have mistreated children in armed conflicts.
William Brown, Assistant Works Supervisor, Public Works Department, Federation of Nigeria.
March 27, 1912. p.
Efforts are being made to handle these disparities.
Paint the ground white as well because the walls and home windows, and a tiny room will really feel more open.
Henry Martyn McGladdery, MB, BS, Surgeon, Lady Templer Hospital, Kuala Lumpur.
This section does not cite any sources.
The count operate works equally to an and perform, we specify the quantity of modifiers we’re on the lookout for, and then list each modifier.
Robert Jackson Dowding, Burgh Surveyor, Chief Sanitary Inspector, Burgh Engineer and Supervisor of Works Division, Denny and Dunipace, Lanarkshire.
I’m impressed, I must say. Rarely do I encounter a blog that’s equally educative and entertaining, and without a doubt, you have hit the nail on the head. The problem is something not enough folks are speaking intelligently about. I am very happy I came across this during my hunt for something regarding this.
Mya was removed from the softball team and told she couldn´t attend the prom.
On 22 December 1924, Line 6 was reopened between Schwabentorbrücke and Goethestraße.
You may even set your hair infrequently on rollers for getting the nice look.
Тут можно преобрести сейфов для оружия купить сейф с доставкой в москве
I love how you incorporate personal stories and experiences into your posts It makes your content relatable and authentic
I seriously love your website.. Great colors & theme. Did you make this web site yourself? Please reply back as I’m trying to create my very own website and would love to find out where you got this from or what the theme is named. Cheers!