第一部分 C++基礎入門
目錄
1,C++初始
1.1變量
作用:給一段指定的內存空間起名,方便操作這段內存。
語法:數據類型 變量名=初始值
int a=10;
1.2常量
作用:用於記錄程序中不可更改的數據
兩種方式
- #define 宏定義:#define 常量名 常量值(通常在文件上方定義,表示一個常量)
- const修飾的變量:const 數據類型 常量名=常量值(通常在變量定義前加上關鍵字const,修飾該變量爲常量,不可更改)
#define a 10
const int b=10;
1.3關鍵字
作用:關鍵字是C++中預先保留的單詞(標識符)
在定義變量或者常量的時候,不要用關鍵字,否則會產生歧義
int char long if case const define
1.4標識符命名規則
作用:C++規定給標識符(常量,變量)命名時,遵循一定的規則
- 標識符不能是關鍵字
- 標識符只能由字母,數字,下劃線組成
- 第一個字母必須是字母或下滑線
- 標識符中字母區分大小寫
int int=10;(錯誤)
int a=10; int a1=10; int a1_=10;(正確) int a*=10(錯誤)
int b1=10; int _1=10; (正確) int _1=10(錯誤)
int c=10不代表此時C=10
2,數據類型
在創建一個變量或者常量時,必須要指出相應的數據類型,否則無法給變量分配內存(數據類型就是爲了分配合適的空間)
2.1整型
作用:整型變量表示的是整數類型的數據
C++中能夠表示整型的類型有以下幾種方式,區別在於所佔內存空間不同
short(短整型) 2字節 -2^15——2^15-1 int(整型) 4字節 -2^31——2^31-1 long(長整型) windows爲4,linux下32位4,64位8 -2^31——2^31-1 long long(長長整型) 8字節 -2^63——2^63-1 (1字節 = 二進制8位 / 十進制3位 / 十六進制2位)
2.2sizeof關鍵字
作用:利用sizeof關鍵字可以統計數據類型所佔內存大小
語法:sizeof(數據類型/變量)
int a=10;
可以得出:sizeof(int)=4,sizeof(a)=4
2.3實型(浮點型)
作用:用於表示小數
浮點型變量分爲兩種
- 單精度float
- 雙精度double
float 4字節 7位有效數字 double 8字節 15-16位有效數字 有效數字是指在一個數中,從該數的第一個非零數字起,直到末尾數字稱爲有效數字,如0.123的有效數字是123。
float a=3.14f;(float類型定義的數據最好後面加上f,這樣和double形成區別)
科學計數法
float a=1e2; //1*10^2
float b=1e-2; //1*0.1^2
2.4字符型
作用:字符型變量用於顯示單個字符
語法:char ch='a';(用單引號,單引號內只能有一個字符,不能是字符串)
- C和C++中字符型變量只佔1個字節
- 字符型變量並不是把字符本身放到內存中存儲,而是將對應的ASCLL編碼放到儲存單元
主要就記住A=65,a=97
2.5轉義字符
作用:用於表示一些不能顯示出來的ASCLL字符
現階段我們常用的轉義字符有:\n(技術太差,我就用這一個);\\(想要輸出'\',就需要用\\;cout<<"\\");\t正常8位
2.6字符串類型
作用:用於表示一串字符
兩種風格:
C風格字符串:char 變量名[]="字符串值"
C++風格字符串:string 變量名=“字符串值”(需要加上#include<string>頭文件)
char a[]="abcdef";
string b="abcdef";
2.7布爾類型
作用:布爾數據類型代表真或假的值
bool類型只有兩個值(只要是非0的值都代表真)
- true——真(本質是1)
- false——假(本質是0)
bool類型只佔1個字節大小
注意:使用bool類型的時候,初始化時一定要賦初值,不然輸出結果爲204。因爲程序在Debug模式下,未對變量初始化,寫入內存的是0xcc ,所以最後顯示的結果爲204。如果已經賦初值,則結果纔是1或者0。
3,運算符
作用:用於執行代碼的運算
算數運算符 | 用於處理四則運算 |
賦值運算符 | 用於將表達式的值賦給變量 |
比較運算符 | 用於表達式的比較,並返回一個真值或假值 |
邏輯運算符 | 用於根據表達式的值返回真值或假值 |
3.1算術運算符
作用:用於處理四則運算(除了正常的正負加減乘,下面介紹一些常用的)
- “ / ” 除(兩個數相除,取整數部分,且除數不爲零)
int a=10,b=5,c=3; 可以得出a/b=2,a/c=3;
- “ % ” 取模(兩個數相除,取餘數部分)
int a=10,b=5,c=3; 可以得出a%b=0,a%c=1;
- “ ++ ” 前置遞增(先自增,後運算)
int a=10,b; b=++a; 則b=11,a=11;
- “ ++ ” 後置遞增(先運算,後自增)
int a=10,b; b=a++; 則b=10,a=11;
- “ -- ” 前置遞減(先自增,後運算)
int a=10,b; b=--a*2; 則b=18,a=9;
- “ -- ” 後置遞減(先運算,後自增)
int a=10,b; b=a--*2; 則b=20,a=9;
3.2賦值運算符
作用:用於將表達式的值賦給變量
運算符 | 術語 | 示例 | 結果 |
= | 賦值 | a=b | a=b |
+= | 加等於 | a+=b | a=a+b |
-= | 減等於 | a-=b | a=a-b |
*= | 乘等於 | a*=b | a=a*b |
/= | 除等於 | a/=b | a=a/b |
%= | 模等於 | a%=b | a=a%b |
3.3比較運算符
作用:用於表達式的比較,並返回一個真值或假值
int a=1,b=2; | |||
運算符 | 術語 | 示例 | 結果 |
== | 相等於 | a==b | 0 |
!= | 不等於 | a!=b | 1 |
< | 小於 | a<b | 1 |
> | 大於 | a>b | 0 |
<= | 小於等於 | a<=b | 1 |
>= | 大於等於 | a>=b | 0 |
3.4邏輯運算符
作用;用於根據表達式的值返回真值(1)或假值(0)
運算符 | 術語 | 示例 | 結果 |
! | 非 | !a | 如果a爲假,則!a爲真,如果a爲真,則!a爲假 |
&& | 與 | a&&b | 如果a和b都爲真,則結果爲真,否則爲假 |
|| | 或 | a||b | 如果a和b有一個爲真,則結果爲真,二者都爲假時,結果爲假 |
4,程序流程結構
最基本的三種結構:順序結構,選擇結構,循環結構
- 順序結構:程序按順序執行,不發生跳轉
- 選擇結構:依據條件是否滿足,有選擇的執行相應功能
- 循環結構:依據條件是否滿足,循環多次執行某段代碼
4.1選擇結構
4.1.1if語句
作用:執行滿足條件的語句
if語句的三種形式
- 單行格式if語句(滿足條件則執行語句,不滿足則結束):(一條語句)
#include<iostream>
using namespace std;
int main()
{
int a;
cout << "輸入a的值:";
cin >> a;
if (a > 5)
{
cout << "a大於5"<<endl;
}
system("pause");
return 0;
}
- 多行格式if語句( if(條件) {條件滿足執行的語句} else{條件不滿足執行的語句}):(兩條語句)
#include<iostream>
using namespace std;
int main()
{
int a;
cout << "輸入a的值:";
cin >> a;
if (a > 5)
{
cout << "a大於5"<<endl;
}
else
{
cout << "a小於等於5"<<endl;
}
system("pause");
return 0;
}
- 多條件if語句( if(條件1) {條件1滿足執行的語句} else if(條件2) {條件2滿足執行的語句}...else {都不滿足執行語句):(n條語句)
#include<iostream>
using namespace std;
int main()
{
int a;
cout << "輸入a的值:";
cin >> a;
if (a > 15)
{
cout << "a大於15"<<endl;
}
else if (a>10)
{
cout << "a大於10,小於等於15"<<endl;
}
else if (a>5)
{
cout << "a大於5,小於等於10" << endl;
}
else
{
cout << "a小於等於5" << endl;
}
system("pause");
return 0;
}
嵌套if語句:在if語句中,可以嵌套使用if語句,達到更精確的條件判斷
#include<iostream>
using namespace std;
int main()
{
int a;
cout << "輸入a的值:";
cin >> a;
if (a > 15)
{
cout << "a大於15"<<endl;
}
else if (a>10)
{
if (a > 13)
{
cout << "a大於13,小於等於15" << endl;
}
else
{
cout << "a大於10,小於等於13" << endl;
}
}
else if (a>5)
{
cout << "a大於5,小於等於10" << endl;
}
else
{
cout << "a小於等於5" << endl;
}
system("pause");
return 0;
}
4.1.2三目運算符
作用:通過三目運算符實現簡單的判斷
語法:表達式a ? 表達式b:表達式c (如果表達式a的值爲真,則執行b返回b的值;a爲假,則執行c返回C的值)
int a=10,b=5,c; c=(a>b? a:b); 則c等於a的值,等於10;
int a=10,b=5; (a>b ? a:b)=20;則a=20,b=5;
4.1.3 switch語句
語法:
switch ( 變量表達式 )
{
case 常量1 :語句;break;
case 常量2 :語句;break;
...
case 常量n:語句;break;
default :語句;break;
}
#include<iostream>
using namespace std;
int main()
{
int a;
cout << "輸入級別:";
cin >> a;
switch (a)
{
case 3:
cout << "優秀!";
break;
case 2:
cout << "良好!";
break;
case 1:
cout << "及格!";
break;
default:
cout << "差!";
break;
}
system("pause");
return 0;
}
4.2循環結構
4.2.1 while循環語句
作用:滿足循環條件,執行循環語句
語法:while(循環條件){循環語句} :先條件,後語句
(只要循環條件爲真,就執行循環語句)
#include<iostream>
using namespace std;
int main()
{
int a = 1;
while (a <= 10)
{
cout << a << endl;
a++;
}
system("pause");
return 0;
}
4.2.2 do.....while循環語句
作用:滿足循環條件,執行循環語句
語法:do{循環語句} while(循環條件); :先語句,後條件
(與while不同的是,會先執行一次循環語句,再判斷條件)
#include<iostream>
using namespace std;
int main()
{
int a = 1;
do{
cout << a << endl;
a++;
} while (a <= 10);
system("pause");
return 0;
}
4.2.3for循環語句
作用:滿足循環條件,執行循環語句
語法:for(起始表達式;條件表達式;末尾循環體){循環語句;} :表達式中間用分號隔開
#include<iostream>
using namespace std;
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
cout << i << endl;
}
system("pause");
return 0;
}
4.2.4嵌套循環
作用:在嵌套裏面嵌套一層循環
eg:輸出一個10*10的星星方格
#include<iostream>
using namespace std;
int main()
{
int i;
for (i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
{
cout<<" * ";
}
cout << endl;
}
system("pause");
return 0;
}
4.3跳轉語句
4.3.1break語句
作用:用於跳出選擇結構或者循環結構
break使用的時機:
- 出現在switch條件語句中,作用終止case並跳出switch
- 出現在while循環語句中,作用是跳出當前的循環語句
- 出現在嵌套循環中,跳出最近的內層循環語句
4.3.2continue語句
作用:在循環語句中,跳過本次循環中餘下尚未執行的語句,繼續執行下一次循環
4.3.3goto語句(不推薦)
作用:可以無條件跳轉語句
語法:goto 標記;(如果標記的名稱存在,執行到goto語句時,會跳轉到標記的位置)
#include<iostream>
using namespace std;
int main()
{
cout << "aaaa" << endl;
cout << "bbbb" << endl;
goto AL;
cout << "cccc" << endl;
cout << "dddd" << endl;
AL:
cout << "eeee" << endl;
system("pause");
return 0;
}
5,數組
數組就是一個集合,裏面存放了相同類型的數據元素
- 數組中的每個元素都是相同的數據類型
- 數組是由連續的內存位置組成的
5.1一維數組
5.1.1一維數組的定義方式
三種定義方式
- 數據類型 數組名[數組長度];
- 數據類型 數組名[數組長度]={值1,值2,......};
- 數據類型 數組名[ ]={值1,值2,......}; //系統會根據元素的個數,自己計算出數組的大小
#include<iostream>
using namespace std;
int main()
{
int a[5];
for (int i=0; i < 5; i++)
{
cout << a[i];
}
cout << endl;
int b[5] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++)
{
cout << b[i];
}
cout << endl;
int c[] = { 1, 2, 3, 4, 5 }; //自己會計算出數組的大小
cout << endl; for (int i = 0; i < 5; i++)
{
cout << c[i];
}
cout << endl;
system("pause");
return 0;
}
5.1.2一維數組組名
一維數組名稱的用途:
- 可以統計整個數組在內存中的長度
- 可以獲取數組在內存中的首地址
#include<iostream>
using namespace std;
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
cout << "數組長度爲" << sizeof(a) << endl;
cout << "數組個數爲" << sizeof(a) / sizeof(int) << endl;
cout << "a的地址爲" << a << endl;
cout << "a[0]的地址爲" << &a[0] << endl;
system("pause");
return 0;
}
5.2二維數組
就是在一維數組上多加了一個維度
5.2.1二維數組的定義方式
四種方法
- 數據類型 數組名[行數][列數];
- 數據類型 數組名[行數][列數]={{值1,值2},{值3,值4}};(推薦,更加直觀)
- 數據類型 數組名[行數][列數]={值1,值2,值3,值4};
- 數據類型 數組名[ ][列數]={值1,值2,值3,值4}; (此處也是系統會根據元素個數,自動算出行數大小)
#include<iostream>
using namespace std;
int main()
{
//數據類型 數組名[行數][列數];
int a[2][2];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
cout << a[i][j];
}
}
cout << endl;
//數據類型 數組名[行數][列數]={{值1,值2},{值3,值4}};(推薦,更加直觀)
int b[2][2] = { { 1, 2 }, { 3, 4 } };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
cout << b[i][j];
}
}
cout << endl;
//數據類型 數組名[行數][列數]={值1,值2,值3,值4};
int c[2][2] = { 1, 2, 3, 4 };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
cout << c[i][j];
}
}
cout << endl;
//數據類型 數組名[ ][列數]={值1,值2,值3,值4};
int d[][2] = { 1, 2, 3, 4 };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
cout << d[i][j];
}
}
cout << endl;
system("pause");
return 0;
}
5.2.2二維數組組名
- 查看二維數組所佔內存空間
- 獲取二維數組首地址
#include<iostream>
using namespace std;
int main()
{
int a[2][2] = { { 1, 2 }, { 3, 4 } };
cout << "二維數組長度爲" << sizeof(a) << endl;
cout << "二維數組個數爲" << sizeof(a) / sizeof(int) << endl;
cout << "二維數組第一行個數爲" << sizeof(a[0]) / sizeof(int) << endl;
cout << "二維數組的行數爲" << sizeof(a) / sizeof(a[0]) << endl;
cout << "a的地址爲" << a << endl;
cout << "第一數的地址爲" << &a[0][0] << endl;
cout << "第一行的首地址爲" << &a[0] << endl;
cout << "第二行的首地址爲" << &a[1] << endl;
system("pause");
return 0;
}
6,函數
作用:將一段經常使用的代碼封裝起來,減少重複代碼
6.1函數的定義
- 返回值類型
- 函數名
- 參數列表
- 函數體語句
- return表達式
eg:返回值類型 函數名(參數列表)
{ 函數體;
return表達式(根據返回類型確定是否有)
}
int add(int a, int b)
{
return a + b;
}
6.2函數的調用
功能:使用定義好的函數
語法:函數名(參數)
#include<iostream>
using namespace std;
int add(int a, int b)
{
return a + b;
}
int main()
{
int a = 1, b = 2;
cout << "a+b=" << add(a, b) << endl;
system("pause");
return 0;
}
6.3值傳遞
-
值傳遞就是函數調用時實參將數值傳入給形參
-
如果形參發生變化,並不會影響形參
#include<iostream>
using namespace std;
void add(int a, int b)
{
a = 3;
b = 4;
cout << "add函數中a=" << a << endl;
cout << "add函數中b=" << b << endl;
}
int main()
{
int a = 1, b = 2;
add(a, b);
cout << "main函數中a=" << a << endl;
cout << "main函數中b=" << b << endl;
system("pause");
return 0;
}
6.4函數的常見樣式
四種樣式:
- 無參無返
- 有參無返
- 無參有反
- 有參有反
#include<iostream>
using namespace std;
void wuwu()
{
cout << "無參無返" << endl;
}
void youwu(int a)
{
a = 10;
cout << "有參無返" << endl;
}
int wuyou()
{
int a = 11;
return a;
}
int youyou(int a)
{
a = 12;
return a;
}
int main()
{
int a=0;
wuwu();
youwu(a);
a=wuyou();
cout << "有參無返a=" << a << endl;
a = youyou(a);
cout << "有參有返a=" << a << endl;
system("pause");
return 0;
}
6.5函數的聲明
作用:告訴編譯器函數名稱及如何調用函數,函數的實際主體可以單獨定義
- 函數的聲明可以多次,但是函數的聲明只能有一次
void add(int a, int b);
void add(int a, int b);錯誤,只能聲明一次
6.6函數的分文件編寫
作用:讓代碼結構更加清晰
- 創建後綴爲.h的頭文件
- 創建後綴爲.cpp的頭文件
- 在頭文件中寫函數的聲明
- 在源文件中寫函數的定義
7,指針
作用:可以通過指針間接訪問內存
- 內存編號是從0開始記錄的,一般用十六進制數字表示
- 可以利用指針變量保存地址
7.1指針變量的定義和使用
定義語法:數據類型 *變量名
int a=10;
int *p; //定義
p=&a; //指針保存a的地址
指針的使用
&:取地址運算符;(&a即代表取得了a的地址)
*:間接尋址運算符;(*p即代表顯示p這個地址所存的數值)
所以p此時就等於a的地址,*p就代表把p這個地址存的數顯示出來,即*p=a=10;
7.2指針所佔內存空間
sizeof(int *); //等於4
sizeof(char *); //等於4
sizeof(double *); //等於4
不論什麼類型的指針,所佔的內存空間大小都是4
7.3空指針和野指針
空指針:指針變量指向內存中編號爲0的空間
用途初始化指針變量,但是空指針指向的內存不可訪問
野指針:指針變量指向非法的內存空間
int *q = NULL;
cout << *q; //錯誤空指針p不可訪問
int *p=(int *)3000;
cout << *p; //p爲野指針,也不可訪問
7.4const修飾指針
三種情況:
- 常量指針(指針的指向可以修改,但是指針的值不能修改) 即常量表示(const)在指針(*)前:const *
- 指針常量(指針的指向不能修改,但是指針的值可以修改) 即指針(*)在常量表示(const)前:*const
- 修飾指針又修飾常量 const * const
int n = 10,m = 20;
int const *a = &n;
//*a = m; //錯誤常量指針,指針的值不能改變
a = &m;int * const b = &n;
*b = m;
//b = &m; //錯誤指針常量,指針的指向不能更改int const * const c = &n;
7.5指針和數組
作用:利用指針訪問數組中元素
#include<iostream>
using namespace std;
int main()
{
int b[3] = { 1, 2, 3 }; //指針
int *a = b;
cout << "第一個元素爲" << *a << endl;
a++;
cout << "第一個元素爲" << *a << endl;
a++;
cout << "第一個元素爲" << *a << endl;
system("pause");
return 0;
}
7.6指針和函數
作用:利用指針作爲函數參數,可以修改實參的值
#include<iostream>
using namespace std;
void change(int *a,int *b)
{
int swap = *a;
*a = *b;
*b = swap;
}
int main()
{
int a = 1, b = 2;
change(&a, &b);
cout << a << " " << b << endl;
system("pause");
return 0;
}
7.7指針,配合數組和函數
#include<iostream>
using namespace std;
void change(int *a,int len)
{
for (int i = 0; i < len; i++)
{
*a = i + 4;
a++;
}
}
int main()
{
int a[3] = { 1, 2, 3 };
int len = sizeof(a) / sizeof(int);
change(a,len);
int *p = a;
for (int i = 0; i < sizeof(a) / sizeof(int); i++)
{
cout << *p << endl;
p++;
}
system("pause");
return 0;
}
8,結構體
屬於用戶自定義的數據類型,允許用戶存儲不同的數據類型
8.1結構體的定義和使用
語法:struct 結構體名{結構體列表成員};
三種創建變量的方式:
- struct 結構體名 變量名
- struct 結構體名 變量名={成員1值,成員2值}
- 定義結構體時順便創建變量
#include<iostream>
#include<string>
using namespace std;
struct Student
{
int age;
string name;
}s;
int main()
{
Student s1;
s1.age = 10;
s1.name = "張三";
cout << s1.age << " " << s1.name << endl;
Student s2 = { 11, "李四" };
cout << s2.age << " " << s2.name << endl;
s.age = 13;
s.name = "黎明";
cout << s.age << " " << s.name << endl;
system("pause");
return 0;
}
8.2結構體數組
作用:將自定義的結構體放入到數組中方便維護
語法:struct 結構體名 數組名[元素個數]={{},{},{}};
8.3結構體指針
作用:利用指針訪問結構體中的成員
可以看我另一篇博客:鏈接如下
https://blog.csdn.net/qq_46423166/article/details/106274521
8.4結構體嵌套結構體
作用結構體的成員可以是另一個結構體
#include<iostream>
#include<string>
using namespace std;
struct Sorce
{
int math;
int english;
};
struct Student
{
int age;
string name;
Sorce sorce;
}s;
int main()
{
Student s1;
s1.age = 10;
s1.name = "張三";
s1.sorce.english = 80;
s1.sorce.math = 90;
cout << s1.age << endl;
cout << s1.name << endl;
cout << s1.sorce.english << endl;
cout << s1.sorce.math << endl;
system("pause");
return 0;
}
8.5結構體做函數參數
作用:將結構體作爲參數向函數中傳遞(和普通的函數傳參區別不大)
兩種傳參方式
- 值傳遞
- 地址傳遞
void show(Student s1) //值傳遞;形參變,實參不變
void change(Student *s2) //地址傳遞;形參變,實參變
8.6結構體中const使用場景
作用:用const來防止誤操作
當結構體作爲參數時,值傳遞是將實參的數據拷貝一份放到形參中,佔用內存大,效率低;
所以推薦使用地址傳遞,但是爲了防止地址傳遞時,實參被改變,所以引用const來防止被改變
void show(const Student *s1)