C++基礎語法-創(chuàng)新互聯(lián)

基礎語法入門

站在用戶的角度思考問題,與客戶深入溝通,找到鹽邊網(wǎng)站設計與鹽邊網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站設計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬空間、企業(yè)郵箱。業(yè)務覆蓋鹽邊地區(qū)。文章目錄
  • 基礎語法入門
    • 一、初識C++
    • 二、數(shù)據(jù)類型
    • 三、運算符
    • 四、程序流程結(jié)構(gòu)
      • 選擇結(jié)構(gòu)
      • 循環(huán)結(jié)構(gòu)
      • 跳轉(zhuǎn)語句
    • 五、數(shù)組
    • 六、函數(shù)
    • 七、指針
    • 八、結(jié)構(gòu)體

黑馬C++學習總結(jié),參考博客:黑馬程序員 C++ 基礎語法入門 學習記錄
建議有基礎的同學直接看博客進行學習,遇到不太懂的地方再去看視頻加深理解

一、初識C++
  • 需要Fn+F5才能調(diào)試
  • system("pause");用來暫停程序進程
  • 變量作用:給一段指定的內(nèi)存空間起名,方便操作這段內(nèi)存
  • 常量作用:用于記錄程序中不可更改的數(shù)據(jù)
    定義方式:
    1. #define宏常量:define 變量名 常量值通常在文件上方定義,不占內(nèi)存空間
    2. #const修飾的變量:const 數(shù)據(jù)類型 常量名 = 常量值通常在變量定義前加關(guān)鍵字const,修飾該變量為常量,占內(nèi)存空間
  • 關(guān)鍵字作用:C++中預先保留的單詞(標識符)。在定義變量或者常量的時候,不要使用關(guān)鍵字。
  • 標識符命名規(guī)則:C++規(guī)定給標識符(變量、常量)命名時,有一套自己的規(guī)則
    • 標識符不能是關(guān)鍵字
    • 標識符只能用字母、數(shù)字、下劃線組合
    • 第一個字符必須是字母或下劃線
    • 標識符中字母區(qū)分大小寫

二、數(shù)據(jù)類型

C++規(guī)定在創(chuàng)建一個變量或者常量時,必須要指定出相應的數(shù)據(jù)類型,否則無法給其分配內(nèi)存

  • 整形
    C++中能夠表示整形的類型有以下幾種方式,區(qū)別在于所占內(nèi)存空間不同:
數(shù)據(jù)類型占用空間取值范圍
short(短整型)2字節(jié) ? 2 15 -2^{15} ?215 ~ 2 15 ? 1 2^{15}-1 215?1
int(整型)4字節(jié) ? 2 31 -2^{31} ?231 ~ 2 31 ? 1 2^{31}-1 231?1
long(長整型)Windows為4字節(jié),32位Linux為4字節(jié),64位Linux位8字節(jié) ? 2 31 -2^{31} ?231 ~ 2 31 ? 1 2^{31}-1 231?1
long long(長長整型)8字節(jié) ? 2 63 -2^{63} ?263 ~ 2 63 ? 1 2^{63}-1 263?1

計算機使用二進制計數(shù)來記錄信息,1字節(jié)=8字(1B=8bit)。比如int類型,4個字節(jié)占32個字,第一位用來表示符號位,其余的31位用來表示數(shù)值。因為0既不是正數(shù)也不是負數(shù),它占用了0000(十六進制0)的位置,因此正數(shù)個數(shù)比負數(shù)少一個,才多了-1。

取值越界就好比十進制運算,給計算機分配了一個字,現(xiàn)在1+9需要進位,但因為只有一個字,所以1+9=0。ex:

short num = 32768;
cout<< num<< endl; // 輸出的是-32768

計算機二進制運算中,負數(shù)由補碼形式表示。正數(shù)的原碼、反碼、補碼都是本身,負數(shù)的補碼是反碼+1。
[+1] = [00000001]= [00000001]= [00000001]
[-1] = [10000001]= [11111110]= [11111111]
最小的負整數(shù) -32768,計算機中二進制標示:10000000 00000000
最小負整數(shù)-32768加1之后,在計算機中的表示就是:10000000 00000001,對應的值就是 -215-1),即-32767。然后一直加1,直到11111111 11111111,對應的值就是-1,再加1,就變成了1 00000000 00000000,即17位,而short類型只讀取16位,所以-1+1=0。00000000 00000000一直加1,加到01111111 11111111,就變成了short類型的大整數(shù)32767。再加1,就變成了10000000 00000000,即最小負數(shù):-32768。

小結(jié):正數(shù)大值加1后產(chǎn)生越界,第一位符號位由原來符號類型轉(zhuǎn)變?yōu)榱硪活愋?,此時若正數(shù)轉(zhuǎn)換為負數(shù),負數(shù)數(shù)值將以補碼形式表示。

  • sizeof關(guān)鍵字作用:統(tǒng)計數(shù)據(jù)類型所占內(nèi)存大小
int num = 1;
cout<< sizeof(num)<< endl; // 4字節(jié)
cout<< sizeof(long)<< endl; // 4字節(jié)
  • 實型(浮點型)作用:用于表示小數(shù)
    浮點型變量分為兩種:
    1. 單精度float
    2. 雙精度double

兩者的區(qū)別在于表示的有效數(shù)字范圍不同。有效數(shù)字包括整數(shù)和小數(shù)部分。

數(shù)據(jù)類型占用空間有效數(shù)字范圍
float4字節(jié)7位有效數(shù)字
double8字節(jié)15~16位有效數(shù)

為什么float是7位呢?因為4字節(jié)=32位。1位符號位,8位指數(shù)位,23位尾數(shù)位。 2 23 2^{23} 223=8388608,一共七位。符號位0表示正數(shù),1表示負數(shù)。符號位之后的指數(shù)位,決定了數(shù)字的范圍。指數(shù)位之后的尾數(shù)位,決定了數(shù)字的精度(即保留幾位數(shù)或有效數(shù)字)

數(shù)據(jù)類型符號位指數(shù)位尾數(shù)位
float第31位(占1bit)第30-23位(占8bit)第22-0位(占23bit)
double第63位(占1bit)第62-52位(占11bit)第51-0位(占52bit)

以double為例,雙精度浮點型的數(shù)轉(zhuǎn)化為二進制的數(shù)保存,讀取時根據(jù)指數(shù)位和尾數(shù)位的值轉(zhuǎn)化成雙精度浮點數(shù)。
比如說存儲8.8125這個數(shù),它的整數(shù)部分的二進制是1000,小數(shù)部分的二進制是1101.這兩部分連起來是1000.1101,但是存儲到內(nèi)存中小數(shù)點會消失,因為計算機只能存儲0和1。
1000.1101這個二進制數(shù)用科學計數(shù)法表示是1.0001101 * 2 3 2^{3} 23,這里的3(0011)即為指數(shù)
現(xiàn)在符號位是0,尾數(shù)位就是科學計數(shù)法小數(shù)部分的0001101。指數(shù)位用來存儲科學計數(shù)法的指數(shù),此處為3。指數(shù)位有正負,11位指數(shù)位表示的指數(shù)范圍是-1023 ~ 1024
可以判斷數(shù)值的大值為53位二進制的大值: 2 53 2^{53} 253 - 1
ps: 科學計數(shù)法中小數(shù)點前的1可以省略,因為這一位永遠是1。0.5的二進制科學計數(shù)為1.00 * 2 ? 1 2^{-1} 2?1

兩個浮點數(shù)相加可能會產(chǎn)生誤差。比如比如 0.1 + 0.2 的結(jié)果是 0.30000000000000004
這是因為 0.1 和 0.2 用二進制表示時為 0.0001 1001 1001 1001…(1100循環(huán)) 和 0.0011 0011 0011 0011…(0011循環(huán))。如果截取于第 52 位,就會得到一個有誤差的結(jié)果。ex:

int main()
{//默認情況下,輸出一個小數(shù),會顯示6位有效數(shù)字
	float f1 = 3.1415926f; //不加f默認是double類型。刪掉f,鼠標放在3.14可以查看類型
	double d1 = 3.1415926;

	cout<< "f1="<< f1<< endl;
	cout<< "d1="<< d1<< endl;

	//統(tǒng)計float和double占用內(nèi)存空間
	cout<< "float所占內(nèi)存空間為:"<< sizeof(f1)<< "字節(jié)"<< endl;
	cout<< "double所占內(nèi)存空間為:"<< sizeof(d1)<< "字節(jié)"<< endl;

	//科學計數(shù)法
	float f2 = 3e2;		//3*10^2
	float f3 = 3e-2;	//3*10^-2

	cout<< "f2="<< f2<< endl;
	cout<< "f3="<< f3<< endl;
	system("pause");
	return 0;
}
// 輸出
f1=3.14159
d1=3.14159
float所占內(nèi)存空間為:4字節(jié)
double所占內(nèi)存空間為:8字節(jié)
f2=300
f3=0.03

小結(jié):float變量不加f默認是double類型。

  • 字符型:在顯示字符型變量時,用單引號將字符括起來,不要用雙引號。單引號內(nèi)只能有一個字符,不可以是字符串。

    • C和C++中字符型變量只占用一個字符
    • 字符型變量并不是把字符本身放到內(nèi)存中存儲,而是將對應的ASCII碼放在存儲單元中
      • ASCII非打印控制字符:ASCII表上的數(shù)字0-31分配給了控制字符,用于控制像打印機等外圍設備
      • ASCII打印控制字符:數(shù)字32-126分配給了能在鍵盤上找到的字符,當查看或打印文檔時就會出現(xiàn)
  • 轉(zhuǎn)義字符作用:用于表示一些不能顯示出來的ASCII字符

int main()
{//反斜杠 錯誤,cout<< "\"<< endl;
	cout<< "\\"<< endl;
	
	//水平制表符	\t占八個字符,包括\t之前的字符個數(shù)	優(yōu)點是數(shù)據(jù)輸出整齊
	cout<< "123\tHelloWorld"<< endl;
	cout<< "12345\tHelloWorld"<< endl;

	//換行符 兩個效果相同
	cout<< "Hello\n" ;
	cout<< "Hello"<< endl;

	system("pause");
	return 0;
}
// 輸出
\
123    HelloWorld
12345   HelloWorld
Hello
Hello
  • 字符串型作用:用于表示一串字符
    兩種風格:
    1. C語言風格字符串:char 變量名[] = “字符串值”;
    2. C++風格字符串:string 變量名 = “字符串值”;
// 1.C語言風格字符串 char 字符串名[] = "xx"
//注意:等號后面要用雙引號 包含起來字符串
char str[] = "Hello World";

// 2.C++風格字符串 用C++風格字符串時,要包含“#include”頭文件(但std命名空間包含std::string)
string str2 = "Hello World";
  • 布爾類型作用:代表真或假的值,占1字節(jié),編譯器中輸出true的值為1,false為0
  • 數(shù)據(jù)的輸入作用:用于從鍵盤獲取數(shù)據(jù)。關(guān)鍵字:cin語法:cin >>變量

三、運算符

作用:用于執(zhí)行代碼的運算
主要分為以下四類:算術(shù)運算符、賦值運算符、比較運算符、邏輯運算符

  1. 算術(shù)運算符:四則運算
    • 除法運算中除數(shù)不能為0,兩個整數(shù)相除小數(shù)部分被去除
    • 取模運算除數(shù)不能為0,且小數(shù)不能做取模運算
    • 前置遞增先讓變量+1然后進行表達式運算,后置遞增先讓表達式運算再讓變量+1
  2. 賦值運算符:用于將表達式的值賦值給變量
  3. 比較運算符:用于表達式的比較,并返回一個真值或假值 ex:4<3輸出0
  4. 邏輯運算符:用于根據(jù)表達式的值返回真值或假值
    邏輯非!,邏輯與&&,邏輯或||,在C++中除了0都為真

四、程序流程結(jié)構(gòu)

C/C++支持最基本的三種程序運行結(jié)構(gòu):

  • 順序結(jié)構(gòu):程序按順序執(zhí)行,不發(fā)生跳轉(zhuǎn)
  • 選擇結(jié)構(gòu):依據(jù)條件是否滿足,有選擇地執(zhí)行相應功能
  • 循環(huán)結(jié)構(gòu):依據(jù)條件是否滿足,循環(huán)多次執(zhí)行某段代碼
選擇結(jié)構(gòu)
  • if語句:執(zhí)行滿足條件的語句

    • 單行各式if語句(if條件后不加分號):if (條件) {條件滿足執(zhí)行的語句}
    • 多行if語句:if (條件) {條件滿足執(zhí)行的語句} else {條件不滿足執(zhí)行的語句}
    • 多條件if語句(或if嵌套if語句):if (條件1) {條件1滿足執(zhí)行的語句} else if(條件2) {條件2滿足執(zhí)行的語句}…else {都不滿足執(zhí)行的語句}
      ex:
    #includeusing namespace std;
    
    // 判斷三個人體重
    int main()
    {int w1, w2, w3;
    
    	cout<< "A weight:"<< endl;
    	cin >>w1;
    	cout<< "B weight:"<< endl;
    	cin >>w2;
    	cout<< "C weight:"<< endl;
    	cin >>w3;
    
    	if (w1 >w2) {if (w1 >w3)
    			cout<< "A最重"<< endl;
    		else
    			cout<< "C最重"<< endl;
    	}
    	else
    	{if (w2 >w3)
    			cout<< "B最重"<< endl;
    		else
    			cout<< "C最重"<< endl;
    	}
    	
    	system("pause");
    	return 0;
    }
  • 三目運算符:通過三目運算符實現(xiàn)簡單的判斷
    語法:表達式1 ?表達式2 :表達式3

c = (a >b ? a : b);
(a >b ? a : b) = 100; // C++中的三目運算符返回的是變量,可以繼續(xù)賦值
  • switch語句:執(zhí)行多條件分支語句(注意break的使用)
#includeusing namespace std;

int main()
{//1.提示用戶給電影評分
	cout<< "請給電影打分"<< endl;

	//2.用戶開始進行打分
	int score;
	cin >>score;
	cout<< "您打的分數(shù)為:"<< score<< endl;

	//3.根據(jù)用戶輸入的分數(shù)來提示用戶最后的結(jié)果
	switch (score)
	{case(10):
	case(9):
		cout<< "您認為是經(jīng)典電影"<< endl;
	case(8):
	case(7):
		cout<< "您認為電影非常好"<< endl;
	case(6):
	case(5):
		cout<< "您認為電影一般"<< endl;
		break;
	default:
		cout<< "您認為電影是爛片"<< endl;
		break;
	}

	system("pause");
	return 0;
}

輸出

請給電影打分
10
您打的分數(shù)為:10
您認為是經(jīng)典電影
您認為電影非常好
您認為電影一般
請按任意鍵繼續(xù). . .

小結(jié):
switch缺點:判斷時候只能是整型或者字符型,不可以是一個區(qū)間
switch優(yōu)點:結(jié)構(gòu)清晰,執(zhí)行效率高
注意break:case里如果沒有break那么程序會一直執(zhí)行,執(zhí)行break則會跳出switch

循環(huán)結(jié)構(gòu)
  • while循環(huán)語句
    作用:滿足循環(huán)條件,執(zhí)行循環(huán)語句
    語法:while (循環(huán)條件) {循環(huán)語句}
    解釋:只要滿足循環(huán)條件結(jié)果為真,就執(zhí)行循環(huán)語句
    注意:在執(zhí)行循環(huán)語句的時候,程序必須提供跳出循環(huán)的出口,否則出現(xiàn)死循環(huán)
    ex:猜數(shù)字
#includeusing namespace std;

int main()
{// 添加隨機數(shù)種子配合rand,利用當前系統(tǒng)時間生成隨機數(shù),防止每次隨機數(shù)都一樣
	srand((unsigned int)time(NULL));

	// 1. 系統(tǒng)生成隨機數(shù)
	int num = rand() % 100 + 1; // 生成100個隨機數(shù),區(qū)間為0+1~99+1
	
	int guess;
	cout<< "游戲開始,猜數(shù)吧"<< endl;

	while (1)
	{cin >>guess;
		if (guess >num)
			cout<< "猜大了"<< endl;
		else if (guess< num)
			cout<< "猜小了"<< endl;
		else
		{	cout<< "猜對了"<< endl;
			break; // while(1)需要用break來退出循環(huán)
		}
	}

	system("pause");
	return 0;
}
  • do…while循環(huán)語句
    作用:滿足循環(huán)條件,執(zhí)行循環(huán)語句
    語法:do{循環(huán)語句} while{循環(huán)條件}
    注意:與while的區(qū)別在于do…while會執(zhí)行一次循環(huán)語句,再判斷循環(huán)條件
int main()
{//1.先打印所有三維數(shù)字
	int num = 100;
	int a, b, c;	//代表個位、十位、百位
	do
	{,. 
        //2.從所有三位數(shù)字中找到水仙花數(shù)
		a = num % 10;		//獲取數(shù)字的個位
		b = num / 10 % 10;	//獲取數(shù)字的十位
		c = num / 100;		//獲取數(shù)字的百位
		if (a*a*a + b * b*b + c * c*c == num)	//如果是水仙花數(shù)才打印
			cout<< num<< " ";
		num++;
	} while (num< 1000);

	system("pause");
	return 0;
}
  • for循環(huán)語句
    作用:滿足循環(huán)條件,執(zhí)行循環(huán)語句
    語法:for {起始表達式;條件表達式;末尾循環(huán)體} {循環(huán)語句;}
    ex:拆分for
int main()
{//for循環(huán)
    //從數(shù)字0 打印到 數(shù)字9
    int i = 0;
    for ( ; ; )
    {if(i>=10)
            break;
        cout<< i<< endl;
        i++;
    }

    system("pause");
    return 0;
}
  • 循環(huán)嵌套
    作用:在循環(huán)體中再嵌套一層循環(huán),解決一些實際問題
    例如我們打印一個10x10的矩陣
for (int i = 0; i< 10; i++)
{for (int j = 0; j< 10; j++)
	{cout<< "* ";
	}
	cout<< '\n';
}

ex:九九乘法表

for (int i = 1; i< 10; i++)
{for (int j = 1; j<= i; j++)
	{cout<< j<< '*'<< i<< '*'<< j * i<< '\t';
	}
	cout<< '\n';
}
跳轉(zhuǎn)語句
  • break語句
    作用:用于跳出選擇結(jié)構(gòu)或者循環(huán)結(jié)構(gòu)
    使用時機:
    • 出現(xiàn)在switch條件語句中,作用是終止case并跳出switch
    • 出現(xiàn)在循環(huán)語句中,作用是跳出當前循環(huán)語句
    • 出現(xiàn)在嵌套循環(huán)中,跳出最近的內(nèi)層循環(huán)語句

ex:

#includeusing namespace std;

int main()
{cout<< "請選擇副本難度"<< endl;
	cout<< "1.簡單"<< "\t"<< "2.普通"<< "\t"<< "3.困難"<< endl;

	int select;
	cin >>select;
	switch (select)
	{case 1:
		cout<< "進入簡單模式"<< endl;
		break;
	case 2:
		cout<< "進入普通模式"<< endl;
		break;
	default:
		cout<< "進入困難模式"<< endl;
		break;
	}

	system("pause");
	return 0;
}
  • continue語句
    作用:在循環(huán)語句中,跳過本次循環(huán)中余下尚未執(zhí)行的語句,繼續(xù)執(zhí)行下一次循環(huán)
int main()
{//continue語句
	for (int i = 0; i<= 100; i++) // 注意這里只有一層循環(huán),所以break會直接退出
	{//如果是奇數(shù)輸出,偶數(shù)不輸出
		if (i % 2 == 0) 
		{	continue;	//可以篩選條件,執(zhí)行到此就不再向下執(zhí)行,執(zhí)行下一次循環(huán)
			//break會退出循環(huán),而continue不會
		}
		cout<< i<< " ";
	}

	system("pause");
	return 0;
}
  • goto語句
    作用:可以無條件跳轉(zhuǎn)語句
    語法:go to 標記
    解釋:如果標記的名稱存在,執(zhí)行到goto語句時,會跳轉(zhuǎn)到標記的位置
int main()
{cout<< "1.xxx"<< endl;
	goto Flag;
	cout<< "2.xxx"<< endl;
Flag:
	cout<< "4.xxx"<< endl;

	system("pause");
	return 0;
}

輸出

1.xxx
4.xxx

注意:在程序中不建議使用goto語句,以免造成程序混亂!

五、數(shù)組

數(shù)組其實就是一個集合,里面存放了相同類型的數(shù)據(jù)元素
特點1:數(shù)組中的每個數(shù)據(jù)元素都是相同的數(shù)據(jù)類型
特點2:數(shù)組是由連續(xù)的內(nèi)存位置組成的

  • 一維數(shù)組
    三種定義方式:
    1. 數(shù)組類型 數(shù)組名[數(shù)組長度];
    2. 數(shù)組類型 數(shù)組名[數(shù)組長度] = {值1,值2…};
    3. 數(shù)組類型 數(shù)組名[] = {值1,值2…};
int main()
{//數(shù)組命名規(guī)范與變量名命名規(guī)范一致,不要和變量重名 
	//1. 數(shù)組類型 數(shù)組名[ 數(shù)組長度 ];
	int arr[1];
	arr[0] = 50; // 數(shù)組中下標是從0開始索引
	//訪問數(shù)組元素
	cout<< arr[0]<< endl;

	//2.數(shù)據(jù)類型 數(shù)組名[ 數(shù)組長度 ] = { 值1,值2... };
	//如果在初始化數(shù)據(jù)的時候,沒有全部填寫完,會用0來填補剩余數(shù)據(jù)
	int arr2[5] = {10,20,30,40 };
	for (int i = 0; i< 5; i++)
	{cout<< arr2[i]<< " "; // 正常輸出前四個值,最后一個為0
	}
	cout<< endl;

	//3.數(shù)據(jù)類型 數(shù)組名[ ] = { 值1,值2... };
	//定義數(shù)組的時候,必須有初始長度,或?qū)ζ渲辽儋x一個值
	int arr3[] = {10,20,30,40 };
	for (int i = 0; i< 5; i++)
	{cout<< arr3[i]<< " "; // 正常輸出前四個值,最后一個為隨機值
	}
}
  • 一維數(shù)組組名
    用途:
    1. 可以統(tǒng)計整個數(shù)組在內(nèi)存中的長度
    2. 可以獲取數(shù)組在內(nèi)存中的首地址

ex:

int main()
{//數(shù)組名用途
	//1.可以通過數(shù)組名統(tǒng)計整個數(shù)組占用內(nèi)存大小
	int arr[10] = {1,2,3,4,5,6,7,8,9,10 };
	cout<< "整個數(shù)組占用內(nèi)存空間為:"<< sizeof(arr)<< endl;
	cout<< "每個元素占用內(nèi)存空間:"<< sizeof(arr[0])<< endl;
	cout<< "數(shù)組中元素的個數(shù)為:"<< sizeof(arr) / sizeof(arr[0])<< endl; // 求數(shù)組中的元素個數(shù)方法,會經(jīng)常用到

	//2.可以通過數(shù)組名查看數(shù)組首地址
	cout<< "數(shù)組首地址(十六進制)"<< arr<< endl;
	cout<< "數(shù)組首地址(十進制)"<< (int)arr<< endl;
	cout<< "數(shù)組中第一個元素地址為:"<< (int)&arr[0]<< endl;
	cout<< "數(shù)組中第二個元素地址為:"<< (int)&arr[1]<< endl;

	//數(shù)組名是常量,不可以進行賦值操作
	//arr=100;
}

輸出

整個數(shù)組占用內(nèi)存空間為:40
每個元素占用內(nèi)存空間:4
數(shù)組中元素的個數(shù)為:10
數(shù)組首地址(十六進制)0000003AF32FF5D8
數(shù)組首地址(十進制)-214960680
數(shù)組中第一個元素地址為:-214960680
數(shù)組中第二個元素地址為:-214960676

ex1:找出數(shù)組中大值

max = max >arr[i] ? max : arr[i]

ex2:數(shù)組元素逆置

int tmp = arr[start];
arr[start] = arr[end]; // 結(jié)束下標可以用sizeof(arr) / sizeof(arr[0])-1獲得
arr[end] = tmp;
start ++;
end --;
  • 冒泡排序
    依次比較相鄰元素大小并交換,交換過后的大值出現(xiàn)在數(shù)組末尾,每次比較次數(shù)-1求得最末位-1的大值,直至首元素和第二個元素最后一次比較。
int main()
{// 冒泡排序
	int arr[9] = {3, 4, 5, 1, 2, 63, 23, 21, 0 };
	int n = sizeof(arr) / sizeof(arr[0]);

	for (int i = 0; i< n - 1; i++)
	{int tmp = 0;
		for (int j = 0; j< n - i - 1; j++)
		{	if (arr[j] >arr[j + 1])
			{		tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}

	for (int i = 0; i< n; i++)
	{cout<< arr[i]<< " ";
	}

	system("pause");
	return 0;
}
  • 二維數(shù)組
    在一維數(shù)組上多加了一個維度,四種定義方式:
    1. 數(shù)據(jù)類型 數(shù)組名[行數(shù)][列數(shù)];
    2. 數(shù)據(jù)類型 數(shù)組名[行數(shù)][列數(shù)] = {{數(shù)據(jù)1,數(shù)據(jù)2},{數(shù)據(jù)3,數(shù)據(jù)4}};(最直觀)
    3. 數(shù)據(jù)類型 數(shù)組名[行數(shù)][列數(shù)] = {數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3,數(shù)據(jù)4};
    4. 數(shù)據(jù)類型 數(shù)組名[][列數(shù)] = {數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3,數(shù)據(jù)4};
      ex:
int main()
{int arr[][3] = {1, 2, 3, 4, 5, 6 };
	for (int i = 0; i< 2; i++)
	{for (int j = 0; j< 7; j++) // 超出原定行數(shù)或列數(shù)的位置,如果數(shù)組元素足夠可以補全,否則會輸出隨機值
		{	cout<< arr[i][j]<< " ";
		}
		cout<< endl;
	}

	system("pause");
	return 0;
}

輸出

1 2 3 4 5 6 -858993460
4 5 6 -858993460 -858993460 -858993460 -858993460
  • 二維數(shù)組組名
    查看二維數(shù)組所占內(nèi)存空間
    獲取二維數(shù)組首地址
sizeof(arr) // 求二維數(shù)組占用的內(nèi)存空間
sizeof(arr[0]) // 第一行占用的內(nèi)存
sizeof(arr[0][0]) // 第一個元素占用的內(nèi)存
sizeof(arr) / sizeof(arr[0]) // 行數(shù)
sizeof(arr[0]) / sizeof(arr[0][0]) // 列數(shù)

六、函數(shù)
  • 作用:將一段經(jīng)常使用的代碼封裝起來,減少重復代碼
    一個較大的程序,一般分為若干個程序塊,每個模塊實現(xiàn)特點的功能
  • 定義:
    1. 返回值類型:在函數(shù)定義中一個函數(shù)可以返回一個值;如果不需要返回值則用void
    2. 函數(shù)名:給函數(shù)起的名稱
    3. 參數(shù)列表:使用該函數(shù)時傳入的數(shù)據(jù)
    4. 函數(shù)體語句:花括號內(nèi)的代碼,函數(shù)內(nèi)需要執(zhí)行的語句
    5. return表達式:和返回值類型掛鉤,函數(shù)執(zhí)行完后返回相應的數(shù)據(jù);返回值不需要的話可以不寫return
  • 語法:
返回值類型 函數(shù)名 (參數(shù)列表)
{函數(shù)體語句

	return 表達式;
}
  • 調(diào)用:使用定義好的函數(shù)
  • 語法:函數(shù)名(參數(shù))
    函數(shù)定義里小括號內(nèi)成為形參,函數(shù)調(diào)用時傳入的參數(shù)成為實參
  • 值傳遞:函數(shù)調(diào)用時實參將數(shù)值傳入形參的過程,形參改變不會影響實參
  • 函數(shù)的聲明:

如果把函數(shù)寫在main函數(shù)之后,因為程序是按順序執(zhí)行的,所以找不到函數(shù)定義??梢杂煤瘮?shù)聲明來解決

作用:告訴編譯器函數(shù)名稱及如何調(diào)用函數(shù)。函數(shù)的實際主體可以單獨定義
函數(shù)的聲明可以多次,但是函數(shù)的定義只能有一次

ex:

// 聲明
int max(int a, int b);

int main()
{int a = 10;
	int b = 20;

	cout<< max(a, b)<< endl;
	return 0;
}

// 定義
int max(int a, int b)
{return a >b ? a : b;
}
  • 函數(shù)的分文件編寫
    作用:讓代碼結(jié)構(gòu)更清晰
    四步驟:
    1. 創(chuàng)建后綴名為.h的頭文件
    2. 創(chuàng)建后綴名為.cpp的源文件
    3. 在頭文件中寫函數(shù)的聲明
    4. 在源文件中寫函數(shù)的定義

ex:
新建swap.h頭文件

#includeusing namespace std;

// 函數(shù)聲明
void swap(int a, int b);

新建swap.cpp源文件

#include "swap.h"

// 函數(shù)定義
void swap(int a, int b)
{int tmp = a;
	a = b;
	b = tmp;

	cout<< "a ="<< a<< " b ="<< b<< endl;
}

新建函數(shù)的分文件編寫.cpp

#include "swap.h" // 它甚至把這個頭文件里的其他include包含進來了

int main()
{int a = 10;
	int b = 20;
	swap(a, b);

	system("pause");
	return 0;
}

小結(jié):
在頭文件"swap.h",注意添加#include, using namespace std;
在源文件"swap.cpp",注意添加#include “swap.h”,將"swap.cpp"和"swap.h"關(guān)聯(lián)

七、指針
  • 基本概念
    作用:可以通過指針間接訪問內(nèi)存
    • 內(nèi)存編號是從0開始記錄的,一般用十六進制數(shù)字表示
    • 可以利用指針變量保存地址
  • 定義和使用
    指針變量定義語法:數(shù)據(jù)類型 * 變量名
int a = 10;
int * p; // 定義指針
p = &a; // 記錄變量a的地址

*p = 100; // 使用指針,通過解引用的方式來找到指針指向的內(nèi)存中的數(shù)據(jù)
  • 指針所占內(nèi)存空間
    在32位操作系統(tǒng)下,指針占4個字節(jié)空間大小
    在64位操作系統(tǒng)下,指針占8個字節(jié)空間大小
sizeof(int *) // 輸出8(x64) 輸出4(x86)
sizeof(char *) // 輸出8(x64) 輸出4(x86)
  • 空指針和野指針
    空指針:指針變量指向內(nèi)存中編號為0的空間
    用途:初始化指針變量
    注意:空指針指向的內(nèi)存是不可以訪問到
// 1.空指針用于給指針變量進行初始化
int *p = NULL;

// 2.空指針是不可以訪問的
// 0-255之間的內(nèi)存編號是系統(tǒng)占用的,因此不可以訪問
*p = 100;

輸出:
請?zhí)砑訄D片描述

  • 野指針
// 指向內(nèi)存被釋放的內(nèi)存或者沒有訪問權(quán)限的內(nèi)存的指針
int *p = (int *)0x1100; // 訪問不到,因為我們沒有申請這塊內(nèi)存

輸出:
請?zhí)砑訄D片描述

小結(jié):空指針和野指針都不是我們申請的空間,因此不要訪問

  • const修飾指針
    三種情況:
    1. const修飾指針——常量指針
    2. const修飾常量——指針常量
    3. const既修飾指針,又修飾常量

ex:

// 1.常量指針
// 指針指向的值不可以改,指針的指向可以改
int a = 10;
int b = 10;

const int* p = &a;
*p = 20; // 錯誤
p = &b; // 正確

// 2.指針常量
// 指針的指向不可以改,指針指向的值可以改
int *const p2 = &a;
*p2 = 20; // 正確
p2 = &b; //錯誤

// 3.const同時修飾
// 都不可以改
const int * const p3;
  • 指針和數(shù)組
    作用:利用指針訪問數(shù)組元素
    數(shù)組本身就是一個“指針”,記錄內(nèi)存空間地址
int arr[5] = {1, 2, 3, 4, 5};
cout<< arr[0]; // 1

int *p = arr;
cout<< *p; // 1
p ++;
cout<< *p; // 2
  • 指針和函數(shù)
    作用:利用指針作為函數(shù)參數(shù),可以修改實參的值
    如果不想修改實參,就用值傳遞,如果想修改實參,就用地址傳遞
#includeusing namespace std;

void swap(int *a, int *b)
{int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{int a = 10;
	int b = 20;

	swap(a, b); // or swap(&a, &b)
	cout<< "a ="<< a<< " b ="<< b<< endl;
	return 0;
}
  • 指針、數(shù)組、函數(shù)
    對數(shù)組的冒泡排序
#includeusing namespace std;

void bubble(int* arr, int len)
{for (int i = 0; i< len - 1; i++)
	{for (int j = 0; j< len - i - 1; j++)
		{	if (arr[j] >arr[j + 1])
			{		int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

void printArray(int *array, int len) // 因為數(shù)組本身就是一個"指針",如果形參不帶*調(diào)用時會報錯 or 寫成int array[]
{for (int i = 0; i< len; i++)
	{cout<< array[i]<< " ";
	}
}

int main()
{int arr[10] = {4, 3, 2, 5, 1, 2, 6, 8, 9, 8 };
	int len = sizeof(arr) / sizeof(arr[0]);
	
	bubble(arr, len);
	printArray(arr, len); 

	return 0;
}

八、結(jié)構(gòu)體

結(jié)構(gòu)體屬于用戶自定義的數(shù)據(jù)類型,允許用戶存儲不同的數(shù)據(jù)類型

  • 定義和使用
    語法:struct 結(jié)構(gòu)體名 {結(jié)構(gòu)體成員列表}
    通過結(jié)構(gòu)體創(chuàng)建變量的方式有三種:
    • struct 結(jié)構(gòu)體名 變量名
    • struct 結(jié)構(gòu)體名 變量名 = {成員1值,成員2值…}
    • 定義結(jié)構(gòu)體時順便創(chuàng)建變量
struct Student
{string name;
	int age;
	int score;
}s3; // 順便創(chuàng)建的結(jié)構(gòu)體變量

int main()
{// struct關(guān)鍵字可以省略
	// 第一種
	Student s1;
	s1.name = "李四";
	cout<< s1.name<< endl;

	// 第二種
	struct Student s2 = {"張三", 12, 33 };
	cout<< s2.score<< endl;

	// 第三種
	s3.age = 23;
	cout<< s3.age<< endl; 

	return 0;
}

小結(jié):
定義結(jié)構(gòu)體時的關(guān)鍵字是struct,不可以省略
創(chuàng)建結(jié)構(gòu)體變量時,關(guān)鍵字struct可以省略
結(jié)構(gòu)體變量利用操作符.訪問成員

  • 結(jié)構(gòu)體數(shù)組
    作用:將自定義的結(jié)構(gòu)體放入到數(shù)組中方便維護
    語法:struct 結(jié)構(gòu)體名 數(shù)組名[元素個數(shù)] = {{}, {}, ..., {}}
struct Student
{string name;
	int age;
	int score;
}s3;

int main()
{Student s1[3] =
	{{"張三", 12, 33 },
		{"張2", 12, 33 },
		{"張1", 12, 33 }
	};

	s1[2].name = "趙云";
	for (int i = 0; i< 3; i++)
	{cout<< s1[i].name<< " "<< s1[i].age<< " "<< s1[i].score<< endl;
	}

	return 0;
}
  • 結(jié)構(gòu)體指針
    作用:通過指針訪問結(jié)構(gòu)體中的成員
    利用操作符->可以通過結(jié)構(gòu)體指針訪問結(jié)構(gòu)體屬性
    ex:
Student s1 = {"張三", 12, 33 };
Student* p = &s1;
cout<< p->name<< endl;

// or
Student s1[3] =
{{"張三", 12, 33 },
	{"張2", 12, 33 },
	{"張1", 12, 33 }
};

Student* p = s1; // 因為定義的是結(jié)構(gòu)體數(shù)組,相當于指針,所以不需要取地址符
for (int i = 0; i< 3; i++)
{cout<< p->name<< endl;
	p++;
}
  • 結(jié)構(gòu)體嵌套結(jié)構(gòu)體
    作用:結(jié)構(gòu)體中的成員可以是另一個結(jié)構(gòu)體
    ex:老師包含學生
struct student
{string name;
	int age;
	int score;
};

struct teacher
{string name;
	int age;
	int score;
	struct student stu;
};

int main()
{teacher t;
	t.stu.name = "小李";
}
  • 結(jié)構(gòu)體做函數(shù)參數(shù)
    作用:將結(jié)構(gòu)體作為參數(shù)向函數(shù)中傳遞
    兩種方式:
    • 值傳遞
    • 地址傳遞

ex:

struct Student
{string name;
	int age;
	int score;
}s3;

void printStudent1(Student s)
{s.age = 2;
}

void printStudent2(Student *s)
{s->age = 2;
}

int main()
{Student s = {"張三", 13, 33 };

	printStudent1(s);
	cout<< s.age<< endl; // 13
	printStudent2(&s);
	cout<< s.age<< endl; // 2

	return 0;
}
  • 結(jié)構(gòu)體中的const
    作用:用const來防止誤操作
    ex:
// 將函數(shù)中的形參改為指針,可以減少內(nèi)存空間,而且不會復制新的副本出來
void printStudent2(const Student *s)
{s->age = 2; // 因為形參中加入了const,此處修改會報錯
}
  • 結(jié)構(gòu)體例題
  1. 老師學生
    案例描述:三名老師,帶五名學生。老師結(jié)構(gòu)體存放老師姓名和學生數(shù)組,學生結(jié)構(gòu)體存放姓名、考試分數(shù)。
#includeusing namespace std;

struct student
{string sname;
	int score;
};

struct teacher
{string tname;
	student stuArray[5];
};

void allocateStudent(teacher tArray[], int len)
{// 分配名字
	string nameSeed = "ABCDE";
	
	for (int i = 0; i< len; i++)
	{tArray[i].tname = "Teacher_";
		tArray[i].tname += nameSeed[i];

		for (int j = 0; j< 5; j++)
		{	tArray[i].stuArray[j].sname = "Student_";
			tArray[i].stuArray[j].sname += nameSeed[j];
			tArray[i].stuArray[j].score = rand() % 61 + 40;
		}
	}
}

void printInfo(teacher tArray[], int len)
{for (int i = 0; i< len; i++)
	{cout<< "老師姓名:"<< tArray[i].tname<< endl;
		for (int j = 0; j< 5; j++)
		{	cout<< "學生姓名:"<< tArray[i].stuArray[j].sname<< " 考試分數(shù):"<< tArray[i].stuArray[j].score<< endl;
		}
	}
}

int main()
{// 設置隨機數(shù)種子
	srand((unsigned int)time(NULL)); // time函數(shù)必須傳遞參數(shù),但參數(shù)類型與返回值無關(guān)所以傳入空值無影響
	
	// 創(chuàng)建老師數(shù)組
	teacher tArray[3];

	int len = sizeof(tArray) / sizeof(tArray[0]);
	allocateStudent(tArray, len);

	printInfo(tArray, len);

	system("pause");
	return 0;
}
//
  1. 英雄排序
    案例描述:給定一個五個英雄結(jié)構(gòu)體,包括姓名、年齡、性別,按照年齡排序后輸出
#includeusing namespace std;

struct Hero
{string name;
	int age;
	string sex;
};

void bubbleSort(Hero herroArray[], int len)
{for (int i = 0; i< len - 1; i++)
	{for (int j = 0; j< len - i - 1; j++)
		{	if (herroArray[j].age >herroArray[j + 1].age)
			{		Hero tmp = herroArray[j];
				herroArray[j] = herroArray[j + 1];
				herroArray[j + 1] = tmp;
			}
		}
	}
}

void printInfo(Hero heroArray[], int len)
{for (int i = 0; i< len; i++)
	{cout<< "姓名:"<< heroArray[i].name<< " 年齡:"<< heroArray[i].age<< " 性別:"<< heroArray[i].sex<< endl;
	}
}

int main()
{Hero heroArray[5] =
	{{"劉備",23,"男"},
		{"關(guān)羽",22,"男"},
		{"張飛",20,"男"},
		{"趙云",21,"男"},
		{"貂蟬",19,"女"}
	};
	
	int len = sizeof(heroArray) / sizeof(heroArray[0]);

	// 排序前
	printInfo(heroArray, len);
	// 冒泡排序
	bubbleSort(heroArray, len);
	// 排序后
	cout<< "排序后:"<< endl;
	printInfo(heroArray, len);

	system("pause");
	return 0;
}

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁名稱:C++基礎語法-創(chuàng)新互聯(lián)
文章地址:http://muchs.cn/article34/dpjsse.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管、商城網(wǎng)站靜態(tài)網(wǎng)站、云服務器、網(wǎng)站導航外貿(mào)網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管