C語言基礎(chǔ)知識(shí)分享續(xù)篇
寫在前面
好了,現(xiàn)在我們開始C語言的第二個(gè)部分.今天我們需要看下面幾個(gè)知識(shí)點(diǎn),都是非常簡單的,我們主要認(rèn)識(shí)一下.
數(shù)組
我們知道一個(gè)一個(gè)屬性可以用一個(gè)類型去表示,那么我想問的是如果是一個(gè)屬性的多個(gè)呢?也就是多個(gè)一樣的東西,此時(shí)我們就要使用數(shù)組來進(jìn)行表示,所謂的數(shù)組就是存儲(chǔ)數(shù)據(jù)的容器,保證多個(gè)數(shù)據(jù)的數(shù)據(jù)類型要一致,C語言中給了數(shù)組的定義:一組相同類型元素的集合.
數(shù)組使用
我們想要存儲(chǔ)1~10這幾個(gè)數(shù)據(jù)我們應(yīng)該如何存儲(chǔ)?很簡單.
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定義一個(gè)整形數(shù)組,最多放10個(gè)元素?cái)?shù)組訪問
注意了,如果我們沒有在[]中具體元素的個(gè)數(shù),那么我們實(shí)際存儲(chǔ)元素的個(gè)數(shù)按照后面初始化的個(gè)數(shù)來進(jìn)行計(jì)算,如果給了實(shí)際元素的個(gè)數(shù),那么我們后面最多存儲(chǔ)元素就是規(guī)定的元素個(gè)數(shù).我們?nèi)绻L問數(shù)組的元素,那么我們就要依賴數(shù)組的下標(biāo),記住數(shù)組的下標(biāo)是從0開始的,這一點(diǎn)非常重要.
int main() { int i = 0; int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (i = 0; i<10; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
函數(shù)
所謂的函數(shù)我們可以稱之為是代碼的功能的集合,我們把程序不同的功能寫成一個(gè)個(gè)函數(shù),這樣我們后面是可以再其他地方重復(fù)調(diào)用的.其中main函數(shù)也是一個(gè)函數(shù).函數(shù)的基本結(jié)構(gòu)是
放回置 函數(shù)名(參數(shù)列表) { 函數(shù)體 }
我們來實(shí)現(xiàn)一個(gè)打印1-10的函數(shù).
void Print() { for (int i = 0; i < 10; i++) { printf("%d ",i+1); // ??)--]-三字母詞 } }
我們調(diào)用函數(shù)只需要用函數(shù)名和相關(guān)的參數(shù)就可以了.
int main() { Print(); return 0; }
字符串
在C語言中用一對""括起來的字符我們稱之為字符串,就像"hello world".注意我們C語言是沒有字符串類型的,大家不要搞錯(cuò)了就行.
在C語言中字符串的末尾其實(shí)隱藏著一個(gè)'\0';y也就是只要你使用雙引號(hào)輸入一個(gè)字符串,它的末尾就是自動(dòng)攜帶一個(gè)'\0'來作為字符串的結(jié)束標(biāo)志,實(shí)際在內(nèi)存中,上面的字符串是這樣的“hello world\0"末尾帶了一個(gè)'\0'來作為結(jié)束標(biāo)志.我們驗(yàn)證一下.
#include <stdio.h> int main() { char * str = "hello world"; return 0; }
上面我們驗(yàn)證的還是不太清楚,這里我們再次看一個(gè)現(xiàn)象.
#include <stdio.h> int main() { char arr1[] = { 'a', 'b', 'c', 'd' }; char arr2[] = { 'a', 'b', 'c', 'd','\0' }; char* arr3 = "abcd"; printf("arr1 %s\n", arr1); printf("arr2 %s\n", arr2); printf("arr3 %s\n", arr3); return 0; }
也就是所謂的字符串我們可以這樣認(rèn)為,我們可以認(rèn)為他們是字符數(shù)組,但是字符數(shù)組最后我們一定要帶上一個(gè)'\0',注意我們是這么理解,實(shí)質(zhì)肯定有所不同,我們先不談,這涉及到其他的內(nèi)容.
strlen && sizeof
我們談到字符串和字符數(shù)組我們就不得不說一下strlen和sizeof得區(qū)別了,記住了它最大得一個(gè)區(qū)別,sizeof是關(guān)鍵字,strlen是函數(shù),這是本質(zhì)得不同.在功能呢上,sizeof計(jì)算是我們數(shù)組開辟得空間,它的單位是字節(jié),strlen是計(jì)算有效字符的個(gè)數(shù),所謂的有效字符是指'\0'之前的都是有效字符.
sizeof
我們先來測試一下sizeof關(guān)鍵字.
int main() { char arr1[] = { 'a', 'b', 'c', 'd' }; char arr2[] = { 'a', 'b', 'c', 'd', '\0' }; char arr3[10] = { 'a', 'b', 'c', 'd', '\0' }; printf("arr1 %d\n", sizeof(arr1)); printf("arr2 %d\n", sizeof(arr2)); printf("arr3 %d\n", sizeof(arr3)); return 0; }
這個(gè)我們已經(jīng)知道了,那么我們這里在和大家說一下sizeof的的用法,我們sizeof既可以計(jì)算類型的大小,也可以計(jì)算變量占據(jù)空間的大小.
int main() { int a = 0; printf("int %d\n", sizeof(int)); printf("a %d\n", sizeof(a)); return 0; }
但是我們計(jì)算類型和計(jì)算變量是有一點(diǎn)區(qū)別的,計(jì)算變量我們可以不帶括號(hào).
int main() { int a = 0; printf("a %d\n", sizeof a); return 0; }
但是我們參數(shù)是類型的時(shí)候我們必須帶上括號(hào).
int main() { int a = 0; printf("int %d\n", sizeof int); return 0; }
strlen
下面我們開始用一下strlen函數(shù),這個(gè)是在標(biāo)準(zhǔn)庫string.h中的,我們使用前需要引入頭文件.strlen函數(shù)就是為了尋找字符'\0',知道知道'\0',否則我們會(huì)一直計(jì)數(shù).
int main() { char arr1[] = { 'a', 'b', 'c', 'd' }; char arr2[] = { 'a', 'b', 'c', 'd', '\0' }; char* arr3 = "abcd"; printf("arr1 %d\n", strlen(arr1)); printf("arr2 %d\n", strlen(arr2)); printf("arr3 %d\n", strlen(arr3)); return 0; }
轉(zhuǎn)義字符
假如我們要在屏幕上打印一個(gè)目錄:c:\code\test.c.我們該如何寫代碼,是不是按部就班的直接復(fù)制粘貼.看一下現(xiàn)象.
int main() { printf("%s\n", "c:\code\test.c"); return 0; }
此時(shí)我們就會(huì)發(fā)現(xiàn)和我們想的有點(diǎn)不太一樣.是我們想錯(cuò)了嗎?不是的,是大家缺了一個(gè)知識(shí)點(diǎn).在C語言中,為了我們數(shù)據(jù)的打印更加優(yōu)美,此時(shí)添加了很多的轉(zhuǎn)義字符.什么是轉(zhuǎn)義字符,這個(gè)就是改變了原本意思的字符.今天我們用一下常見的轉(zhuǎn)義字符.
轉(zhuǎn)義字符 | 說明 |
\? | 在書寫連續(xù)多個(gè)問號(hào)時(shí)使用,防止他們被解析成三字母詞 |
\\' | 用于表示字符常量' |
\“ | 用于表示一個(gè)字符串內(nèi)部的雙引號(hào) |
\\ | 用于表示一個(gè)反斜杠,防止它被解釋為一個(gè)轉(zhuǎn)義序列符。 |
\a | 警告字符,蜂鳴 |
\b | 退格符 |
\f | 進(jìn)紙符 |
\n | 換行 |
\r | 回車 |
\t | 水平制表符 |
\ddd | ddd表示1~3個(gè)八進(jìn)制的數(shù)字。 如: \130 X |
\xdd | dd表示2個(gè)十六進(jìn)制數(shù)字。 如: \x30 0 |
下面我們認(rèn)識(shí)一下三字母詞
int main() { printf("(are you ok??)"); // ??)--]-三字母詞 return 0; }
在一些老的編譯器??)會(huì)被解析成],不過現(xiàn)在的編譯器一般不這么干了,我們了解就可了.
我們說一下常見的一些轉(zhuǎn)義字符,其余的就不談了,有興趣的自己可以查一查驗(yàn)證一下就可以了,很簡單的.
\\\ 如果我們想要打印 字符'\\' ,在\的前面再加一個(gè)\就行了\ddd 這里面ddd表示的是3個(gè)8進(jìn)制數(shù),可以使用1-3個(gè)8進(jìn)制數(shù)\xdd dd表示的兩個(gè)十六進(jìn)制數(shù)
下面我們來練習(xí)一個(gè)習(xí)題,我們求一下字符串的長度
#include<stdio.h> #include <string.h> int main() { char* str = "c:\test\328\test.c"; printf("%d\n", strlen(str)); return 0; }
這個(gè)字符串的長度是4,就是下面的“c : \t e s t \32 8 \t e s t . c”
操作符
這里只是認(rèn)識(shí),后面的再說吧.
算數(shù)操作符: + - * / %邏輯操作符: && ||移位操作符: >> <<賦值操作符: = += -= *= /= &= ^= |= >>= <<=位操作符: & ^ |條件操作符: exp1 ? exp2 : exp3逗號(hào)表達(dá)式: exp1, exp2, exp3, …expN
下面我們只說一下逗號(hào)表達(dá)式,所謂的逗號(hào)表達(dá)式就是我們根據(jù)從左到右的規(guī)則依次往后面計(jì)算,該賦值的賦值,該替換的替換.
int main() { int a = 0; (a = 2 * 6, a * 3, a = a + 5); printf("a = %d\n", a); return 0; }
選擇語句
所謂的選擇語句就是我們在眾多的選項(xiàng)中選擇一個(gè)符合調(diào)價(jià)的,我們這里有下面兩個(gè)類別.
if else
我們先用一下你就明白了,很簡單.
int main() { int coding = 0; printf("你會(huì)去敲代碼嗎?(選擇1 or 0):>"); scanf("%d", &coding); if (coding == 1) { printf("堅(jiān)持,你會(huì)有好offer\n"); } else { printf("放棄,回家賣紅薯\n"); } return 0; }
此時(shí)我們就明白了他們的含義,如果我們符合條件,那么我們就執(zhí)行該條件下的代碼.那么我想問一下我們只有這兩個(gè)個(gè)條件嗎?不是的,我們也是可以田間else if 的.
int main() { int coding = 0; printf("你會(huì)去敲代碼嗎?(選擇1 or 0 or -1):>"); scanf("%d", &coding); if (coding == 1) { printf("堅(jiān)持,你會(huì)有好offer\n"); } else if (coding == -1) { printf("如果你是百萬富翁當(dāng)我沒說話\n"); } else { printf("放棄,回家賣紅薯\n"); } return 0; }
同時(shí)我們else if和else都是可以省略的,只保留if,但是我們絕對不可以只讓else或者是else的個(gè)數(shù)多余if.注意else是和它上面最近的if進(jìn)行匹配的,這里我就不詳細(xì)的說了,你一驗(yàn)證就明白了.
switch
除了if else選擇之外我們還是有另外的一個(gè)語法的,這里也是很簡單的.
int main() { int a = 1; switch (a) { case 1: printf("%s\n","YES"); break; case 0: printf("%s\n", "NO"); break; default: printf("%s\n", "選擇錯(cuò)誤"); break; } return 0; }
switch()的括號(hào)的內(nèi)部元素類型 字節(jié)<=4的整型(char int byte short)每一個(gè)case后面,除非是特殊業(yè)務(wù)要求,要帶上break;
int main() { int a = 1; switch (a) { case 1: printf("%s\n", "YES"); case 0: printf("%s\n", "NO"); default: printf("%s\n", "選擇錯(cuò)誤"); } return 0; }
循環(huán)語句
我們剛剛說了選擇語句,但是這個(gè)語句只會(huì)執(zhí)行一次。由于我們發(fā)現(xiàn)生活中很多的實(shí)際的例子是:同一件事情我們需要完成很多次。那我們怎么做呢?這里就需要循環(huán)語句了,這里的循環(huán)語句三個(gè)。
- for
- while
- do while
for
這個(gè)格式是for(表達(dá)式1; 表達(dá)式2; 表達(dá)式3),也是很好用的
表達(dá)式1 為初始化部分,用于初始化循環(huán)變量的。表達(dá)式2 為條件判斷部分,用于判斷循環(huán)時(shí)候終止。表達(dá)式3 為調(diào)整部分,用于循環(huán)條件的調(diào)整。
int main() { for (int i = 0; i < 10; i++) { printf("%d ", (i + 1)); } return 0; }
這里我們想和大家說一個(gè)結(jié)論,條件判斷部分要比調(diào)整部分多上一次,有的選擇題會(huì)進(jìn)行考察.
while
我們也是使用它進(jìn)行打印1-到10的數(shù)字,這個(gè)也是非常簡單的.
int main() { int i = 0; while (i<10) { printf("%d ", (i + 1)); i++; } return 0; }
do while
如果說while語句是先進(jìn)行條件判斷,那么dowhile就是先執(zhí)行代碼,后面再進(jìn)行條件判斷.
int main() { int i = 0; do{ printf("i: %d\n",i); } while (i > 0); return 0; }
跳出語句
跳出語句算是對循環(huán)語句做一個(gè)補(bǔ)充,我們知道,任何一個(gè)人都有可能再滿足一定情況下結(jié)束循環(huán),有的人會(huì)等到條件完成后結(jié)束,有的人可能中途有添加了另外的條件,此時(shí)我們下面的兩個(gè)關(guān)鍵子都是為了他們準(zhǔn)備的.
contine
contine關(guān)鍵字是跳出本次循環(huán),繼續(xù)下一次的循環(huán).
int main() { int i = 0; while (i < 10) { i++; if (i == 5) { continue; } printf("i: %d\n", i); } return 0; }
break
break語句更加直接,它是直接結(jié)束循環(huán).
int main() { int i = 0; while (i < 10) { i++; if (i == 5) { break; } printf("i: %d\n", i); } return 0; }
指針
下面我們談C語言最重要的也是最讓人難以理解的一個(gè)內(nèi)容,這我們在后面會(huì)重點(diǎn)談.大家記住,所謂的指針我們就認(rèn)為它是一個(gè)地址,它是指向一個(gè)事物的標(biāo)志,這就是指針的簡單理解.根據(jù)計(jì)算機(jī)主線的根數(shù)不同,指針分為4字節(jié)和8字節(jié),其中32為機(jī)器是4字節(jié),64位是8字節(jié).
int main() { int a = 10; int * p = &a; // p 就是一個(gè)指針 printf("%d\n", sizeof(p)); return 0; }
那么我想問的是我們拿到了a的地址,請問我們?nèi)绾慰创齛的內(nèi)容呢?這里可以使用解引用,解引用就是根據(jù)地址找到那一片的空間.
int main() { int a = 10; int * p = &a; printf("a = %d\n", *p); *p = 20; printf("a = %d\n", a); return 0; }
這里我想和大家說的,任何指針類型的大小只要機(jī)器的位數(shù)確定,那么我們字節(jié)數(shù)也就確定了.
struct Student { char name[100]; // 姓名 char sex[10];// 性別 int age; // 年齡 }; int main() { printf("char %d\n", sizeof(char*)); printf("int %d\n", sizeof(int*)); printf("double %d\n", sizeof(double*)); printf("struct Student %d\n", sizeof(struct Student*)); return 0; }
自定義類型
上面我們已經(jīng)知道了自定義類型,也就是int之類的.那么我想問的是如果我們想要描述學(xué)生這個(gè)屬性,我們應(yīng)該怎么辦?此時(shí)我們知道用自定義類型是可以描述的,但是我們有點(diǎn)麻煩,這里C語言提供了一個(gè)關(guān)鍵字,我們可以使用它來自己定義類型.
struct
這個(gè)一個(gè)結(jié)構(gòu)體關(guān)鍵字,我們可以這么做.
struct Student { char name[100]; // 姓名 char sex[10];// 性別 int age; // 年齡 };
這就是一個(gè)結(jié)構(gòu)體,也就是下面的格式
struct 結(jié)構(gòu)體名字 { // 成員屬性 };
這里我們需要記住的是struct 結(jié)構(gòu)體名字才是結(jié)構(gòu)體的類型,大家不要記混了.這里給大家使用一下.
struct Student { char name[100]; // 姓名 char sex[10];// 性別 int age; // 年齡 }; int main() { struct Student stu = { "張三", "男", 18}; printf("%s %s %d\n", stu.name, stu.sex, stu.age); return 0; }
以上就是C語言基礎(chǔ)知識(shí)分享續(xù)篇的詳細(xì)內(nèi)容,更多關(guān)于C語言基礎(chǔ)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言從基礎(chǔ)到進(jìn)階全面講解數(shù)組
數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素2022-05-05C++ 輕量級(jí)對象JSON序列化實(shí)現(xiàn)詳情
本文以jsoncpp庫為基礎(chǔ),設(shè)計(jì)這樣一個(gè)可以支持一個(gè)函數(shù) 可以一行代碼 unmarshal /marshal 對象,需要的朋友小伙伴可以參考以下2021-09-09C++數(shù)據(jù)結(jié)構(gòu)哈希表詳解
C++標(biāo)準(zhǔn)庫中使用的unordered_map底層實(shí)現(xiàn)是哈希表,下面這篇文章主要給大家介紹了關(guān)于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以參考下2022-07-07有關(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解
下面小編就為大家?guī)硪黄嘘P(guān)C++中隨機(jī)函數(shù)rand() 和srand() 的用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01