内存分区

运行前是代码区和全局区,运行后是分为栈区和堆区

代码区:共享和只读。存放函数体的二进制代码, 由操作系统进行管理的

全局区:存放全局变量和静态变量以及常量,由操作系统管理释放 常量又分为const修饰的常量和字符串常量。const修饰局部变量在非全局区中

栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。不要返回局部变量地址。

            栈中的数据的地址只能拿到一次,拿不到第二次。不要返回局部变量地址

堆区:由程序员分配和释放,程序员不释放,程序结束时由操作系统回收。用new来开辟内存

利用new 关键字 可以将数据开辟到堆区
指针本质也是局部变量 放在栈上 指针保存的数据是放在堆区

p 在栈区,但 p 指向的是堆区。返回堆区地址。堆区不会随函数结束而释放

在堆区的数据要手动管理释放

int* func1() {
    //在堆区创建整型数据
    //new返回是 该数据类型的指针
    int* p = new int(10);
    return p;
}
int* func() {
    int * p = new int(10);//返回保存10的这块内存的首地址
       return p;
    
}
void test() {
	int* p = func();
	cout << *p << endl;
	cout << *p << endl;
	cout << *p << endl;
	//堆区数据 程序员管理释放
	//delete
	delete p;
	cout << *p << endl;
}

 给变量起别名 

 数据类型  &别名=原名
 C++ 语法规定:引用一旦初始化,使用它时永远不需要加 *,也不需要加 &,直接把它当成原来的变量用就行。引用必须初始化

int a = 10;
int& b = a;

cout << a << endl;
cout << b << endl;
b = 100;
cout << a << endl;
cout << b << endl;
int c = 20;
b = c;//这只是赋值20,但abc的值就都为20了 引用之后,ab就是同一块内存了。
swap(a, b);
cout << a << endl;
cout << b << endl;

常量引用

    用来修饰形参 防止误操作

const int& ref = 10

引用必须引一块合法的内存空间,这个形参就改不了

void showValue(const int&val)

函数默认参数

传了就用传了的,没有就用默认。形参的默认值从前到后都得有

如果函数声明有默认参数,函数实现就不能有默认参数,声明和实现只能有一个默认参数  

a=12,b=6,c=20

 int sum(int a ,int b=100,int c=20)
func3(12, 6);

函数占位参数

占位还可以有默认参数 只有类型声明、没有变量名的函数形参。

void func3(int a,int) {
	cout <<"this is func" << endl;
}

重载函数中的引用

int &和const int& 是不同的
fun4(变量)调用的是上面的函数 fun4(10)调用的就是下面的。变量和常量的区别

void func4(int& a) {

}
void func4(const int& a) {
	
}

函数重载碰到默认参数

func5(10)出现歧义了,要避免,重载就不要写默认参数了

void func5(int a) {

}
void func5(int a,int b = 10) {

}

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐