【C++】C++基础知识
C++基础
1. 指针
1.1 定义与使用
- 指针在内存中占多少字节?
指针在32位操作系统中占4个字节,在64位操作系统中占8个字节。
- 定义指针的两种方式如下
/**
* 定义指针的两种形式
*/
// 1.
int a = 10;
int *p;
p = &a;
// 2.
int *p2 = &a;
1.2 空指针与野指针
- 空指针
空指针:指针变量指向内存中编号为0的空间。0~255的内存编号是系统占用的,因此不可以访问。
用途:初始化指针变量。
注意:空指针指向的内存空间是不可以访问的。
/**
* 空指针
*/
int *p_NULL = NULL;
*p_NULL = 100;
cout << *p_NULL;
- 野指针
野指针:指针变量指向非法的内存空间。
/**
* 野指针
*/
int *p_wild = (int *)0X1100;
cout << *p_wild << endl;
1.3 const 修饰指针
- const修饰指针——常量指针
指针指向可以改,但指针指向变量值不可改
/**
* const修饰指针——常量指针
*/
int a,b;
const int * p=&a //常量指针
//那么分为一下两种操作
*p=9;//操作错误
p=&b;//操作成功
- const修饰常量——指针常量
指针指向不可以改,但指向指向变量值可以改
/**
* const修饰常量——指针常量
*/
int a,b;
int * const p=&a //指针常量
//那么分为一下两种操作
*p=9;//操作成功
p=&b;//操作错误
- const既修饰指针又修饰常量
指针指向不可以改,指向指向变量值也不可以改
/**
* const既修饰指针又修饰常量
*/
const int * const p_3 = &a;
口诀:左数右指
1.4 指针与数组
利用指针访问数组
/**
* 指针访问数组
*/
int arr_0[] = {0, 1, 2, 3, 4, 5};
int * p_arr = arr_0;
cout << *(p_arr + 1) << endl;
p_arr++;
cout << *p_arr;
1.5 指针与函数
利用指针作为函数参数,可以修改实参的值
2. 结构体
2.1 定义
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
2.2 结构体定义和使用
语法:
struct 结构体名称 {结构体成员列表};
通过结构体创建变量的方式有三种:
- struct 结构体名称 变量名
- struct 结构体名称 变量名 =
- 定义结构体时顺便创建变量(不建议使用,自己写的时候可以使用,不利于多人共同开发)
Examples:
#include "iostream"
using namespace std;
struct Student{
string id;
string name;
int age;
float score;
}student_3;
int main(){
// 1. struct 结构体名称 变量名
struct Student student_1;
// Student student_1;也可以
student_1.id = "110";
student_1.name = "Jon";
student_1.age = 19;
student_1.score = 100;
// 2. struct 结构体名称 变量名 = {成员1值,成员2值}
struct Student student_2 = {"12138", "July", 18, 98};
// Student student_2 = {"12138", "July", 18, 98}; 也可以
// 3. 定义结构体时顺便创建变量,上边的student_3即是这种创建方式
student_3.id = "120";
student_3.name = "Mick";
student_3.age = 20;
student_3.score = 101;
cout << student_1.id << endl << student_1.name << endl << student_1.age << endl << student_1.score << endl;
cout << student_2.id << endl << student_2.name << endl << student_2.age << endl << student_2.score << endl;
cout << student_3.id << endl << student_3.name << endl << student_3.age << endl << student_3.score << endl;
return 0;
}
2.3 结构体数组
作用:将自定义的结构体放入到数组中方便维护
语法:
struct 结构体名 数组名[元素个数] = {{}, {}, ..., {}};
Examples:
/**
* 结构体数组
*/
struct Student stuArray[3] = {
{"001", "stu1", 18, 99},
{"002", "stu2", 19, 99.9},
{"003", "stu3", 20, 99},
};
// 给结构体数组元素赋值
stuArray[1].score = 100;
//遍历结构体数组
for(int i = 0; i < 3; i++){
cout << "id:" << stuArray[i].id
<< " name:" << stuArray[i].name
<< " age:" << stuArray[i].age
<< " score:" << stuArray[i].score
<< endl;
}
2.4 结构体指针
作用:通过指针访问结构体中的成员。利用操作符->
可以通过结构体指针访问结构体属性。
Examples:
/**
* 结构体指针
*/
struct Student student_pointer = {"010", "stu10", 8, 9};
struct Student * p = & student_pointer;
cout << "id:" << p->id << endl;
2.5 结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体。
例如:每个老师辅导一名学生,一个老师的结构体中,记录一个学生的结构体。
Examples:
struct Student{
string id;
string name;
int age = 0;
float score = 0;
}student_3;
struct Teacher{
string id;
string name;
struct Student stu;
};
2.6 结构体做函数参数
作用:将结构体作为函数参数向函数中传递。
传递方式有两种:
- 值传递
- 地址传递
Examples:
//值传递
void swapStudentScoreFun1(struct Student stu1, struct Student stu2){
float temp;
temp = stu1.score;
stu1.score = stu2.score;
stu2.score = temp;
return;
}
//地址传递
void swapStudentScoreFun2(struct Student * stu1, struct Student * stu2){
float temp;
temp = stu1->score;
stu1->score = stu2->score;
stu2->score = temp;
return;
}
int main(){
/**
* 结构体做函数参数
*/
struct Student stu1, stu2;
stu1 = {"1", "stu1", 18, 99};
stu2 = {"2", "stu2", 18, 88};
swapStudentScoreFun1(stu1, stu2);
cout << "id:" << stu1.id << " name:" << stu1.name << " age:" << stu1.age << " score:" << stu1.score << endl;
cout << "id:" << stu2.id << " name:" << stu2.name << " age:" << stu2.age << " score:" << stu2.score << endl;
swapStudentScoreFun2(&stu1, &stu2);
cout << "id:" << stu1.id << " name:" << stu1.name << " age:" << stu1.age << " score:" << stu1.score << endl;
cout << "id:" << stu2.id << " name:" << stu2.name << " age:" << stu2.age << " score:" << stu2.score << endl;
}
2.7 结构体中const的使用场景
作用:用const来防止误操作。
void printStructStudent(const struct Student * stu){
//在传参处写上const后,无法对传入的stu进行修改,只能读取
// stu->score = 100;
cout << stu->id << endl << stu->name << endl << stu->age << endl << stu->score << endl;
return;
}