结构体指针
struct student
{
string name;
int age;
}
int main()
{
1.创建学生结构体变量
struct student s={"张三",18};
一般会简便写成 student s={"张三",18};
2.通过指针指向结构体变量
struct student*p=&s;
一般会简便写成 student*p=&s;
结构体使用时候 s.name
指针使用时候 p->name
}
结构体嵌套结构体
struct student ( 被嵌套的要写到上面)
{
string name;
int age;
int score;
}
struct teacher
{
int id;
int age;
struct student stu;
}
int main()
{
teacher t;
t.id=10;
t,age=28;
t.stu.name="小王"
}
结构体做函数参数和变量一样,分为值传递(正常写)和引用传递(struct student * stu),将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来
结构体中const
用来将结构体改为只读,在函数使用结构体的时候的形参改为 const student *s,可以防止误操作改变struct的值
C++内存的分区模型
- 代码区:存放函数体的二进制代码,由操作系统进行管理
- 全局区:存放全局变量和静态变量以及常量
- 栈区:由编译器自动分配释放,存放函数的参数值(形参),局部变量等 局部变量地址不要返回!不要return局部变量,只有第一次使用的时候是有的,因为编译器做了一次保留,第二次就变成乱码了,但是new过之后的局部变量不会被释放
- 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收 c++中利用new可以把变量开辟到堆区
int *func()
{
int*p=new int(10);
return p;
}
new关键字返回该数据类型的指针
C++引用(起别名)
数据类型 &别名=原名 别名可以是原名,即引用传递 就是c#里的ref,需要函数命名时候 void example (int &a,int &b) ,这样外面的a和b就相当于被这里引用,他们改变的值指向同一内存地址,example 里a,b的改变外面的a,b也相应改变
int &b=a;
使用时,必须要初始化,且初始化之后不能改变
引用做函数的返回值
不要返回局部变量的引用
int & test()
{
int a=10; //局部变量是在栈里的,只有new才会到堆里,所以是非法操作
return a;
}
函数的调用可以作为左值 即可以写 test()=1000;
int & test()
{
static int a=10; //静态变量存放在全局区,全局区系统结束之后才会释放,也就是会内存增加,一直存在,直到程序结束
return a;
}