本文對C語言基礎入門知識進行了粗略的講解,帶你了解一下大體的綱領,這個做出導圖然后系統論述寫出的程序使我受益頗多,愿能給你帶來一絲明悟
目錄
一、變數
1.常見資料型別
2.變數定義及其分類
2.1 變數作用域、生命周期
二、字串及陣列
1.陣列
1.1 陣列定義
1.2陣列使用:
2. 字串
2.1 部分轉義字符
2.2 初識運算子
三、常見關鍵字
1.typedef
2.static(extern)
3.register
四、常量
1.const 定義常變數
2.#define 定義常量
3.enum 列舉常量
五、選擇、回圈陳述句
1.選擇陳述句
2.回圈陳述句
六、函式基本知識(兩個例子說明)
1. 加法函式
2. 取最大值函式
七、操作快捷鍵及其注意事項
文章思維導圖

一、變數
1.常見資料型別
相信小伙伴在入門編程的時候一來就會遇見該類語言資料型別的學習,不知道你們有沒有想過其中的緣由?在計算機編程語言學習程序中,無論選擇哪一門語言都首先要學習該語言規定的資料型別,它構成了整個計算機的大廈,計算機最擅長的就是計算,一切大大小小的問題根本上最后都是由計算解決的,而計算需要有數值,有地方計算,類比生活中 整數,小數,計算機里面也規定了字符型,整形等,至于為什么規定資料型別就像你問生活中為什么需要整數,小數一樣,計算機的根本就是計算,我們日常遇見的關于計算的小問題不外如是,即使知道你也不會刻意去定義資料型別的概念,同理生活中的一切由計算機完成的作業也是由大大小小的計算實作,故而不同于人類,要想計算機實作準確無誤的按照要求為我們服務,它的每一個定義都需要有嚴格的標準,資料型別的定義與應用必不可少,它好比從小就開始學的1、2、3一樣,入門的知識必定是以后學習最重要的構成部分...

對應于生活中的列數式計算,資料型別規定了數值型別計算的地方和數值的型別,而需要運算的數值也就是我們接下來會提到的變數 ,它往往就是我們解決實際問題所需要運算的值,它們被存放在 各種資料型別定義的空間里,而計算機的空間不可能無限制的給下去,因此每種型別都對應有一定的大小,并且在運算完之后就會回收相應的空間,下文提到的變數可行域和生命周期,這里我們通過sizeof()求它們各自規定的大小

相信很多人在初學的時候都有這樣的疑惑,這里求得的大小是什么大小,雖然知道是記憶體大小但是知道的也不具體,由以下圖知(至于更大的單位倍率都是*1024)
而這里sizeof()求得的是位元組 byte 具體的請見后面 移位運算子

以及列印函式printf()里面為什么這樣寫

''%d\n'' 是什么意思? 其實這里%d 是運算子 意思是需要列印的內容型別是數字 像這樣的后面還會講到其他幾個常見的 而'\n'是轉義字符 意思是列印的時候換行,避免列印的時候都在同一行,緊湊 不易觀察--涉及了下面 部分轉義字符
2.變數定義及其分類
什么是變數?變數就是一個會改變的量,比如我們記錄一個人每天的作息時間時,這個時間就是一個變數,計算機是嚴謹的,多一秒少一秒,存放的地方(分配的記憶體地址)以及定義的地方(可行域)不同都是不一樣的,不能想當然,因而有了全域變數區域變數的區別,而我們定義一個變數就是需要用到上面的資料型別,它類似菜市場的菜價,過一段時間可能就會有浮動,因此它是變化的,而我們要具體定義這個量就需要用到數值,即菜的價格,一般菜價都是小數這就是菜價的型別,而變數的定義也類似,這樣寫

后面的例子 可以嘗試著分辨一下 定義的變數 學以致用
全域變數:定義在{}外面的變數
區域變數:定義在{}內部的變數

全域變數與區域變數的優先性:
當全域變數和區域變數同時對一個變數賦值時 以區域變數的賦值優先執行

2.1 變數作用域、生命周期
生命周期:一個變數總不能無限制的使用下去,不僅占用記憶體而且如果無關緊要的閑置著毫無用處,因而出現了生命周期的概念,我們知道 人的生命周期就是從出生到死亡,同理 變數的生命周期也是從創建到銷毀,區域變數的生命周期就是{ } 范圍內只要使用完了 它就經歷了創建到銷毀 以便高效率的利用,而全域變數的生命周期對應于整個工程 意思就是只有工程銷毀了全域變數的生命周期才算結束
作用域:作用域就是變數能夠作用生效的范圍,由上可知作用域及生命周期概念的提出無一不是為了提高運行效率及減少記憶體占用,故而都是按照需求定義變數的型別,只在一個地方用到的變數就無須建立成全域變數

看上圖 可知 當我們在解決方案這里右鍵添加專案的時候 所創建的就是一個工程,在圖中3.草稿就是一個工程,因此里面的 main.c/test.c 就都屬于這個工程 即全域變數在兩者之間都有效
例

我在 mian.c 里面也能使用該全域變數 不過需要 extern 進行參考,這里記住全域變數的參考需要這個函式就行,它就類似于我們使用 printf()函式的時候 需要在開頭加一個 #include<stdio.h>庫函式一樣,用人家的總得給人家說一聲

二、字串及陣列
1.陣列
1.1 陣列定義
定義:陣列就是一串相同型別資料的集合
那陣列存在的意義是什么? 其實陣列最直觀的例子就是Excel,不難發現,生活中大大小小的統計都涉及到了陣列,一個班級的人統計家庭住址這時你的資訊就是一組數,注意:這里一組數是代指,并不只是數還能是其它型別,文本型,浮點型等,因此這里在此說明了開篇資料型別的重要性,陣列也有資料型別,而型別也和變數的一樣
下圖是陣列的定義

留意一下的是,陣列的大小不能為0,既然得存放一些資料肯定不能是0
我們剛才實作了將相同型別的一組資料的存盤,那存盤的意義是什么?不就是方便自己更好的查看嗎,那如果我需要將里面的資料取出來那么多資料應該怎么取?瞎猜?這里就定義了陣列的下標,下標從左邊開始到邊結束0開始,如圖

1.2陣列使用:
殊途同歸 我們儲存的資料總歸是以后有用才會進行儲存,因此陣列的使用說到底就是相同型別資料儲存和提取
下面我們以列印 1---10 為例進行陣列內容的列印(這里涉及了后面的選擇、回圈陳述句類容)可以跳到后面做個了解回來觀看
正序列印陣列內容 將內容按照下標序號依次列印出來

同理逆序列印

2. 字串
定義:字串是什么,就是一串字符的集合 字符就是單引號 ‘a’ ‘b’ ‘1’ ‘你’ 這樣的都成為字符,型別是char,而字串是由雙引號括起來的字符的集合 "你好" 'hello world",這里你可能對hello_world程式又會有了新的認識,我們從一開始到現在逐漸將這個入門程式剖析清楚,
常見的字串的表示方法有如下3種:

1.直接定義字串陣列
2.printf()里面雙引號內容也是
3.通過定義字符陣列將所需內容列印出來
我們會發現上面第3種方法 出現了亂碼,列印的東西根本不知道是什么,這里涉及到了下面轉義字符的內容(其中%s指的是列印字串,%c 列印字符 %d 列印整形數字 這些不用刻意去記 熟練了就行)
下面我們來探討一下為什么會亂碼,以及明明我們只有三個字符卻列印出那么些不知道的值
而這里字符又是什么?它是構成計算機符號的基本組成 比如我們平時用的abcdef 這些都是規定了固定的字符是多少 如下表列出了計算機字符 當我們想列印出一個字母時只需要找到對應的碼值就行,這里ANCII碼值表區分大小寫的 ,例:

這里有心的留意到,ANCII碼值對應的數字是10進制 而不是2進制 16進制其他的,我們平時看到的數字都是10進制的
這里比如我們列印字母A(A-Z 65-90 / a-z 97-122)

2.1 部分轉義字符
定義:轉義字符是什么,字面上講就是轉變了原來想表達的意思 原本是一個字母或符號 但是同個加了一個'\' 意義就發生改變,輔助程式直觀輸出的字符

直接看定義可能會有些蒙,光說不練假把式,也得不到提升,例:

注:我們很多時候不用運行程式就可以知道一個程式有沒有錯,有錯誤或哪里不符合規范的時候系統都會有提醒,不論是有錯誤的地方還是下面的錯誤串列和輸出欄

回到剛才的錯誤:為什么這樣列印不出來
原因是 " " , ' '都是兩兩互相配對的 系統默認將前兩個配在了一起 故而后面的無法識別 導致報錯
這時我們加一個' \ ',將它原本的意義轉變一下就不是原來那個 單引號雙引號的含義了,就能繼續列印

我們來看一個例子,看看它最后列印的數字是多少,就能解決上面亂碼問題

一樣的列印,為什么字串能正常而字符不能正常呢?不用想都知道,它們中一定差了什么,
而這里 就涉及到了 '\0' 終止字符 的使用,規定 在字串的末尾都自帶了這樣一個終止字符,當程式識別到這個字符時就表示列印結束了,反之繼續執行列印下去,故而 字符陣列里面并沒有這個終止字符,因此程式列印的時候根本識別不出來只能隨便在一個地方漫無目的的停止 造成亂碼以及求得的長度是隨機值
那怎么解決?還用問 加上一個'\0' 它不就成了?
我們再來看一看:

細心的你發現了嗎,這里的 '\0'是不算做長度的
問題解決了!!!
一鼓作氣,看看下面這個例子列印的值是多少?

注意,這里需要記得你數個數的時候,轉義字符不要落了 視為一個字符

這里的輸出是20 你數對了么
需要留心一點的是 這里面的 \t \168 其中 \16 算一個字符 對應上面末尾 \dd 表示1-3個八進制的數字 8已經不屬于八進制的范疇了因而不算 (轉義字符只能算作1 )
然后我們將它們列印出來,卻發現格式并不對 ,不是我們想要列印的路徑

這時我們就需要像前面一樣 加上斜杠 \ 給它轉義

這樣就行了
2.2 初識運算子
1.算數運算子

下面來看個例子:
2.移位運算子(>> / <<)

這里值得指出的是,我們在計算機看到的數字大多都是 以10進制的 方式呈現的 至于進制的轉換問題后面會專門寫一篇文章
例

移位運算子針對的是二進制的左右移動,詳細原理如下所示:

3.位運算子

這里由于涉及太多關于二進制的知識,故此重新寫了一篇關于進制之間基本知識及轉換的博客,點擊下方鏈接跳轉觀看,直接目錄就可以找到位運算子相關的內容
點擊點擊參考博文-進制之間的轉換跳轉
4.賦值運算子

如圖所示使用方法

5.單目運算子

邏輯反操作(!)

正負值(+ / -)

~(二進制按位取反)

這里不進行講解 請到下方鏈接文章中查看
點擊點擊參考博文-進制之間的轉換跳轉
-- /++(前后置)


而對于后置的

強制型別轉換
當型別不一樣的賦值時

我們在3.14前面加個括號(想轉換的資料型別) 這樣他就不會報錯,但是確如它所說的,會導致資料丟失 于是列印只出來了個 3

6.關系運算子

7.邏輯運算子(&&、||)
注意 當運算式較復雜 容易混淆時 可以在運算式 及 運算子兩邊內容加上 括號 () 閱讀效果更不一樣

相反

8.條件運算子



9.逗號運算式

10.下標參考運算子

下標參考

函式參考

三、常見關鍵字
關鍵字:就是C語言本身規定好的一些函式類似功能的字符,比如常用的return 資料型別等,同時也警示在定義變數時 變數名字不能夠與關鍵字重名,那樣會沖突
這關鍵字雖然看著比較多,隨著慢慢學習練習,你會發現都不用記就都掌握了,這里就挑幾個進行闡述,后期會有更深層次的講解


關鍵字及其基本分類

1.typedef
自定義關鍵字變數的名稱(型別重命名)

2.static(extern)
上面在全域變數那里已經提到過了一次,全域變數使用的申明,評論里面也說過extern是C語言的關鍵字,其實全域變數部分的用法大致已經差不多了,大同小異
這里我們先來看兩個例子 帶入問題認識這兩個函式 先想一下下面函式的輸出 以及為什么是這樣

在前面內容中我們有提到過 區域變數 全域變數生命周期的概念,可能那時候你就沒怎么放心上,心想憑經驗這種概念性的東西應該知道了解一下就行,話這樣說沒錯,只是你還沒了解透徹
生命周期還有些懵的可以回到前面變數部分再斟酌一下
我們說 類似人的生命周期 出生-死亡 程式也是 創建-銷毀 只是有隨著工程銷毀的 有隨著代碼塊銷毀的 這都取決于定義變數時 可行域的大與小
這里我們把可行域生命周期的概念帶入就不難理解,上圖中每次呼叫這個函式過后,到下一次呼叫的時候,上一次創建的變數a已經被銷毀了,也就是說它的生命周期已經結束了,下次再次呼叫這個函式的時候又是一個的變數a它的值又會是1,又重新開始,所以這樣無論呼叫多少次函式,輸出的永遠都是2
這樣你能理解嗎? 好,結合上面所說的 我們加入一個static 看看輸出又會是多少

我們大致已經知道static的作用了,將生命周期變大,脫離了區域、全域 { } 的束縛
那看到這里了,我們不妨繼續想想之前變數的時候學習的東西,還講了一個全域變數,里面有extern,是不是這個static也與extern有關聯呢?

我們得到 全域變數一個性質:外部鏈接屬性(前面變數部分涉及不合適故而沒講)
=> 同一工程 不同源檔案之間 創建的全域變數 經過extern宣告之后是能夠進行呼叫的
那我們想 既然區域變數加了static后生命周期會變化那全域變數這個呼叫又會怎樣呢 是會脫離工程的束縛?還是恰恰相反 被局限?

可以看到,加了static之后,反而不能呼叫了,這說明就是我們剛才想的恰恰相反的情況
這說明,全域變數的外部鏈接屬性 進過這樣一加之后變成了內部鏈接屬性,范圍縮小在了本源檔案之間了,而不是工程源檔案里面通用
下面,介紹了全域變數,區域變數,提到呼叫,那還肯定有函式的呼叫

一看,發現大同小異的呼叫方式,都需要借助 extern 才能進行跨檔案的呼叫,結論同上 函式也具有類似全域變數的外部鏈接屬性
=> 同一工程 不同源檔案之間 創建的函式 經過extern宣告之后是能夠進行呼叫的
那我們不妨想之前全域變數一樣用static修飾看看效果

這說明,函式的外部鏈接屬性 進過這樣一加之后變成了內部鏈接屬性,范圍縮小在了本源檔案之間了,而不是工程源檔案里面通用
這便是extern 和static 的常見問題
3.register
暫存器
點擊點擊參考博文-進制之間的轉換跳轉
四、常量
看到這,你可能會有疑問,為什么不緊接著變數的時候就把常量給講了,而是中間穿插了陣列和字串的內容 其實只是為了加深你常量,含義的理解
定義:常量顧名思義就是不會變得量,在整個工程程序中都是一樣的
我們上面詳細講了陣列,你是否還記得 陣列[]里面的內容要求 必須是什么?沒錯就是某一個固定的常量,當時說了看情況可加可不加,而一旦加上去就必須是常量 原圖是這樣的,那我們不就可以利用這個方法判斷常量與否了?

1.const 定義常變數

這里它提示報錯了,本身a就被我定義成了變數,而這里const 將a屬性改成了常量 如圖中1箭頭,但又如圖中2箭頭,它并不能作為一個常量定義陣列大小,因此它是一個不完整的常量還是個變數,只是具有了常量屬性的變數,故稱它為常變數
2.#define 定義常量
而同樣的問題 #define 定義的就毫無問題

這里并未報錯,說明#define 定義的值是常量,也從這里 知道了常量的不可修改性
多提一個知識點:#define 定義宏

3.enum 列舉常量
列舉常量,適當了解一下

列舉的量像陣列一樣從0開始數,它的值是數字
而且我們看到將列舉的量放陣列中并未報錯,證明 列舉的值就是常量
五、選擇、回圈陳述句
程式的邏輯是由大大小小的陳述句串聯起來,這些陳述句表示判斷、回圈、選擇,就像粘合劑,它決定了程式什么時候執行什么代碼,主觀上講,它就相當于代碼的核心中樞,掌管著意識,支撐著程式有條不紊的運行
這里粗略提一下有個印象
1.選擇陳述句
if() else() 選擇陳述句
舉個例子 :如果你代碼超過了20000行,你就能拿到份好offer,沒有的話繼續努力

這便是選擇陳述句,無論選擇哪一個都有不同的執行效果 注意它的格式
2.回圈陳述句
while()回圈 滿足括號里面的條件就進行回圈

六、函式基本知識(兩個例子說明)
函式:當我們一個工程里面代碼的數量很多時又需要不斷地參考同一個代碼功能時,如果每次都去定義重新寫邏輯陳述句的話就會變得繁瑣冗雜,而這時候我們只需要將它封裝成一個函式就能在以后輕松地呼叫,極大地節省精力
1. 加法函式
寫一個函式表達加法運算效果

2. 取最大值函式
寫一個函式比較兩個數的大小

七、操作快捷鍵及其注意事項
常見的快捷鍵:
Ctrl K+Ctrl C 快捷注釋
Ctrl K+Ctrl U 取消注釋
F5運行
F10單步除錯
注意事項:
注意事項在文中基本都有提到過
1.注意 看下軟體中的 所寫代碼如果出現 紅色波浪線和下邊 輸出 錯誤串列視窗 顯示有錯誤 都是在你寫代碼的程序中實時的提醒你格式什么的有沒有寫錯,符不符合規定書寫規范的
2.當遇到 莫名其妙的問題時 靜下來梳理遍頭緒 然后看看自己到底是細節問題還是根本性問題 借用 F10單步除錯 監視視窗隨時觀察,這是項很重要的能力
3.Ctrl S 是個好習慣 過一會兒保存是必要的 這不是軟體會不會實時給你保存的問題,這是個人習慣
文中部分內容不易在本文涉及過深的 已經在其他文章中寫出 點擊下方鏈接 助力一鍵三連
點擊C語言scanf()常見錯誤解決跳轉
后面 陳述句、函式 講的略微粗糙了 ,以后詳細的講講
這篇文章已肝了很久了 到現在感覺已經精疲力盡的感覺,將所有的內容構建好系統的論述一遍蠻累但也蠻爽的,還有好些內容需要去補充,之后慢慢來
如有描述不清或根本性錯誤希望能幫我提出
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/286425.html
標籤:其他
