C++内存的知识 & 常量与指针 & const

C++变量存放的位置

简介

1、stack(栈):编译器自动分配、释放(存放局部变量,函数参数,返回数据,返回地址等内容)
2、heap(堆):一般由程序员分配、释放(为动态内存分配提供地址空间)
3、全局区/静态区:全局区和静态区存放在同一个区,程序结束释放
4、常量区:常量不可修改

存储位置

堆向高地址方向生长;
栈向低地址方向生长;
在这里插入图片描述

数组和指针在内存中的位置

1、char a[] = “world”;
对于数组a,a是数组a的首地址的别名,要访问数组元素可以用a[i]或者*(a+i);
2、char *a = “world”;
a是char类型的指针放在栈区,指向字符串”world“的首地址;”world“是字符串常量放在静态区
在这里插入图片描述

指针p为const char*类型,是常量指针 ,不能改变,所以A,C,D错;
指针p指向字符串”World“的首地址,地址为p的内容是”Hello“,地址p的内存单元的内容改为”Hello“不会出错。

指针与常量

常量指针

1、定义:一个指针所指的数据是常量,这个指针被称为常量指针;
2、举例:

int x = 1;
const int* p;
p = &x;//正确
*p = 5;//错误,常量指针所指向的值不能通过*p来修改

指针常量

1、定义:我们把指针放到常量中,就是指针常量;
2、举例:

int x = 1,y = 2;
int* const p = &x;
*p = 5;//正确
p = &y;//错误,指针本身是一个常量,不能改变

常量指针常量

1、定义:一个常量中存着一个指针,这个指针又指向另外一个常量。
eg:

int x = 5;
const int* const p = &x;

小结:在前先读,在前不变

补充:
在这里插入图片描述
这题p为指针常量,指针是一个常量,不允许p++,B,C错;p[3]不存在,D错
在这里插入图片描述
这题是一个常量指针,不允许修改指针p所指向的常量,即不能*p = ‘x’ , 所以C,D错。

java与C++常量的区别

在这里插入图片描述

const

1、const与#define的区别:

(1)const常量具有类型,编译器可以进行安全检查;#define宏定义没有数据类型,只是简单的字符串替换,不能进行安全检查
(2)const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

2、函数中使用const

(1)const int

const int func1();//返回值是常量

(2)const int*

const int* func2();//指针指向的内容不变,不可以*p = 3;

(3)int *const

int *const func2();//指针本身不可变,不可以p++;

3、类中的const

1、如果在编写const成员函数时,不慎修改数据成员,或者调用了其它非const成员函数,编译器将指出错误。
2、使用const关键字进行说明的成员函数,称为常成员函数,对于类中的const成员变量必须通过初始化列表进行初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值