2020年4月6日 下午11:00
以下四行代码的区别是什么? const char * arr = “123”; char * brr = “123”; const char crr[] = “123”; char drr[] = “123”;
const char * arr = "123”;- 字符串123保存在常量区
- const本来是修饰arr指向的值不能通过arr去修改,但是字符串“123”在常量区,本来就不能改变,所以加不加const效果都一样
char * brr = "123";- 字符串123保存在常量区,这个arr指针指向的是同一个位置,同样不能通过brr去修改”123”的值
const char crr[] = “123”;- 这里123本来是在栈上的,但是编译器可能会做某些优化,将其放到常量区
char drr[] = “123”;- 字符串123保存在栈区,可以通过drr去修改
Const 修饰指针变量有以下三种情况
- A: const 修饰指针指向的内容,则内容为不可变量。
1
2const int *p = 8;
//则指针指向的内容 8 不可改变。简称左定值,因为 const 位于 * 号的左边。 - B: const 修饰指针,则指针为不可变量。
1
2
3
4
5
6int a = 8;
int* const p = &a;
*p = 9; // 正确
int b = 7;
P = &b; // 错误
//对于 const 指针 p 其指向的内存地址不能够被改变,但其内容可以改变。简称,右定向。因为 const 位于 * 号的右边。 - C: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
1
2
3int a = 8;
const int * const p = &a;
//这时,const p 的指向的内容和指向的内存地址都已固定,不可改变。
C++里是怎么定义常量的?常量存放在内存的哪个位置?
- C++ 常量 | 菜鸟教程
- 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
- 常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。
- 常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
- 在 C++ 中,有两种简单的定义常量的方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
- 常量在C++里的定义就是一个top-level const加上对象类型,常量定义必须初始化。
- 对于局部对象,常量存放在栈区
- 对于全局对象,常量存放在全局/静态存储区。
- 对于字面值常量,常量存放在常量存储区。
- 代码段:
- 包括只读存储区和文本区,其中只读存储区存储字符串常量(const就存在这里),文本区存储程序的机器代码。
- C++内存分配方式详解(堆、栈、自由存储区、全局/静态存储区和常量存储区)_C/C++_那年聪聪-CSDN博客
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15int a=0; 全局初始化区 .data
char *p1; 全局未初始化区 .bss
int main()
{
int b; //栈
char s[]="abc"; //栈
char *p2; //栈
char *p3="123456"; //123456/0在常量区 .text中的_const,p3在栈上。
static int c =0;//全局(静态)初始化区 .data
p1 = (char *)malloc(10); //分配得来得10和20字节的区域就在堆区
p2 = (char *)malloc(20);
strcpy(p3,"123456"); //123456/0放在常量区,编译器可能会将它与p3所指向的"123456" 优化成一个地方。
} - 堆和栈究竟有什么区别?
Const修饰成员函数的目的是什么?
Const修饰的成员函数表明函数调用不会对对象做出任何更改,事实上,如果确认不会对对象做更改,就应该为函数加上const限定,这样无论const对象还是普通对象都可以调用该函数。
同时定义了两个函数,一个带const,一个不带,会有问题吗?
- 不会,这相当于函数的重载。
- 原因是:
- 按照函数重载的定义,函数名相同而形参表有本质不同的函数称为重载。在类中,由于隐含的this形参的存在,const版本的function函数使得作为形参的this指针的类型变为指向const对象的指针,而非const版本的使得作为形参的this指针就是正常版本的指针。
- 此处是发生重载的本质。重载函数在最佳匹配过程中,对于const对象调用的就选取const版本的成员函数,而普通的对象调用就选取非const版本的成员函数。
- (注:this指针是一个const指针,地址不能改,但能改变其指向的对象或者变量)
- C++ 学习之函数重载、基于const的重载_C/C++_guiyinzhou的专栏-CSDN博客