1编译软件
Visual Studio
2基本语法
2.1指针
2.1.1指针的使用
//定义一个指针
int a = 10;
int * p;
//让指针记录变量a的地址
p = &a;
cout << "a的地址:" << &a << endl;
cout << "p:" << p << endl;
cout << "p:" << *p << endl;
//使用指针
//可以通过解引用的方式来找到指针
*p = 1000;
cout << "a的地址:" << a << endl;
cout << "p:" << *p << endl;
2.1.2指针的内存
在32位操作系统中占用4字节,在64位操作系统中占用8字节
更改成64位后,指针的内存就是8位了
2.1.3空指针
指针变量指向了内存中编号为0 的空间 用来初始化指针变量,空指针指向的内存是不可以被访问的。
//定义一个指针 指针变量指向内存地址为0的空间
int * p = NULL;
//访问空指针报错 内存编号为0-255为系统占用 不允许用户访问
*p = 100;
cout << "p:" << p << endl;
cout << "*p" << *p << endl;
2.1.4野指针
指针变量指向非法的内存空间
空指针和野指针都不是我们申请的内存空间,都不能访问。
2.1.5 const修饰指针
const修饰指针:常量指针
指针的指向可以修改指针指向的值不可以修改
const修饰常量:指针常量
指针的指向不可以修改但是指针指向的值可以修改
const既修饰指针又修饰常量
指针的指向和指针指向的值都不可以修改
2.1.6指针与数组
2.1.7指针和函数
值传递:不会改变实参
地址传递:会修改实参的值
2.2结构体
2.2.1结构体的定义和创建
用户自定义的数据类型,允许用户存储不同的数据类型
创建使用的几种方式,创建结构体对象的时候可以省略struct,但是定义的时候不能省略
2.2.2结构体数组
将自定义的结构体放入到数组中。
2.2.3结构体指针
关于对象调用成员用”.”还是”->”,看成员在堆还是栈上,在堆中用-> ,在栈中用.
2.2.4结构体嵌套结构体
这里要注意的是想在Teacher里使用Student结构体,必须先创建Student结构体
2.2.5结构体作函数参数
可以看到在地址传递中main函数中的值也发生了改变,在值传递中Main函数中的值没有变
2.2.6结构体中的const使用场景
将函数中的形参改成指针,可以减少内存空间,不会复制新的副本出来。但是为了防止修改了实参中的数据,在数据前加上const就可以解决问题,这样实参就不会被修改了。
2.3引用
作用:给一个变量起别名 数据类型&别名 = 原名
引用后和原名指向同一个内存。
2.3.1引用的注意事项
1 引用必须初始化
2 初始化后不能被改变
2.3.2引用作函数参数
函数传参时,可以利用引用让形参修饰实参,简化指针修改实参
在值传递中,不能改变实参的值,地址传递可以改变实参,引用传递也可以。
2.3.3引用作函数的返回值
引用的本质是一个指针常量,指针的指向不可以修改,但是指针指向的值可以修改。
不要返回局部变量的引用
函数的返回值是一个引用,那么函数的调用可以作为一个左值。
2.3.4常量引用
用来修饰形参防止误操作
引用必须指向一个内存空间,栈区或者堆区,不能是常量区中的。
加一个const常量就可以解决问题,相当于先创建一个temp=10,然后将引用指向temp
int a = 10;
const int & ref = 10; //int temp=10; const int & ref = temp;