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;
}