本文目錄一覽:
自學C語言教程
沒有基礎可以入門,通過努力可以達到初、中級程序員的程度,但再往上走,就比較困難了。後面需要不少演算法、英文和數學知識。
教程的話可以參考下面兩本教程:
譚浩強:《C語言程序設計》
李銘城 黃中豪 陳宇芬:《資料結構 C》
英文的話,進入初級之前都不怎麼需要。但是進入中級後,需要讀一些英文資料。不過現在翻譯比較厲害,絕大部分的資料都有翻譯。但是要進入高級,就必須要學習英文了,因為最新最核心的資料都是英文的,翻譯的往往都會有錯誤。
另外數學在早期影響不大,但是進入中級後就必須要了。因為估算演算法時間複雜度、空間複雜度、圖、樹等等,都涉及不少數學知識。當然如果只是做簡單應用或者驅動的話,這方面要求就不會太高。
最後給一個學習大概的路線圖:
入門級的學習,只要能夠掌握:代碼三大結構(循環、分支、順序)、流程圖、C語言關鍵字和語法、輸入輸出、文件操作、套接字操作。就算是初級滿級了。
初級程序員:數據結構和演算法(排序,查找)、了解軟體開發模型(瀑布模型、敏捷模型、原型模型等等)、了解UML、系統常用API、網路通信、編譯和SDK環境搭建
中級程序員:設計模式、多線程編程、網路通信(伺服器、客戶端)、面向對象編程、掌握UML、系統網路/文件/互斥/線程/事件/安全API、STL、相關法律法規、知道一些常用軟體架構(MVC等)
c語言的學習方法
如果剛開始接觸c語言,聽不懂也正常,不要有畏懼的心理,有些小夥伴可能看到部分同學什麼都會,自己就很氣餒,因為這部分同學很可能接觸編程比較早,即使小孩學走路也有一個過程,剛開始有走路慾望-學會站立,腿部有力量-嘗試走路,不斷練習-學會走路。所以不要慌。
學C語言與走路一樣,剛開始一定要有學習的慾望,然後,再制定計劃,不斷練習,量變會引起質變,堅持下去就發現原來這麼簡單。
歡迎關注 公眾號:c語言與cpp編程
1、學習資料
書本推薦:《c primer plus》難得的好書。老譚的書可看可不看,但是這本藍皮的c primer plus是我案頭必備的參考書,後面還有完整的c99標準庫,所以適合當個參考書。注意區分一下《c++ primer》和《c primer plus》
如果覺得這幾本書還是有點難,那就先看《C語言程序設計》
有了經驗後要去看看,例子很經典。後來進階可以看看三劍客《c和指針》《c陷阱與缺陷》《c專家編程》
剛學C語言的話可以結合看下C語言編程經典100例;
編譯器:VS,DevC++,VC++,CodeBlocks,C-Free,Turbo C。關於它們的特點網上介紹很多了,就不贅述了。講真,入門和基礎階段你用哪個無所謂,還是選自己喜歡的,不過對於初學者我們推薦Dev C++。可能現在大學課堂用的還是VC++,剛入門自己習慣就行。
視頻推薦:有同學曾經說過,視頻這麼好,上課就不用聽講了,這個是完全錯誤的,視頻是課堂補充,上課還是一定要好好聽講的,視頻可以查缺補漏,系統的學習一下。
上面提到的一些資料整理好了,可以下載:
鏈接:
提取碼:1234
學習方法:
1、過:學習一門新的語言,第一步就是把它所涉及的基礎知識大體過一點,不求深解,只求了解——第一遍:無需了解太過深入的理論,大體知道這門語言是什麼樣的,主要面向哪些場合,一些基本的語法格式是什麼樣的就可以了。
2、抄代碼:剛開始寫代碼,沒有多少人一上來就能立刻自己寫一個很完善很強大的代碼,甚至連基本的語法都會寫錯,這時候抄代碼就很關鍵了,從書上抄,從例子里抄,邊抄邊想,邊想邊回憶語法。
3、模仿改:自己會抄寫一些簡單的代碼,熟悉了一遍此語言的簡單語法後,但還不太清楚怎樣下手寫一個完整的代碼模塊,所以這一步要仿寫了,仿照給出的代碼寫一個屬於自己的代碼
4、勤調試:沒有人能一下子寫出完全正確的代碼,自己試著寫一些代碼,通過不斷調試來驗證自己的一些想法,繼續思考,再次驗證,來回折騰。熟悉一些基本的調試工具以及調試方法。
5、看n遍:出錯或遇到問題時,將代碼從頭看到尾,看了一遍又一遍,直到快全部記住時,總能找出問題原因,相信方法總會比問題多
6、練重複2-5步三遍以上,不解釋。
7、創新拿出一個完全沒有寫過的代碼,根據要求,一步步的寫出來。如果寫不出來,或者中間一堆錯誤,請參考第六步。
8、悟:主動找到寫代碼的感覺和成就感,並保持下去,世界上最難的語言就掌握了,將成為你軟體生涯永遠的工具。
c語言教程的目錄
第0章從零開始
0.1為什麼要用C
0.2ANSIC標準
0.3從C到C++
0.4從C和C++到Java
第1章C語言概述
第1章 C語言概述
1.1 C語言發展簡史
1.2 C語言的特點
1.3 簡單C語言程序舉例
1.4 C語言程序的組成與結構
1.5 C語言程序的開發步驟
小結
習題
第2章 演算法與程序設計基礎
2.1 演算法概述
2.1.1 演算法的概念
2.1.2 演算法的特徵
2.2 演算法的常用表示方法
2.2.1 自然語言
2.2.2 流程圖
2.2.3 N—S流程圖
2.3 程序設計典型演算法
2.4 結構化程序設計方法
小結
習題
第3章 數據類型、運算符與表達式
3.1 C語言的基本符號
3.1.1 標識符
3.1.2 常量
3.1.3 變數
3.1.4 關鍵字
3.2 C語言的數據類型
3.2.1 整型數據
3.2.2 實型數據
3.2.3 字元型數據
3.3 運算符和表達式
3.3.1 算術運算符和算術表達式
3.3.2 賦值運算符和賦值表達式
3.3.3 逗號運算符和逗號表達式
3.4 數據類型轉換
3.4.1 不同數據類型的數據間的混合運算
3.4.2 強制類型轉換
3.5 自增運算和自減運算
3.6 位運算
小結
習題
第4章 數據的輸入和輸出
4.1 數據的輸出
4.1.1 格式輸出函數printf
4.1.2 字元輸出函數putchar
4.2 數據的輸入
4.2.1 格式輸入函數scanf
4.2.2 字元輸入函數getchar
4.3 應用舉例
小結
習題
第5章 選擇結構
5.1 關係運算符和關係表達式
5.1.1 關係運算符
5.1.2 關係表達式
5.2 邏輯運算符和邏輯表達式
5.2.1 邏輯運算符
5.2.2 邏輯表達式
5.3 選擇語句
5.3.1 if語句
5.3.2 if語句的嵌套
5.3.3 switch語句
5.4 條件運算符和條件表達式
5.5 應用舉例
小結
習題
第6章 循環結構
6.1 goto語句與標號
……
第7章 數 組
第8章 函數
第9章 指針
第10章 結構體與共用體
第11章 文件
第12章 面向對象程序設計與C++基礎
第13章 數據結構基礎
附錄A C語言的關鍵字
附錄B 雙目算術運算中兩邊運算類型轉換規律
附錄C 運算符的優先順序和結合性
附錄D 常用字元與ASCII碼對照表
附錄E 常用庫函數
參考文獻
c語言編程怎樣入門
任何知識的學習沒有太多捷徑,但有經驗、方法及教訓
(1)基礎教材選擇-系統又通俗易懂,最好有該書配套免費視頻
建議選擇系統正統的大學教材,盡量不要選擇「多少天精通C語言」等吸引眼球的教程,相信一點C語言學習沒有速成。這裡給大家推薦一本不錯的入門教程:清華大學出版社-孫海洋-C語言程序設計,講解很透徹、知識點很全面、常式較多且通俗易懂。優酷「孫海洋課題」還有全書免費教學視頻,便於自學。
(2)動起手來–立馬安裝VC++6.0或VS開發環境
C語言是特別注重動手實操能力的課程!!動起手來,現在開始安裝VC++6.0開發環境,從第一個經典程序「Hello,world!」開始,每一個例題及知識點均通過開發環境驗證、理解深化。多做每一章小型實驗操作(網上多得很)。提升代碼調試能力。
(3)有了基礎後,一般可以有兩個發展方向可供選擇
(i)轉向項目實戰
建議購買一本C語言項目教程,在實踐項目中強化理論知識的學習。
(ii)繼續深入理論學習
建議購買國外經典深入學習C語言的教程,人民郵電出版社-C Primer Plus(第5版),或者 機械工業出版社-C程序設計語言(第2版.新版)
下定信心,堅持下去!希望對你有所幫助。
下面是轉載的 孫海洋 版 C語言程序設計 部分內容截圖。
求C語言教程
我給你電子文檔筆記吧~~
複製來的….
第一章 概述
1. C語言的特點
①語言簡潔、緊湊,使用方便、靈活。共有32個關鍵字,9種控制語句。
②運算符豐富,公有34種運算符。
③數據結構豐富,數據類型有:整型、實型、字元型、數組、指針、結構體、共用體等。
④具有結構化的控制語句(如if…else、while、do…while、switch、for)
⑤語法限制不太嚴格,程序設計自由度大。
⑥允許直接訪問物理地址,能進行位(bit)操作,可以直接對硬體操作。
⑦生成目標代碼質量高,程序執行效率高。
⑧可移植性好。
2. C語言的用途
C雖不擅長科學計算和管理領域,但對操作系統和系統實用程序以及對硬體進行操作方面,C有明顯的優勢。現在很多大型應用軟體也用C編寫。
Top of Page
第二章 數據類型、運算符與表達式
1. C的數據類型
C的數據類型包括:整型、字元型、實型或浮點型(單精度和雙精度)、枚舉類型、數組類型、結構體類型、共用體類型、指針類型和空類型。
2. 常量與變數
常量其值不可改變,符號常量名通常用大寫。變數其值可以改變,變數名只能由字母、數字和下劃線組成,且第一個字元必須為字母或下劃線。否則為不合法的變數名。變數在編譯時為其分配相應存儲單元。
3. 整型數據
整型常量的表示方法:十進位不用說了,八進位以0開頭,如0123,十六進位以0x開頭,如0x1e。
整型變數分為:基本型(int)、短整型(short int)、長整型(long int)和無符號型。不同機器上各類數據所佔內存位元組數不同,一般int型為2個位元組,long型為4個位元組。
4. 實型數據
實型常量表示形式:十進位形式由數字和小數點組成(必須有小數點),如:0.12、.123、123
0.0等。指數形式如123e3代表123×10的三次方。
實型變數分為單精度(float)和雙精度(double)兩類。在一般系統中float型佔4位元組,7位有效數字,double型佔8位元組,15~16位有效數字。
5. 字元型數據
字元變數用單引號括起來,如’a’,’b’等。還有一些是特殊的字元常量,如’\n’,’\t’等。分別代表換行和橫向跳格。
字元變數以char 來定義,一個變數只能存放一個字元常量。
字元串常量是由雙引號括起來的字元序列。這裡一定要注意’a’和”a”的不同,前者為字元常量,後者為字元串常量,c規定:每個字元串的結尾加一個結束標誌”,實際上”a”包含兩個字元:’a’和”。
6. 數值型數據間的混合運算
整型、字元型、實型數據間可以混合運算,運算時不同類型數據要轉換成同一類型再運算,轉換規則:
char,short – int – unsigned – long – double – float
7. 運算符和表達式
c運算符包括:
算數運算符( + – * / % )
關係運算符( == = = != )
邏輯運算符( ! || )
位運算符( ~ | ^ )
賦值運算符( = )
條件運算符( ? : )
逗號運算符( , )
指針運算符( * )
求位元組數( sizeof )
強制類型轉換(類型)
分量運算符( . – )
下標運算符( [ ] )
其它運算符( 如函數調用運算符( ) )
自增自減運算符( ++ — )注意:++i和i++的不同之處,++i使用i之前先使i加1,i++使用i之後,使i加1。
逗號表達式的求解過程:先求解表達式1,再求解表達式2,整個表達式的值是表達式2的值。
Top of Page
第三章 最簡單的c程序設計
1.c的9種控制語句:
if() ~ else~
for()~
while()~
do~while()
continue
break
switch
goto
return
程序的三種基本結構:順序結構,選擇結構,循環結構
2.數據輸出
c語言不提供輸入輸出語句,輸入輸出操作是由c的庫函數完成。但要包含頭文件stdio.h。
putchar( ) 向終端輸出一個字元
printf( )的格式字元:
① d格式符 用來輸出十進位整數
%d 按整型數據的實際長度輸出
%md 使輸出長度為m,如果數據長度小於m,則左補空格,如果大於m,則輸出實際長度
%ld 輸出長整型數據
② o格式符 以八進位形式輸出整數
③ x格式符 以十六進位形式輸出整數
④ u格式符 用來輸出unsigned型數據,以十進位形式輸出
⑤ c格式符 用來輸出一個字元
⑥ s格式符 輸出一個字元串
%s 輸出實際長度字元串
%ms 輸出的串佔m列,如果串長度小於m,左補空格,如果大於m,實際輸出
%-ms輸出的串佔m列,如果串長度小於m,右補空格,
%m.ns 輸出佔m列,但只取字元串中左端n個字元並靠右對齊
%-m.ns m、n含義同上,靠左對齊,如果nm,則m自動取n值
⑦ f格式符 以小數形式輸出實數
%f 整數部分全部輸出,小數部分輸出6位
%m.nf 輸出數據共佔m列,其中有n位小數。如果數值長度小於m,左補空格
%-m.nf 同上,右補空格
⑧ e格式符 以指數形式輸出實數
%e 系統指定6位小數,5位指數(e+002 )
⑨ g格式符 輸出實數,根據數值大小,自動選f格式或e格式
3.數據輸入
getchar( ) 從終端輸入一個字元
scanf( 格式控制,地址列表) 標準C scanf中不使用%u,對於unsigned型數據,以%d或%o或%x輸入。%後的*,用來跳過它相應的數據。輸入數據時不能規定精度如scanf( “%7.2f”, a );是不合法的。
Top of Page
第四章 邏輯運算和判斷選取控制
1. 關係運算符:
c提供6種關係運算符( = = == != )前四種優先順序高於後兩種。
2. If語句
C提供了三種形式的if語句
If(表達式) 語句
If(表達式) 語句1 else 語句2
If(表達式1) 語句1
Else if(表達式2) 語句2
…
else 語句n
3. 條件運算符
(ab)?a:b 條件為真,表達式取值a,否則取值b
4. Switch語句
Switch(表達式)
{
case 常量表達式1:語句1; break;
case 常量表達式2:語句2; break;
…
case 常量表達式n:語句n; break;
default :語句n+1;
}
Top of Page
第五章 循環控制
1. 幾種循環語句
goto語句(現已很少使用)
while語句 先判斷表達式後執行語句
do-while語句 先執行語句後判斷表達式
for語句
2. Break語句和continue語句
Break語句用於跳出循環,continue用於結束本次循環。
Top of Page
第六章 數組
1. 一維數組
c規定只有靜態存儲(static)和外部存儲(extern)數組才能初始化。給數組初始化時可以不指定數組長度。
2. 二維數組
3. 字元數組
部分字元串處理函數
puts(字元數組) 將一個字元串輸出到終端。
gets(字元數組) 從終端輸入一個字元串到字元數組,並且得到一個函數值,為該字元數組的首地址
strcat(字元數組1,字元數組2) 連接兩個字元數組中的字元串,數組1必須足夠大。
Strcpy(字元數組1,字元串2) 將字元串2拷貝到字元數組1中。
Strcmp(字元串1,字元串2) 比較字元串,相等返回0,字元串1字元串2,返回正數,小於返回負數。
Strlen(字元數組) 求字元串長度。
Strlwr( 字元串) 將字元串中的大寫字母轉換成小寫
Strupr( 字元串) 將字元串中的小寫字母轉換成大寫
以上是一些比較常用的字元串處理函數。
Top of Page
第七章 函數
1. 關於形參和實參的說明
① 在函數被調用之前,形參不佔內存
② 實參可以是常量、變數或表達式
③ 必須指定形參的類型
④ 實參與形參類型應一致
⑤ 實參對形參的數據傳遞是”值傳遞”,即單向傳遞
2. 函數返回值
如果想讓函數返回一個值,在函數中就要用return語句來獲得,在定義函數時也要對函數值指定類型,如果不指定,默認返回整型。
3. 函數調用
1)注意在函數調用時實參和形參的個數、類型應一一對應。對實參表求值的順序是不確定的,有的系統按自左至右,有的系統則按自右至左的順序。這一點要注意。
2)函數調用的方式:函數語句,函數表達式,函數參數
3)如果主調函數和被調函數在同一文件中,並且主調函數在前,那麼一般要在主調函數中對被調函數進行說明。除非:(1)被調函數的返回值類型為整型或字元型(2)被調函數出現在主調函數之前。
4)對函數的說明和定義是不同的,定義是指對函數功能的確立,包括指定函數名,函數值類型,形參及其類型、函數體等。說明則只是對已定義的函數返回值類型進行說明,只包括函數名、函數類型以及一個空的括弧,不包括形參和函數體。
5)c語言允許函數的遞歸調用(在調用一個函數的過程中又出現直接或間接的調用該函數本身)。
4. 數組作為函數參數
1)數組元素作為函數參數 和一般變數相同
2)數組名作參數應該在主調和被調函數分別定義數組,形參數組的大小可以不定義。注意:數組名作參數,不是單向傳遞。
3)多維數組作參數,在被調函數中對形參數組定義時可以省略第一維的大小說明,但不能省略第二維或更高維的說明。
5. 局部變數和全局變數
從變數作用域角度分,變數可分為局部變數和全局變數。
1)內部變數(局部變數)
在一個函數內定義,只在函數範圍內有效的變數。
2)外部變數(全局變數)
在函數外定義,可以為本文件其它函數所共用,有效範圍從定義變數的位置開始
到本文件結束。建議盡量少使用全局變數,因為它在程序全部執行過程中都佔用
資源,而且使函數的通用性降低了。如果在定義外部變數之前的函數要想使用該
外部變數,則應在該函數中用extern作外部變數說明。
6. 動態存儲變數與靜態存儲變數
從變數值存在的時間(生存期)角度來分,可分為靜態存儲變數和動態存儲變數。靜態存儲指在程序運行期間給變數分配固定的存儲空間,動態存儲指程序運行期間根據需要動態的給變數分配存儲空間。
C語言中,變數的存儲方法分為兩大類:靜態存儲類和動態存儲類,具體包括:自動的(auto),靜態的(static),寄存器的(register),外部的(extern)。
1) 局部變數的存儲方式
函數中的局部變數如不作專門說明,都之auto的,即動態存儲的,auto可以省略。局部變數也可以定義為static的,這時它在函數內值是不變的。靜態局部變數如不賦初值,編譯時系統自動賦值為0,動態局部變數如不賦初值,則它的值是個不確定的值。C規定,只有在定義全局變數和局部靜態變數時才能對數組賦初值。為提高執行效率,c允許將局部變數值放在寄存器中,這種變數叫register變數,要用register說明。但只有局部動態變數和形式參數可以作為register變數,其它不行。
2) 全局變數的存儲方式
全局變數在函數外部定義,編譯時分配在靜態存儲區,可以在程序中各個函數所引用。多個文件的情況如何引用全局變數呢?假如在一個文件定義全局變數,在別的文件引用,就要在此文件中用extern對全局變數說明,但如果全局變數定義時用static的話,此全局變數就只能在本文件中引用了,而不能被其它文件引用。
3) 存儲類別小結
從作用域角度分,有局部變數和全局變數
局部變數:自動變數,即動態局部變數(離開函數,值就消失)
靜態局部變數(離開函數,值仍保留)
寄存器變數(離開函數,值就消失)
(形參可定義為自動變數和寄存器變數)
全局變數:靜態全局變數(只限本文件引用)
全局變數(允許其它文件引用)
從存在的時間分,有靜態存儲和動態存儲
動態存儲:自動變數(本函數內有效)
寄存器變數(本函數內有效)
形參
靜態存儲:靜態局部變數(函數內有效)
靜態全局變數(本文件內有效)
全局變數(其它文件可引用)
從變數值存放的位置分
靜態存儲區:靜態局部變數
靜態全局變數
全局變數
動態存儲區:自動變數和形參
寄存器內:寄存器變數
7. 內部函數和外部函數
內部函數:只能被本文件中的其它函數調用,定義時前加static,內部函數又稱靜態函數。
外部函數:可以被其它文件調用,定義時前加extern,如果省略,則隱含為外部函數,在需要調用此函數的文件中,一般要用extern說明。
Top of Page
第八章 預編譯處理
c編譯系統在對程序進行通常的編譯之前,先進行預處理。c提供的預處理功能主要有以下三種:1)宏定義 2)文件包含 3)條件編譯
1. 宏定義
不帶參數的宏定義
用一個指定的標識符來代表一個字元串,形式:#define 標識符 字元串
幾點說明:
1) 宏名一般用大寫
2) 宏定義不作語法檢查,只有在編譯被宏展開後的源程序時才會報錯
3) 宏定義不是c語句,不在行末加分號
4) 宏名有效範圍為定義到本源文件結束
5) 可以用#undef命令終止宏定義的作用域
6) 在宏定義時,可以引用已定義的宏名
帶參數的宏定義
定義形式:#define 宏名(參數表) 字元串
這和函數有些類似,但他們是不同的:
1) 函數調用時,先求實參表達式值,再代入形參,而宏只是簡單替換,並不求值
2) 函數調用是在程序運行時分配內存的,而宏展開時並不分配內存,也沒有返回值的概念
3) 對函數中的實參和形參都要定義類型,而且要求一致,宏名無類型,其參數也沒有類型。
4) 函數只有一個返回值,而宏可以得到幾個結果
5) 宏替換不佔運行時間,只佔編譯時間,而函數調用占運行時間
2. 文件包含處理
#include “文件1” 就是將文件1的全部內容複製插入到#include位置,作為一個源文件進行編譯。
在#include命令中,文件名可以用” “也可以用 ,假如現在file1.c中包含file2.h文件,” “表示系統先在file1.c所在目錄中找file2.h,如果找不到,再按系統指定的標準方式檢索目錄, 表示系統直接按指定的標準方式檢索目錄。所以用” “保險一點。
3. 條件編譯
條件編譯指不對整個程序都編譯,而是編譯滿足條件的那部分。條件編譯有以下幾種形式:
1)#ifdef 標識符
程序段1
#else
程序段2
#endif
它的作用:當標識符在前面已經被定義過(一般用#define),則對程序段1編譯,否則對程序段2編譯。
2)#ifndef 標識符
程序段1
#else
程序段2
#endif
它的作用和#ifdef相反,當標識符沒被定義過,對程序段1編譯,否則對程序段2編譯。
3)#if 表達式
程序段1
#else
程序段2
#endif
它的作用:當表達式值為真(非0)時,對程序段1編譯,否則對程序段2編譯。
Top of Page
第九章 指針
指針說白了就是地址。指針變數就是用來存放指針(地址)的變數。
1. 變數的指針和指向變數的指針變數
讀起來很拗口,說白了就是變數的地址和用來存放變數地址的地址變數。因為一個變數在編譯的時候系統要為它分配一個地址,假如再用一個變數來存放這個地址,那麼這個變數就叫做指向變數的指針變數,也就是用來存放變數地址的這麼一個變數。所謂”指向”就是指存放××的地址,如指向變數的指針變數,”指向”就是指用來存放變數的地址,再如指向數組的指針變數,”指向”就是指存放數組的地址。只要理解了這個,指針也就不難了。另外,還有指向字元串的指針變數,指向函數的指針變數,指向指針的指針變數等。
1) 指針變數的定義
形式:類型標識符 *標識符 如:int *pointer;
要注意兩點:*表示pointer是個指針變數,在用這個變數的時候不能寫成*pointer, *pointer是pointer指向的變數。一個指針變數只能指向同一個類型的變數。如上面
pointer只能指向int型變數。
2)指針變數的引用
兩個有關的運算符:
取地址運算符 a 就代表變數a的地址
* 指針運算符 *a 就代表變數a的值
2. 數組的指針和指向數組的指針變數
數組的指針指數組的起始地址,數組元素的指針指數組元素的地址。
1)指向數組元素的指針變數的定義與賦值
定義和指向變數的指針變數定義相同,c規定數組名代表數組的首地址,即第一個數組元素地址。
2)通過指針引用數組元素
我們通常引用數組元素的形式是a[i],如果用指針可以這樣引用,*(a+i),或定義一個指針變數p,將數組a的首地址賦給p,p=a;然後用*(p+i)引用。
注意:指針變數p指向數組a首地址,則p++指向數組a的下一元素地址,即a[1]的地址。
3)數組名作函數參數
形參數組和實參數組之間並不是值傳遞,而是共用同一段地址,所以在函數調用過程中如果形參的值發生變化,則實參的值也跟著變化。
4)指向多維數組的指針和指針變數
以二維數組為居多。假設定義了一個二維數組a[3][4],那麼
a代表整個二維數組的首地址,也代表第0行的首地址,同時也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。
假設a是一個數組的首地址,那麼如果a是一維的,a+I代表第I個元素的地址,如果a是二維的,則a+I代表第I行的首地址。
那麼第一行第二列的元素地址如何表示呢?a[1]+2或a[1][2]或*(a+1)+2。
我們只要記住:在二維數組中a代表整個數組的首地址,a[I]代表第I行的首地址,a[I]與*(a+I)等價就行了。只要運用熟練了就沒什麼複雜的了。
5)指向由m個整數組成的一維數組的指針變數
如:int (*p)[4],p是一個指向包含4個元素的一維數組,如果p先指向a[0],則p+1指向a[1],即p的增值是以一維數組的長度為單位的,這裡是4,舉個例子:
假設a[3][4]=,p先指向a[0]也就是數組a的首地址,那麼p+1就是a[1]的首地址即元素9的地址,因為在定義p時int (*p)[4],定義一維數組長度為4,所以p+1就等於加了一個一維數組的長度4。
3. 字元串的指針和指向字元串的指針變數
1)字元串的表示形式
c中字元串有兩種表示形式:一種是數組,一種是字元指針
char string[]=”I love c!”;
char *str=”I love c!”;
其實指針形式也是在內存中開闢了一個數組,只不過數組的首地址存放在字元指針變數str中,千萬不要認為str是一個字元串變數。
2)字元串指針作函數參數
實際上字元串指針就是數組的首地址。
3)字元指針變數與字元數組的區別
① 字元數組由若干元素組成,每個元素存放一個字元,而字元指針變數只存放字元串的首地址,不是整個字元串
② 對數組初始化要用static,對指針變數不用。
③ 對字元數組賦值,只能對各個元素賦值,不能象下面這樣:
char str[14];
str=”I love c!”;
對指針變數可以,
char *str;
str=”I love c!”;
注意:此時賦給str的不是字元,而是字元串首地址。
④ 數組在定義和編譯時分配內存單元,而指針變數定義後最好將其初始化,否則指針變數的值會指向一個不確定的數.
嘎嘎。。。就這麼多啦~~
原創文章,作者:PNUDW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317087.html