C語言初階——手把手教零基礎/新手入門(萬字心得筆記)-創(chuàng)新互聯(lián)

目錄

為隆陽等地區(qū)用戶提供了全套網頁設計制作服務,及隆陽網站建設行業(yè)解決方案。主營業(yè)務為網站制作、做網站、隆陽網站設計,以傳統(tǒng)方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

前言

一、C語言是什么?

二、開發(fā)環(huán)境

1.編譯器

三、初始C語言

1.第一個C語言程序

2.數據類型

2.1 數據類型的長度

3. 變量 && 常量

3.1 如何定義變量

3.2?變量的分類?

3.3?變量的作用域和生命周期

3.4常量

1.字面常量

2.const修飾的常變量

3.#define定義的標識符常量

4.枚舉常量

4.字符串 && 轉義字符

4.1 字符串

4.2 轉義字符

5. 判斷&&選擇語句?

5. 循環(huán)

1. for循環(huán)

2. while循環(huán)

3.do...while語句

6. 函數

7. 數組

1. 一維數組?

8. 操作符

9. 常見關鍵字

1. break

2. continue?

3.?static

10. 指針

11. 結構體

四、?總結



前言

作者將把C語言的知識要點,學習心得以文章形式發(fā)表,由于作者目前還是一個菜鳥,難以避免錯誤和存在觀點片面的時候,非常感謝讀者指正!希望能在這里與大家共同進步,早日成為大牛!

本系列(初始C語言)只是簡單介紹每個知識點、C語言的基礎知識,意在使讀者(還有自己)大概了解C語言。


寫在前面

? “日志”以及“寫在最后”是我在同一天寫的,如果想聽“沒用”的廢話,那就翻到最后吧:)

? 這是我第一篇也是我熱度最高的博客,雖然遠不及大佬的博客,我會一直努力。它傾注了我作為初學者,雖只有淺薄知識但卻擁有這個這個年紀最熱血的情感。它粗糙不堪,許多同學耐著性子讀它,也細心地發(fā)現(xiàn)了不少問題,非常感謝!同時我希望大家學習的時候也能一起修修補補它,雖然它只是塊破布,但我一定會因為它是大佬們的墊腳石而感到開心。

我希望我的語言不要像專業(yè)書那樣讓人眼花繚亂,所以除了必要的專業(yè)詞匯,我盡量以“人話”解釋一些語法。

日志

22/9/1:

  • 在函數版塊新增了C語言輸入和輸出的兩個函數,以及它常用的格式(oj題和考試可能會遇到的)。
  • 修正了三(2)中存儲單位換算,原來少了KB和MB。

? 22/9/4:

  • 修正了打印函數中左右對齊的描述。

? 22/10/3:

  • ? 增加了對const的理解敘述。
一、C語言是什么?

C語言是是一門經久不衰的計算機編程語言,萬物始于C,學好C語言,能讓我們?yōu)榫幊讨反蛳聢詫嵒A。(我也不知道寫什么,反正非常重要就對了)


二、開發(fā)環(huán)境
1.編譯器

我們把計算機編程語言稱之為高級語言,那什么是低級語言呢?

? 在中學物理我們知道:電子元件只能傳達"開"或"閉"兩種信息,所以電子元件(即晶體管)之間也只能用這兩種方式通信。人們把"開"用1代替,把"閉"用0代替。電子計算機在初期時,只能識別0和1兩種信號,所以那個時候只有科學家才能進行編程工作,這在那時候是十分困難的。

上面提到的0/1信號,正好為二進制提供了用武之地,所以我們把最基本的、計算機能夠直接讀取的語言稱之為低級語言。

? 在這里,低級語言就是一串由0和1組成的東西,它轉換成匯編語言,進而轉換成高級語言,才被我們大多數人學習。

? 編譯器的作用就是把上面的過程反過來,將我們人能看得懂、接近自然語言的、而且能寫出來的高級語言轉換成機器能夠讀懂的低級語言。

? 筆者最初使用的編譯器是Dev C++,然后是Visual? Studio 2019。我比較喜歡VS2019,因為它在我寫代碼的同時能用中文提醒我的錯誤,但有時候才vs不能通過的代碼反而在Dev C++里能通過,所以目前我以vs為主。

如果有同學剛接觸C,我建議先使用Dev C++吧,熟悉一下編程環(huán)境,如果已經有一定基礎了,直接上vs2019吧。

三、初始C語言 1.第一個C語言程序

下面以Dev C++為例

(1)先新建源文件:文件->新建->源代碼

(2)寫預處理命令,寫主函數,建立基本框架

尖括號(<>)中的stdio.h叫標準輸入輸出函數,即standard input output.header

#include是一種預處理命令,它的作用是找到尖括號(或者英文雙引號)中的文件,并將它包含到當前文件,被包含的文件中的文本將替換源代碼文件(就是我們正在編寫的東西)中的#include指令。

?看到上面那段話是不是很懵呢,說白了:<>里面的東西有我們等下寫代碼要用的東西,它所包含的代碼會幫我們實現(xiàn)某些功能,它只是個名字,實際上它包含了不少代碼。因為那某個功能我們接下來要用很多次,如果每次都把<>里面的東西打出來,就太麻煩了!而#include就用一行代碼代替了這么多代碼,是不是方便了許多?

舉個栗子?

如果接下來我們要用到從鍵盤輸入或從屏幕輸出,那我們就需要#include來簡化我們實現(xiàn)輸入和輸出功能的步驟。

這里說得有點啰嗦,我剛接觸這個的時候很懵:為什么每個函數都要加上#include呢?為什么啰嗦這么多呢:如果有初學者看到我的文章,那我希望他能懂:D

忘了說了,第二種主函數這種寫法已經是遠古版本了,最好寫第一種。

一個程序/工程只能有一個主函數(? main()),它是程序/工程的入口。注意main不要寫成mian??!

2.數據類型
char//字符數據類型//就是不是數字的字符
short//短整型//就是數字小(絕對值)的整數,很少用
int //整型//就是整數
long//長整型//就是數字(絕對值)大的整數
long long//更長的整型//很少用
float//單精度浮點數//就是小數
double//雙精度浮點數//小數位數多的小數

§ 為什么會出現(xiàn)這么多類型?

——因為我們現(xiàn)實生活中要用到整數,小數呀

§ 那為什么整數有int 和 short 還用long、long long,小數有float、double這么多種類呢?為啥不只用一種數據類型來表示呢?

——這個問題問得好(精神分裂ing)。單看英文字母和中文字符的復雜程度應該不難猜想:不同字符在計算機中所占大小是不同的,讓我簡要介紹計算機中的儲存單位:最小的單位是bit,8bit = 1Byte,1024Byte = 1KB,接著是MB,GB,TB等。bit(比特)是最小單位。這里說個題外話,不少人在辦理寬帶有這樣的困惑:為什么我明明買的是200M寬帶呀,為什么最高才十幾二十兆每秒呢?原因是:運營商所宣傳的200M寬帶實際上是寬帶接入的速率為200Mbps,這里的B指的是Byte(字節(jié)),換算下來200M寬帶理論上峰速為25.6MB/s。這不重要,知道就好,讓我們跳回來。事實上,不同數據類型在內存中所占大小是不一樣的,如果用大小的盒子裝蛋糕,蛋糕有大有小,難免造成空間的浪費,所以人們規(guī)定了不同的數據類型,以便空間被物盡其用。

在這里有一個很重要的思想,我稱之為黑屋思想:把內存想象成一個個小黑屋,里面存放著我們想要存進的東西,也存著我們不能動的東西,當然也存著我們想取的東西。

2.1 數據類型的長度

這里用sizeof()判斷數據類型或者表達式長度的運算符,sizeof()不是函數,后面會介紹(好像也沒什么介紹的= =)。

C語言規(guī)定sizeof(long long) >= sizeof(long),其他以此類推,上面的結果因編譯器和操作平臺而異。

3. 變量 && 常量

生活中的有些值是不變的(比如:圓周率,性別,身份證號碼,血型等等)
有些值是可變的(比如:年齡,體重,薪資)。

3.1 如何定義變量

如 3.2.1圖

格式如下:變量類型? (空格)變量名(自己起);

最好初始化變量,避免臟數據影響后續(xù)調試,如 int a = 0;如果變量名有實際含義,最好用對應的英文(再不行就拼音,或英文簡寫)表示,后續(xù)也會明白。??

3.2?變量的分類?

1.局部變量 && 全局變量

顧名思義,全局變量就是整個工程都能用的,而局部變量只能在{}內部使用,這里的{}不僅限于主函數的大括號,在后面的循環(huán)或判斷語句中的{}也同樣適用。

//如果全局變量和局部變量名字一樣呢?是誰起作用呢?

顯然,在這里局部變量會覆蓋掉同名的全局變量。?

這里簡要介紹printf(),scanf()函數,顧名思義,前者是打印,后者是掃描,讀?。╢是函數的意思),從鍵盤讀取輸入,它們是被包含在stdio.h頭文件中的。gets() && puts()也用同樣的功能,具體差異會在后續(xù)文章解釋。

3.3?變量的作用域和生命周期

1.變量的作用域

作用域(scope,這個詞要記住,后面編譯器報錯可能會出現(xiàn))是程序設計概念,通常來說,一段程序代碼中所用到的名字并不總是有效/可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域。

1. 局部變量的作用域是變量所在的局部范圍。(就是大括號里邊的變量只能在大括號里用)
2. 全局變量的作用域是整個工程。(就是大括號外邊的變量在哪都能用)? ? ? ? ? ? ? ? ? ??

2.生命周期

變量的生命周期指的是變量的創(chuàng)建到變量的銷毀之間的一個時間段
1. 局部變量的生命周期是:進入作用域生命周期開始,出作用域生命周期結束。(大括號大括號?。?br />2. 全局變量的生命周期是:整個程序的生命周期。 (在哪都行?。? ?

§ 看完了嗎?用人話來說作用域就是變量在哪能用,生命周期就是它啥時候產生,啥時候消失。

3.4常量 1.字面常量

是指可以用字符串表示的常量,包括整型常量,字符型常量,字符串常量,也可以是結構型的符號常量。

2.const修飾的常變量

首先來看沒有被修飾的變量:

顯然,未被修飾的變量的值是可以被改變的

再來看被const修飾的變量

編譯器告訴我們,a的值是不能改變的,也就是說,它是個常量,但不完全是,人們把它稱為常變量。原因是:用const修飾的變量只是在語法上將它作為常量,但它本質還是變量,了解即可。?


(新增于22/10/3)

? 關于“常變量”的理解:用 const 修飾的變量,無論是全局變量還是局部變量,生存周期都是程序從運行開始到運行結束,也就是說,使用 const 修飾過的局部變量有了「靜態(tài)特性」。什么變量具有靜態(tài)屬性?我們知道全局變量是靜態(tài)的,靜態(tài)的生存周期就是程序運行的整個過程。但是一定要區(qū)分的是:用const修飾過的局部變量只是有了「靜態(tài)特性」,并沒有說它變成了「靜態(tài)變量」。

? 之所以把const放在最后,是因為理解它的「靜態(tài)特性」需要理解全局變量和局部變量。

3.#define定義的標識符常量

看圖里的代碼可以知道:格式:#define 常量名 值,在這里常量名和值之間不需要等號。

4.枚舉常量
#define MON  1
#define TUE  2
#define WED  3
#define THU  4
#define FRI  5
#define SAT  6
#define SUN  7

假設我們要用到星期一到星期五7個變量,如果用#define的方法定義變量,我們需要用7行代碼,而使用enum(枚舉)常量能用更少的代碼表示相同的意思。

enum DAY
{
      MON = 0, TUE, WED, THU, FRI, SAT, SUN
};

第一個枚舉成員的默認值為整型的 0,(在這里我用 = 0來表示,實際上它被省略了)后續(xù)枚舉成員的值在前一個成員上加 1,以此類推。

當然我們可以在定義時修改任意枚舉成員的值:

enum DAY
{
      MON = 1, TUE, WED = 100, THU, FRI, SAT, SUN
};

對于沒有指定值的枚舉元素,其值為前一元素加 1。在這里TUE = 2, THU = 101,以此類推。

枚舉常量先介紹到這里,實際上初學者的后續(xù)項目中用得較少,至少我現(xiàn)在還沒遇到過(大一期末)。

打印結果如下:

4.字符串 && 轉義字符 4.1 字符串
"hello world!"

形如這樣被雙引號擴起來的一串字符稱為字符串。

在vs2019編譯器中鍵入以上代碼,按下f10鍵,依次點擊調試->窗口->監(jiān)視。結果如圖。

我在定義數組時并未初始化數組大小,因為編譯器會根據輸入的內容判定數組大小。由監(jiān)視窗口中的值和類型欄中可以看出,雖然顯示的是相同的內容,但是由雙引號引起的字符串多了一個'\0',它在數組中是有實際大小的。由于人們要對字符串進行一系列的處理,但是我們不是每次都能知道一個文本中的字符個數,若要對處理它,很難保證不越界且不浪費內存,于是人們想到將'\0'當作字符串結束的標志(它是一個轉義字符,后面會介紹),這樣人們在處理字符串的時候就不必擔心數組越界和未知長度的問題了。

接下來我們定義三個數組,arr1是一個字符串,arr2和arr3都是字符數組,它們的區(qū)別在于arr2沒'\0',而arr3有,這樣的區(qū)別會帶來怎樣的影響呢?讓我們打印一下。?

結果非常的amazing啊,中間怎么有個奇怪的東西?

我們先看一樣的arr1和arr3,在監(jiān)視窗口中,它們包含的成員完全相同,當然,我們可以認為字符數組加上'\0'就是一個字符串,那為什么沒'\0'的字符數組arr2顯示出來但沒完全顯示出來呢?上面我們提到,'\0'是字符串的結束標志(這里恰好證實了字符數組加上'\0'就是一個字符串這一猜想),打印函數只有碰到'\0'才會停下來,arr2數組里并不包含,所以機器就一直找呀找,找到別的小黑屋里去了,最終出現(xiàn)燙燙燙這樣的亂碼字符,以后你還會碰到錕斤拷(笑)。

用一張圖簡要表示數組在內存中是如何被處理的。?

4.2 轉義字符

當我想打印路徑c:\code\test.c,結果為什么不是想象中的樣子呢?

這里就不得不提一下轉義字符了。轉義字符顧名思義就是轉變意思。
下面看一些轉義字符。

\' 表示單引號'

\" 表示雙引號"

\\表示一個反斜杠

\n表示換行

\r表示回車

\t表示水平制表符,相當于按下tab鍵,還有一些轉義字符沒有提及,因為剛開始用的很少

補充一下ASCII碼表

簡單來說,因為機器內存中只能存儲二進制0和1,所以當我們想要使用各式各樣的符號時,只要使用對應的ASCII碼,編譯器會將它們轉換成二進制編碼,進而被機器識別?,F(xiàn)在請將0,a,A對應的ascii碼值記住。?

5. 判斷&&選擇語句?

1. if語句

從字面上看容易理解:如果怎樣就執(zhí)行,不怎樣就不執(zhí)行。格式如下:

if(判斷條件)
{
執(zhí)行內容
}

如果沒有{},if語句只執(zhí)行緊跟它的第一個語句,因為";"表示執(zhí)行語句的終止。所以if語句和后面的各種語句,即使要執(zhí)行的語句只有一句,也要加上花括號,以便以后更好地維護程序,也增加了程序的可讀性。

人們規(guī)定判斷結果為真的表達式的值為1,否則為0;

2. if...else語句

一個?if 語句?后可跟一個?else 語句,else 語句在它之后的語句結果為假時執(zhí)行。

#includeint main()
{
	int n = 0;
	if (n == 0)
	{
		printf("hello\n");
	}
	else
	{
		printf("world\n");
	}
	return 0;
}

顯然,打印結果為hello。

3.if...else if...else 語句

一個?if?語句后可跟一個?else if...else?語句。

我把格式改成這樣:? ?if...(else if) * n...(else) * m?

n >= 0 ,m = 0或1;

三個部分都最好加上花括號。

也就是說,else if可以沒有,else也可以沒有,但是else if有大于0個時,必須有else。且else必須在最后。這里的各個else if互不干擾,只要條件符合,就執(zhí)行語句后括號的內容,判斷的變量必須與if括號中的一致。

int main()
{
	int a = 1, b = 0;
	if (a == 1)
	{
		printf("a\n");
	}
	else if (b == 0)  //這里改變了變量
	{
		printf("b\n");
	}
	else
	{
		printf("no\n");
	}
	return 0;
}

當然,if語句還可以嵌套,由于這是初始C,時間和篇幅有限,后面再介紹。

4.?switch?語句

先來個小總結

(1) switch括號內的常量表達式,必須是一個整型或枚舉類型(上面有提到)。

(2) case 語句可以有任意個,case 后跟一個對應switch括號內相同數據類型的值和一個冒號(前面需要一個空格)。

(3) 當case內的浴具語句執(zhí)行完畢后,如果未遇到break,將會繼續(xù)執(zhí)行下一個語句,直到遇見break或直到switc語句終止。當然,break不是必要的。

(4) default語句 用于switch接收的常量或枚舉類型都不等于上面case語句冒號后的常量或枚舉常量,同樣,default也不是必要的。

(5) case語句和default語句后最好加上花括號。

看著真麻煩,話不多說,上代碼:(還是用截圖吧,看得清楚些)

這里打印結果為0,1,2?,是因為第一個case語句就像一個入口,如果沒遇到break,程序將會一直執(zhí)行。這里的入口位置是任意的。

當我修改n的值以后,對于此時的n,入口發(fā)生改變了。

當我再次修改變量n的值且加入default語句結果如上。因為上面的case語句中沒有對應的入口,只能通過default進入switch語句。

當然,switch語句也可以嵌套。

5. 循環(huán)

前面我們依次簡要介紹了順序結構、選擇結構,接下來我們要介紹循環(huán)結構。

此處算是C的難度上升期,對于筆者而言,它大概是這樣的:

可能對大多數初學者并沒有這么夸張,但筆者當初初學循環(huán)時,似乎因為走了一會神,之后的就懵懵懂懂,一知半解,在實驗課束手無策,甚至一度懷疑自己的智商是否是編程這塊料,如此惡性循環(huán)。好在經過我的惡補還有許多練習,使我稍微掌握了循環(huán)結構的使用。我從這里悟到一個編程學習者必須具備的素質,不要光聽不做,不要眼高手低,動手實踐才是真正學習編程??!

在這里再插一句:當你遇到bug時,盡量先自己找bug,因為只有經歷過痛苦才會刻骨銘心。

1. for循環(huán)

我相信讀者比我更聰明,且看介紹。

規(guī)范、易讀的寫法如上,也可以在for后的括號定義計數器變量。但有些編譯器會報錯。

也可以這樣寫:

計數器初始化在for循環(huán)外也可,計數器變化在花括號內也可,由上可知:for括號內的兩個頓號是必須要寫的的,且不論執(zhí)行語句有多少,最好加上花括號。

在這里有個初學者經常犯的錯誤:計數器的位置。

首先說一下機器執(zhí)行for循環(huán)的順序(常規(guī)結構):?

也就是說,for后面括號內語句的執(zhí)行并不是完全按順序的。當我把計數器i++放在花括號內,且把它放在不是最后的位置,那它就不是最后執(zhí)行的語句了,所以要讓它作為計數器,就要把它放在最后。但是筆者認為這樣的可讀性不算好,也不是很美觀,非必要情況下還是把計數器放在括號里吧。

計數器的地位舉足輕重,如果沒有它,條件判斷的結果永為真,這將是一個死循環(huán)。并不是所有的死循環(huán)都是錯誤的,因為我們總有些事情需要機器一直執(zhí)行,后面我們會用更簡潔的形式實現(xiàn)死循環(huán)。只有當條件判斷的結果為假時,循環(huán)才會停止。

for循環(huán)括號內的判斷語句至少寫一句,很多時候,我們要在for循環(huán)語句內添加判斷語句,其實也可以將?判斷語句寫在上面的括號內,不過這樣寫還是可讀性不是很好,也不算美觀(至少對初學者是這樣的),知道即可。

? 在這里強調一下計數器初始化的重要性:

? 我用兩個相同的循環(huán)結構,是否能打印兩組"1 2 3 4 5"呢??

從圖上我們知道,只打印了一組,我們把第二個條件判斷改一下:

兩個循環(huán)結構我都沒有初始化計數器,當然,對于第一個循環(huán)實際上它已經在定義變量i時被初始化了。當程序走完第一個循環(huán)結構時,i的值為6(以為是5的同學再思考一下),所以第二個循環(huán)打印不出來值,因為6>5,所以第二個循環(huán)根本進不去,于是程序終止。??????

? 解決它有兩個辦法:

(1)定義不同變量用于不同計數器,這樣各個計數器之間就不會互相干擾了。?

(2)每次使用計數器之前都初始化它,即使用規(guī)范格式。

?這個小問題,每隔一段時間就會讓我惱火一陣子,有時是真的找不出來錯誤,因為我不是每次寫的格式都是一樣的,所以說規(guī)范地寫代碼很重要啊!??

2. while循環(huán)

結構如下:

計數器的位置同樣會影響打印結果。?

可以發(fā)現(xiàn),while循環(huán)只不過是把條件判斷留在了括號中,變量初始化和計數器放在了其他地方。

用法和注意點與for循環(huán)大致相同,區(qū)別在今后的博客中細說。

3.do...while語句

目前不太需要,一般用在菜單選項的時候,到時候就知道了。

學??荚嚨囊c:

int i = 0;
do
{
   i++;
}while(...)

如果while括號中結果為假,do中的操作都是一定先執(zhí)行的,也就是說do...while循環(huán)至少執(zhí)行一次。?

6. 函數

個人理解?

這里的函數不是數學中的函數,不太喜歡數學的同學先別關掉:D。在我看來,函數就像生活中的各種店鋪,五金店,電器維修店,服裝店......它們在我們生活中有著各自的作用。函數的作用就像一個個店鋪,把各種具有不同功能的代碼打包,就像店鋪之間都隔著墻一樣。這樣的好處是簡化代碼。試想各種店鋪混在一起的場景,且結合筆者下面的解釋,應該大致能理解函數的作用。

舉個栗子

這里只是舉一個十分簡單的例子,我想說的是:某些功能實現(xiàn)起來并不難,但實際上往往需要多次使用該功能,由于懶是第一生產力(:D),于是函數誕生了。

函數名括號內的東西就相當于店鋪門,你往門里丟東西,它就會根據它對應的功能返回給你相應的東西。函數先介紹到這里,后續(xù)會詳細講。


(新增于22/9/1)輸入輸出函數:

? 通過上面對眾多語法的解釋,我經常使用printf()函數來打印,其實以后如果遇到某些問題難以解決,通過“打印大法”經常能化險為夷,快速定位問題。(扯遠了),現(xiàn)在列舉幾種C語言輸入輸出需要注意的方面和它們的常見用法。

要點:

  • 必須包含頭文件。原因是:最初提到stdio,它是標準輸入輸出。 why?因為C語言沒有內置輸入輸出函數,在最初期C語言流行的時候,很多公司都是自己寫的輸入輸出函數,但是它們或多或少都有區(qū)別,這樣某個公司寫的軟件或者接口可移植性就很差,于是有個叫“標準委員會”的就出來規(guī)定了輸入輸出標準。舉一反三,無規(guī)矩不成方圓,各種“標準”也就成了語言內置的“庫”了。(庫在學習的過程中會漸漸理解它)
  • 如果指定了類型,人必須按照雙引號中的格式輸入,那么機器也肯定會按照格式輸出,詳情如下。

常見用法:

? 下面通過輸入輸出的幾種組合解釋:

請注意:如果你現(xiàn)在不知道輸入輸出語句,那就先記住它的格式,雙引號,逗號,括號什么的。

運行以上代碼,會有一個光標在閃動,輸入100,回車。代碼中打印了三次,不同的是第二次,添加了一個換行符。其中輸入語句中最后的是&(取地址),現(xiàn)在只要記住輸入要這個符號即可。

用其他的呢?

? 運行上述程序,輸入6699回車,且不論打印的數字位置如何,它們卻只有2位。原因是:可以把輸入輸出語句中的雙引號以及它里面的東西翻譯成“格式”,輸入輸出就是按格式走的,是強制的。

? 這個%多少d,“多少”代表寬度,你看即使我輸入4個數字,那它也只讀取前兩個數字。下面兩個數字位置不同的原因是:打印函數的寬度正數靠右,負數靠左。如果沒有規(guī)定寬度,那么也就沒有絕對的靠右靠左對齊可言,不過從左到右習慣來講,不規(guī)定寬度默認是靠左的。請注意對齊是在有移動空間的前提下才會體現(xiàn)出來。就像后面兩個打印函數,長度(絕對值)都是4,是大于讀取的2位數字的長度的。

再來一個!

運行上面的程序,但是請注意打印的格式與要打印的變量的類型不符合,就這段代碼而言,打印的是'A'和'B'的ASCII碼(還記得a的ASCII碼么?)。從格式上的強制性來說,規(guī)定打印的格式十分重要,不是說一定要類型符合,經常是靈活使用。比如有一些題比如就是要打印字符的ASCII值,那么直接以%d打印字符就ok;再比如可能要遍歷A~Z,直接在循環(huán)65~106中用%c打印即可。

最后一個!

? 運行程序。這次打印的是一個浮點數,通過最后一個打印語句可以知道,%f默認打印的是?保留6位小數。而在百分號和f之間的'.2'就代表小數點后保留兩位。經常會在寫應用題的時候遇到保留xx位小數這樣的要求。

在這里再次強調動手做的重要性,看得懂連入門都不算,當然動手也需要熟練~

7. 數組

數組的定義:一組相同類型元素的集合?

1. 一維數組?

聲明&&初始化數組

從左至右依次為數組數據類型,數組名,數組元素個數,數組元素。?

在這里,"[ ]"內的數字可以不用寫

,編譯器會根據元素個數來改變它

數組的下標

即數組的下標是從0開始的,這點需要初學者下意識地在練習中成為肌肉記憶。

數組的使用?

數組的使用,單看它的形式,也就[]內的數字可以變化,當我想把數組中的元素打印出來呢

?????在這里,i的區(qū)間為[0,10),是有直觀意義的,它表示我們操作了數組中下標為0到9的每個元素。

更多知識點與細節(jié)將在后續(xù)發(fā)出~

8. 操作符

(簡單介紹)

算數操作符和賦值操作符的前五個相信大家都知道,這里提一下位操作符'&',當我們每次使用scanf函數時,總是要在變量名前加上&,&變量a的意思是取變量a的地址,這是&符號的作用之一。

對于上面的單目操作符和關系操作符,我們可能對解引用操作符不太熟悉(*),它和剛才提到的&符號取變量地址是對應的,例如:*a = &a,它們是完全等價的。不太明白沒關系,這里以后會重點講。

這個條件操作符我們總是不容易想到,不經常使用,但有時它能有種四兩撥千斤的效果,能簡化不少。

這個操作符的意思是:當表達式一的結果為真,整個表達式結果就為表達式2,否則結果為表達式3。例如:

逗號表達式的意思就是一個語句由N個被逗號分隔的子語句(實際上不能稱之為語句)組成,那么這個語句的結果就為最后一個子語句的結果。例如:

9. 常見關鍵字

關鍵字在此只介紹初學時重要、常見的幾個。

1. break

在switch選擇語句使用的尤其多,其次是循環(huán)語句中。它的作用是一旦條件符合,就跳出整個循環(huán)or選擇語句。例如:

在這里唯一的不同是在a = 2后加了break,它的作用是阻止語句往下執(zhí)行。也就是說,switch語句要么從入口一直執(zhí)行完畢,要么從入口開始執(zhí)行,直到遇到break終止。

循環(huán)例子如下:

2. continue?

它常用于循環(huán)語句中。它的作用是當符合條件時,continue后面的語句不再執(zhí)行,跳出本次循環(huán),再開始下一次循環(huán)。

例如:

理解了break,continue自然不難理解。

當然,break和continue在不同情況下的差異會在后續(xù)詳細講。

3.?static

在C語言中:
static是用來修飾變量和函數的
(1). 修飾局部變量

由第二次的結果來看,函數內的局部變量并沒有像第一次一樣,每次調用都是為變量i開辟內存空間,而是將變量i的值保存下來。

故:
static修飾局部變量改變了變量的生命周期,讓靜態(tài)局部變量超出了作用域后依然存在,直到程序結束時,生命周期才結束。

(2). 修飾全局變量

這個例子舉起來有些麻煩,姑且讓我說說吧:在實際項目中,一個工程中會有至少一個源文件(xxx.c)。當一個全局變量被static修飾,這個全局變量就只能在本源文件內使用,不能在其他源文件內使用。(此處忘記全局變量的同學往上翻^_^)

(3). 修飾函數

同上,一個函數被static修飾,這個函數就只能在本源文件內使用,不能在其他源文件內使用。

10. 指針

指針和內存管理是C語言的雙刃劍。

由于這部分十分重要,所以這里我簡要介紹有關指針的基礎知識。

1. 內存

內存是電腦上特別重要的存儲器,計算機中程序的運行都是在內存中進行的 。所以為了有效的使用內存,就把內存劃分成一個個小的內存單元,每個內存單元的大小是1個字節(jié)。為了能夠有效的訪問到內存的每個單元,就給內存單元進行了編號,這些編號被稱為該內存單元的地址。

變量是創(chuàng)建內存中的(在內存中分配空間的),每個內存單元都有地址,所以變量也是有地址的。在前面我提到:*a = &a,為什么呢?

? 對于等號右邊,它表示的是變量a的地址,它也是一個具體的值,我得用房間給它住,所以人們規(guī)定定義int?*a存放a的地址。注意:?在定義指針變量時,*符號只是表示定義的是一個指針變量,而使用指針變量時*a中的*符號指的是機器通過存放的a的地址找到a的值。

1.1?指針的簡單使用

通過地址的存放,解引用,達到了賦值的目的。?

11. 結構體

結構體是C語言中特別重要的知識點,結構體使得C語言有能力描述復雜類型。比如描述學生,學生包含: 名字+年齡+性別+學號這幾項信息。這里只能使用結構體來描述了。直接上圖:

聲明一個結構休類型的一般形式如下:

struct 結構體名

{成員列表};

? 這個結構體名在本工程中就是一個用戶定義的數據類型了,就像int那樣,不過需要注意的是,定義并初始化結構體時,成員的數據類型要于結構體聲明時對應。

? 細心的同學會發(fā)現(xiàn),我兩次打印時,后面的一坨東西看起來不一樣,但結果卻完全一致。實際上這與指針有關,在后面也會詳細講。

四、?總結

? 關于反思。?

不知道有沒有細心的同學發(fā)現(xiàn)我的文章寫了很久:21_12_26 ->22_1_18,實際寫的天數大概小于10天左右。起初只是為了為迎接期末考試而寫的博客,本來是要從頭到尾都寫一遍了,結果發(fā)現(xiàn)太長太長了,所以我把題目改成了“C語言初階”,即使這樣,我還是沒辦法在考試之前寫完它,因為5號就考完了,直到13號放假回家?,F(xiàn)在已經是23:33了,我在家玩了3天,拖延癥真的不好啊,百害無利的那種。太容易讓人泄氣了,惡性循環(huán)。

這篇文章我覺得它爛尾了,函數前面的部分,我寫的時候是充滿熱情的,總是愿意抽出時間寫。現(xiàn)在一閑下來,回到家,只要一開始玩就很難停下來(不過比沒我以前那么夸張),好在我堅持了下來,終于寫完它了。在玩的時候如果去想著學習,對于我來說一定是十分痛苦的,幸運的是,每當我投入時我是感到快樂的,因為這是我喜歡的事!

看了自己上面寫的東西,感覺文不對題(因為我改了題目),好多廢話,想重新寫,但是上面的絕大部分都是我敲出來的,耗費了我不少精力和時間,有頭有尾地做事(瞧瞧這像是拖延癥晚期的人說的話嗎),如果我把它就這樣擱置了,我會難過很久的,因為我又浪費了時間。由于前面的內容沒有必要的內容太多,且這篇寫這篇博客的目的是讓讀者初識C,也就是能看得懂代碼,沒有必要記憶太多東西,不過也好,前面的東西相對來說對初學者十分重要,講詳細點也并非沒有好處。不知道讀者的意見如何呢?歡迎評論!

寫在最后【建議】【學習、生活、人生計劃、心得】

? 時間真快,我的大學生活已經已經過了1/3了,大四我不算在內,因為我覺得前三年是這輩子(students in CN)唯一能夠用一大把可自由支配的時間用來提升自己、尋找/做自己熱愛的事情的時間段了,其他時間段跟這個階段比可能沒那么純粹。如果你現(xiàn)在(準)大一/大二,千萬要做自己的主人——自信、勇敢、獨立是剩下的人生需要具備的,你我聽過許多道理,一起進步吧。

【學習】

? 從大一萌新到現(xiàn)在的大二“老油條”,有不少事情我認為越早知道越好:

  • 適當翹課,挖東補西:如果你的學校一般,不久后你就會發(fā)現(xiàn)學校老師教課很一般,水課就不用說了。翹課當然不好,但是爛課對我們個人而言是浪費人生的,而且是黃金階段的人生,我認為這是非常不值得的。翹課不一定要肉身翹課,精神上翹課也是可以的,因為學校抓的嚴,我也比較慫,本人常年最后一排,都在干自己的事,完全不用管你認為講課不好的老師講的課。注意,最后一節(jié)課或幾節(jié)課,必須必須必須去,因為老師不僅可能會點名,很多老師會直接劃重點,也就是考范圍。但有的學校嚴,老師可能會暗示。
  • 必須學會自學:承接上一話題翹課,在不那么重要的課上干自己認為重要的事就是自學。不上老師的爛課,自己在網上(嗶哩嗶哩或YouTube、tb/pdd)查找優(yōu)質課程資源能提高效率和質量,尤其是專業(yè)課。自學是大學生必須學會的一門技能,公司招人的時候,也許你面試的是C++,但是經常會讓你轉Java;或者你作為一個新人,入門就給你一大冊書,配給你一個指導老師,xx月后再來面試你,這就是在考察你的學習能力。自學不完全是自己找課學,自學更重要的是查找資源,整合資源的能力,比如你現(xiàn)在在學C,在網上查找C的資料就是自學的過程。牛頓這么牛逼他也是站在巨人的肩膀上,要學會使用工具。
  • 保證績點:大學和高中的成績評價標準不同,一般而言,如果一門課比較重要,比如高數線代這些大課,那么它的平時分占30%,如果是像政治類的水課,那么它的平時分占比可能會大一些,占40%,比例一般不會五五開,具體看學校。就我的經驗而言,如果你作業(yè)都有交,上課點名沒被記(偶爾也是可以的,但不能過分,不管是不是借口,都要找老師說明,老師都懂的,主要是不要得罪老師),如果你的最終考試的成績ok,平時成績一定不會差,很大程度來說,一般考試越難的,平時分也是會跟著你的卷面分走的。再來說一下水課,如果你想保住你的績點(可以自己去查績點是什么),不管是保研還是出國(留學一般要平均分80+),還是為了自尊心,都要知道一些技巧的。還有就是水課其實有時候很拉學分,特別是我很討厭的文科類。水課的平時分占比較大,所以盡量不要被老師發(fā)現(xiàn)你翹課,水課學期末的作業(yè)非常重要,雖然看上去只是抄一篇作文,但是一定要工整,越簡單的工作越要讓老師看到你的態(tài)度,分數自然高一些。
  • 考前突擊:承接上一點,得到高分跟你學多久其實并沒有多大關系。同學可能會納悶,說反了吧?大學里的課程都是通過性考試(至少一般大學是這樣的),不是像高考那樣的選拔性考試,所以難度不會太大。學校是有題庫的,如果你刷遍前5-10年的期末題(老師沒發(fā)找學長學姐要),那么你考試里的題非常多的題都是原題,也有很多換湯不換藥的。如果老師明確指出考試的題就是課后題,那么 請好好對待它吧,特別是高數線代概率,因為這是考研的基礎。雖然很多人說到時候都會忘記重新學,但是你懂的~,還有就是如果你現(xiàn)在不打算讀研/留學,也不要放下績點,因為人的想法會隨著閱歷而改變的?;氐竭@個話題,你學習某一門課程,也許并不需要像學校安排的課程需要半個多學期、一個學期學完它,如果只是想拿到高分,也許從考前2-1月開始學習一門課程就足夠了,當然這只是我的一面之談,因為我大一第一學期學非專業(yè)課的時間拉的很長,備考不是很高效,也浪費了我很多自學編程的時間。大一第二學期的前半學期都在自學專業(yè)課,快考試才學其他的,知識點也記得比較清楚。最后說一句,大學生的期末是要人命的......尤其是你比較在意績點但你只想把時間用來學專業(yè)課或其他課程的同學。所以考前突擊還是要把戰(zhàn)線拉長一些,要不然期末周很多課排在一起考試一起突擊很難受的。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 已經深夜,持續(xù)更新--2022/9/1

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

網站標題:C語言初階——手把手教零基礎/新手入門(萬字心得筆記)-創(chuàng)新互聯(lián)
標題鏈接:http://muchs.cn/article24/pgoce.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供自適應網站、云服務器網站維護、搜索引擎優(yōu)化、網站排名、定制開發(fā)

廣告

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

綿陽服務器托管