當前位置:首頁 » 編程語言 » 大一c語言指針考試應該注意什麼
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

大一c語言指針考試應該注意什麼

發布時間: 2023-03-31 19:04:50

❶ 初學c語言應該要注意一些什麼

祥子
[學者] 編程語言其實是一個很初級的工具,但是你又必須熟練的掌握它,學懂一門編程語言就好像學會了寫字,但是會寫字的人不見得會寫文章,而會寫文章又不見的寫得好。可是如果你不會寫字,那就一定寫不出文章來。

首先,在學習C語言之前,應該學好計算機基礎。裡面的很多概念對於C程序員都是非常重要的。如果你在著手學習C之前,或者已經開始學習C,但是碰到了很多問題,應該再把計算機基礎的書拿來好好看看。

如果你有足夠的耐心,十足的毅力,應該再學習C語言之前學學匯編,這會讓你對許多比較細膩的概念有清醒的認識,如果你不是那麼有耐心(恕我直言,大部分人可能沒有)。那麼可以在看完一遍C語言的教材後再看,但是一定要看一遍,相信我一定會受益匪淺。

看到有些人發問的帖子,很明顯的沒有仔細的思考過問題,或者沒有認真地查閱過書籍,因為其中的語法和邏輯錯誤實在是不能理解。想來如果你的語文作業上面滿篇都是錯字,老師一定不會放過你。為什麼不先打好基礎呢?有些人抱怨說因為教材不好,老師水平不行等等。但是我本人就是在TC2下學習C語言的,那時候除了譚浩強的書,也幾乎找不到什麼別的書。我不打算就譚浩強的書發表什麼意見,那也實在稱不上是一本好書,但是如果這本是能學好,全部看好,都記住,也應該有相當的水平了。建議不管看什麼書,先認真地看懂,不要貪速度,應該力求深入的理解。

如果你能夠比較熟練的解決一本教材上的所有習題,那麼就應該轉入對演算法的學習,盡管此時你的C語言還稱不上精通,有許多細節問題還不了解,許多問題還沒有碰到,但是這些問題會在後面的工作和學習中得到解決的。

新手學習C語言,有很多誤區,以一個學過C語言的人,給新手一些建議。
拋磚引玉,請前輩指出問題,發表意見,新手請注意後面的回復。
第一:一些概念。
C語言是一門程序設計語言,有一些標准,比較重要的是ANSI C(好像是C89)和C99。
數據結構包括邏輯結構和物理結構。邏輯結構是數據元素集合和定義在集合上的關系。物理結構是邏輯結構在計算機中的實現。
LCC、VC、TC、GCC都是C語言編譯器,一般包括集成開發環境,編譯器和鏈接器及輔助工具
我們書寫的是C源程序,源程序通過編譯器編譯為中間文件,中間文件經鏈接器鏈接生成可執行文件。不同操作系統可執行文件不同。中間文件也有幾個標准,微軟使用的和Linux下通用的有差異。
第二:學習什麼。
個人認為程序設計學習的重點放在數據結構的學習上,但是這種學習要有一個平台,比如C語言。
學習C語言首先要掌握基本語法,常量、變數、類型、及順序結構、分支結構和循環結構的意義及用法。進一步學習構造類型如指針、結構、函數的意義和用法。
C語言提供一些標准函數以減輕程序設計工作量,這些函數我們自己也可以實現。即使不依靠函數庫,只有編譯器,理論上就足夠了。事實上,提供的標准函數效率都很高,使用很頻繁,沒有自己實現的必要,所以掌握常用函數是非常必要的,但是要注意函數的適用范圍。
繼續學習因人而異,應該可以獨立選擇了。
第三:如何學習。
強調多實踐,C語言的學習要經常上機,多寫程序才能逐步提高。
推薦書籍:C Programming Languge。有中譯本,但最好看英文版。
通讀,並將所有習題獨立思考,給出解答,尤其是編程實踐題,最好逐一上機完成。

C語言其實並不難,如果認真掌握了C Programming Language,C語言的基礎就可以了,繼續學習就更加容易。建議不要找捷徑,通過考試除外,真正的水平提高是建立在編程實踐積累基礎上的,必須一個一個程序的完成才能提高。

談及C語言,我想凡是學過它的朋友都有這樣一種感覺,那就是「讓我歡喜讓我憂。」歡喜的是,C語言功能非常強大、應用廣泛,一旦掌握了後,你就可以理直氣壯地對他人說「我是電腦高手!」,而且以後若是再自學其他語言就顯得輕而易舉了。憂慮的是,C語言猶如「少林武功」 一般博大精深,太難學了。其實就筆者認為C語言並非是「difficult(困難)」的,只要你能理清思路,掌握它的精髓,那麼自學C語言是一件非常容易且又其樂無窮的事。今天本人就與大家一起談談如何學習C語言或者說學習C語言應從哪幾方面著手。

了解一些基本知識

一.C語言的背景

就個人感觸,無論學習哪門語言首先應該了解一下自己所學語言的背景,也可以說它的發展史。

C語言屬於高級程序語言的一種,它的前身是「ALGOL」。其創始人是布朗·W·卡尼漢和丹尼斯·M·利奇。C語言問世時是帶有很大的局限性,因為它只能用於UNIX系統上。然而隨著科學技術的進步,計算機工業的發展,C語言逐漸脫離UNIX。1987年美國標准化協會制定了C語言的國際標准,簡稱 「ANSI C」,從此以後它便成為一種廣泛使用的程序語言。C語言的優點很多,主要的有如下四點:

1.兼備高級語言與低級語言的優點,屬於一種中間語言。

2.它是一種結構化程序設計語言,非常適合結構化程序設計。

3.有較豐富的數據類型、運算符以及函數供以選用。

4.直接與內存打交道,使修改、編輯其他程序與文檔變得輕松,簡單。

二.二大語系二種不同的學習方法

筆者學習過很多程序語言,例如:C,C++(C語言的擴展),QBASIC,VB(BASIC的可視化),JAVASCRIPT,JSCRIPT ,VBSCRIPT,JAVA,ASP,FOXPRO,PERL等等,就本人實踐所得,其實高級程序語言分為兩大語系。一路是以C為主的程序語言,例如: JAVASCRIPT,JAVA等,這類語言在函數的調用,程序語句的書寫,循環的控制都極為相似。另一路是以BASIC為首的程序語言,例如: FOXPRO,VBSCRIPT等,此類語言同樣具有相似的函數調用,程序語句書寫以及循環控制,但與C語系是不同的。因此若是您以前是從QBASIC起家的,那麼在學習C語言前最好是先洗洗腦,千萬不要把學習BASIC的方法以及思路用在C身上。

講到這里,我想大家對C語言一定有了感性認識吧!下面讓我們再升華一下,全方位親密接觸它。學習C語言必須從以下四點入手,也就是說,只要你能掌握這四點的內容,那麼基本上就大功告成了。

親密接觸C語言

一.輸入輸出

C語言的輸入輸出是非常嚴格的,或許在其他程序語言中我們可以不關心這個問題,但在C語言中,我們必須要徹底了解它。由於篇幅有限,因此筆者不能詳談,有興趣的朋友可以參考由著名程序語言教授譚浩強先生主編,由清華大學出版社出版的《C程序設計第二版》。不過這里筆者還是有幾點要談一下。

1.二維浮點數數組的輸入

二維浮點數數組的輸入(即:通過鍵盤給二維浮點數數組賦值)在很多專業書中都沒有詳細講過這個問題。在給二維浮點數數組賦值時一定要先聲明一個變數,接著把數值賦予這個變數,最後把變數數值賦予二維浮點數數組賦值。實例如下:

# include "stdio.h"
main()
{
float a[2][3],x ;
int i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{scanf("%f",&x); <br>a[i][j]=x;}
}
不能寫成:

# include "stdio.h"
main()
{
float a[2][3] ;
int i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%f",&a[i][j]);
}

同樣道理,在結構性浮點數組變數中也一定要按照這種格式輸入。實例如下:

# include "stdio.h"
struct student
{float b[3]; <br>int x; <br>}a[2];
main()
{
float x ;
int i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
{scanf("%f",&x); <br>a[i].b[j]=x;}
}

2.注意輸出格式中「%」後的字元

C語言的輸出說復雜不復雜,因為常用的都很簡單。可說不復雜也未必,記得曾在一次等級考前輔導我們C語言的教授講道:「如果C語言要考得很難的話,根本不用考什麼指針,只要專考輸出格式,我想百分之九十九的學生都不及格。」當時我們無不認同。從這則事例中可以看出C語言的輸出格式之復雜程度。因此大家在學習它時千萬要學會辨別輸出格式中「%」後的字元,每個字元都有其意義,也都有其作用。

二.優先順序

說道優先順序,有很多朋友都不是很了解或說很模糊。為此筆者想先通過一個例子讓各位有個概念。什麼叫優先順序?比方說,我們在公交車終點站排座隊時總會遇到70歲以上的老人不需要排隊就能上車的情景,這就是優先順序的涵義。C程序在運行時也象排隊坐車一樣,首先照顧那些優先順序高的運算符,若是優先順序相同,那麼就象遇到兩位(或兩位以上)70歲以上的老人那樣,讓他們依次上車。但是C語言中的優先順序的運算並不是千篇一律的,只能說是在大多數情況下,有些運算符的優先順序有其自己的特點,因此這點大家要注意。例如條件表達式:條件?結果1:結果2,這種表達式很多朋友都知道,它的作用與IF…ELSE…條件判斷語句很雷同,它運算時的優先順序就不是按照C語言的規則來完成的。所以說對於優先順序各位編程愛好者一定靈活掌握,不要死記硬背。

三.指針

就個人認為,C語言中的指針是最有特色的,當然也是最難學的。指針說穿了,其實是變數的一種表現形式,只不過這種變數記載的不是數值而是地址。就象一個人可以用姓名來表示自己,也可以用身份證號碼來表示自己一樣。筆者涉足編程已經有三年多了,在這期間曾經收到過很多網友的電子郵件詢問學習指針的方法。就本人感觸,學習指針最好是先學些計算機硬體工作的原理,例如:直接定址,間接定址等,只有了解了這些內容以後,你再學指針就比較容易理會,畢竟C語言是一門介於機器語言與高級語言中間的語言,沒有一些硬體工作知識是很難領悟它的真諦的。然而事事並非絕對,如果你沒有這些知識也不要緊,只要清楚知道以下筆者總結的二點再加上多練習便可:

1.指針是地址變數:它的值有兩種:其一是地址,其二是內容。不同的表達方式可以取不同的值,這有點象一個家庭地址在不同的場合標識的人物也不同。例如:父母親在他們的單位所登記的家庭地址就代表他們自己,而你在學校中登記的同樣的家庭地址就代表你自己。

2.指針是可以運算的,它的運演算法則與變數是一致的。

另外,在編寫一個程序時,除非萬不得已,一般不要使用指針變數。因為指針是比較復雜的,用不好就「當機」。所以筆者建議各位對於指針只要能看懂就行,當然如果你是准備參加考試的就另當別論了。

四.函數

雖說很多程序語言都有函數這一內容,但筆者覺得C語言的函數是最有魅力的。如果你能完全掌握C語言的函數,那麼學習C++就不成問題了(C++是一門建立在C語言上,但又不同於C語言的高級程序語言,它增添了很多函數。)。學習函數的方法是比較簡單的,只有兩個字「牢記」,即:牢記函數的功能,牢記函數的用途以及如何輸入輸出。有些朋友認為,程序語言中的函數沒有多大用處,其實這並不正確,函數從本質上講是一段通用程序,用它可以幫助我們節約很多編程的時間,一個聰明的編程者在編寫程序前往往總是先找自己所編寫的程序中有多少是可以用函數來代替的。筆者曾經作過一個比較字元串的實驗,用C語言中的 strcmp()函數只要一句話,而自己編寫的話30句話都擺不平,可想而知函數是多麼實用呀!

寫到這里筆者該告一段落了,下面送一個本人自己用C 語言編寫的注冊表比較程序給諸位。此段程序的注釋請看「/*…*/」後的文字,程序運行時(在DOS模式下)輸入的方式如下:compare xx1.reg xxx2.reg xxx3.txt,注意欄位與欄位之間是有空格的。(compare是程序名)

程序代碼:

# include "stdio.h" /*定義頭文件或說包含文件*/

main(argc,argv) /*定義帶參數的主函數*/

int argc; /*定義參數類型*/
char *argv[]; /*定義第二參數類型*/
{ FILE *fp1,*fp2,*fp3; /*定義文件指針*/
char a,b; /*定義字元變數*/
if((fp1=fopen(argv[1],"r"))==NULL)
/*打開第一的注冊表備份文件,如果不存在則跳出程序並顯示「The file don`t open!」*/
{ printf("The file don`t open!");
exit(0); }
if((fp2=fopen(argv[2],"r"))==NULL) /*打開第二的注冊表備份文件,如果不存在則跳出程序並顯示「The file don`t open!」*/
{ printf("The file don`t open!");
exit(0);}
if((fp3=fopen(argv[3],"w"))==NULL) /*建立新的文本文件,用於存放比較結果。*/
{printf("The file don`t open!"); <br>exit(0);}
rewind(fp1); /*規定文件指針fp1指向第一個注冊表文件頭部*/
rewind(fp2); /*規定文件指針fp2指向第二個注冊表文件頭部*/
while(!feof(fp1)||!feof(fp2)) /*開始比較*/
{ a=fgetc(fp1); /*讀取第一個注冊表文件內容並賦予給字元變數a*/
b=fgetc(fp2); /*讀取第二個注冊表文件內容並賦予給字元變數b*/
if(a!=b) fputc(b,fp3);
/*字元變數a與b不相同的話,那麼把不同之處寫入新建的文本文件中*/
if(feof(fp1)) fputc(b,fp3);
/*如果第一個注冊表文件已經讀完,第二個文件還有未讀取部分,那麼把第二個文件的剩餘部分全部寫入新建文件中*/
if(feof(fp2)) fputc(a,fp3);} /*如果第二個注冊表文件已經讀完,第一個文件還有未讀取部分,那麼把第一個文件的剩餘部分全部寫入新建文件中*/
fclose(fp1); /*關閉第一個注冊表文件*/
fclose(fp2); /*關閉第二個注冊表文件*/
fclose(fp3); /*關閉新建文件*/
}

對於高深莫測的C語言來說,寥寥3千字並不能說清楚的什麼問題。但只要您看了此文後,我想對於您學習此語言一定有很大的幫助,同時也能了知曉如何用最短的時間學會C語言以及掌握C語言的精髓所在。另外,此文中所涉及的知識點都是筆者通過實踐得出的,因此若是其他專業書籍沒有講到過的問題可以參考本文。最後祝大家學習C語言順利!

❷ 大一C語言期末考試重點是什麼在書上的哪幾章

C語言考試重點?不太好說但我可以給你推薦需要掌握的一些點。
1.函數部分。函數是C語言功能的最小單位。函數主要增強代碼可讀性與規范性,同時搭配指針可以構造改變一些復雜的數據結構。學好函數對以後在C語言實用編程及工作有著很好的引領作用。
2.指針。指針可以說是C語言的靈魂,這也是C語言最大的特點,同時也是考試的重難點。相信樓主不會只學C語言,C語言是典型的面向過程的語言,而實用性與功能性更為強大的Java語言是面向對象的語言,而無法理解面向對象,對Java的學習將寸步難行。如何理解面向對象,銀棚通過對指針櫻搏宴的深入理解是最好的選擇。
3.基本的系統函數。其實各類語言在系統函數方面是大同小異的,學好C語言的基本系統函數(輸入輸出函數,字元串脊銀函數和基本的數學函數等)之後,往後對其它類型的語言的學習會輕松很多。

❸ 大一期末C語言考試的重點是什麼

C語言的初學者,大學考試試卷有四種題型:一是選擇題,二是理論題,三是程序填空題,四是編程題。選擇題比較綜合,理論題純粹是書本上的是答案(如:一些語法等等),至於程序填空題和編程題,要多去做一些題(尤其是書本上的題)。。。要想學好,就要多練,看程序是沒用的。。

❹ C語言考試技巧

一.特點和注意事項 1、填空題
(1)上機填空題一般包含2個(或3個)空。 (2)要填空的位置用___、___、___表示。
(3)考生在考試時應刪除標識___、___、___後填入相應的符號。
特別要注意的是:只能在要填空的位置上進行修改,不要添行、刪除、合並或分解,不要改動程序行的順序,更不要自己另編程序。 2.改錯題
(1)上機改錯題中有2個(或3個)錯誤需要修改。
(2)試題中用「/******found******/」來提示在下一行(或下面第二行)有錯。 (3)錯誤的性質基本分為語法錯誤和邏輯錯誤,也有些試題要求把語句添加在下劃線處。
(4)特別要注意的是:只能在出錯的行上進行修 二.做題技巧
以下是對上機考試改錯題的做題方法和總結,改錯題的錯誤主要分為以下幾類:
一般情況,錯誤主要分為語法錯誤和邏輯錯誤。
先檢查語法錯誤,編譯程序後發現沒有錯誤及警告,說明沒有語法錯誤,只有邏輯錯誤;邏輯錯誤必須根據程序的功能及預期結果來考查。
因此,對於程序改錯題,應先編譯查找其中的語法錯誤,通過編譯器的提示容易找到錯誤的地方及原因,然後再尋找邏輯錯誤。修改了語法錯誤後再次編譯,直到修改完所有的語法錯誤。而查找邏輯錯誤時,需要運行程序根據結果來檢查。
1、if或while語句
若錯誤行是if或者while語句,則要注意以下點: 1)首先判斷是否正確書寫if或while關鍵字;
2)然後看有沒有用小括弧把整個表達式括起來,若沒有則加上小括弧; 3)若條件表達式中有指針變數而且沒有指針運算符時,則加上指針運算符; 4)若if條件表達式中只有一個等於號即數學等號(=),則要改寫成兩個等於號即邏輯等號(==);
若if條件表達式為其他的比較運算符,則一般是進行逆轉或加一個等於號; 2、for語句
若錯誤行是for語句,則要注意以下幾點: 1)首先判斷for有沒有書寫正確;
2)然後看for中的表達式是不是用分號(;)隔開,若不是則改為分號。 3、記住是分號(;),不是逗號(,)!
再者,分析for中的三個表達式,是否符合題意; 第一個表達式表示起始條件, 第二個表達式表示終止條件,
第三個表達式表示循環變數的變化。 4、return語句
若錯誤行為return語句,則要注意以下幾點: 1)首先看是不是正確書寫return關鍵字;
2)然後看是不是缺少分號,若是則加上分號即可;

3)再者判斷return後的變數或表達式是否正確;
這種錯誤需要根據題意來分析,分析返回變數或表達式的值和類型。 5、賦值語句
若錯誤行是賦值語句,則要看賦值是否正確,然後看賦值運算符是否寫正確。 6、定義語句
若錯誤行是定義語句,則要注意: 1)首先分析變數類型是否符合;
2)然後分析賦初值是否正確,求和初值賦0,求積初值賦1;
3)若以上均不是,則看是不是少定義了某個變數或少了花括弧; 7、關鍵字拼寫錯誤。如:main-mian(錯誤) printf - pirntf (錯誤)
Return- return(錯誤) while- While (錯誤)
8、表達式錯誤問題
表達式錯誤占的份量最多,並且沒有統一的改法,我們只能通過題目要求來分析並修改),
1)若錯誤行中有整數1除以某個表達式或變數時,必須把整數1改為1.0;若變數或表達式是整型時,則只能進行強制類型轉換。
2)變數必須先賦值,後才參與運算,沒有賦值就不能參與運算;例如,long k;k*=num%10;
3)運算符書寫錯誤,例如,把/寫成\(num\=10);,==寫成=。 4)丟失括弧() 9、字元串類問題
1)若錯誤行中有字元串結束符,則特別要要注意結束符有沒有寫錯(『\0』不要寫成"\0」)。
2)新組建的字元串一定要加結束標識符(『\0』); 3)要區分清楚字元『o』和數字『0』。
4)字元串復制、比較必須使用用字元串處理函數(strcpy或strcmp)實現,不能用賦值語句或關系運算符。 10、指針類問題
若錯誤行中有指針變數,並且該變數名之前沒有指針運算符,則般都是加上指針運算符;即注意p和*p的區別; 11、函數首部類問題:
若錯誤行是函數首部,則要注意:
1)首先看該行最後有沒有分號,若有則刪掉分號;若中間有分號則要改為逗號;
2)形參和實參類型不一致問題
① 若實參是個地址或數組名或指針變數名,則對應的形參肯定是指針或數組;
②若實參是二維數組名,則對應的形參應該是指針數組或是二維數組; ③若後面用到形參時有指針運算符,則該形參應為指針類型;
④若形參是二維數組或指向M 個元素的指針變數,則該二維的長度必須與main中對於數組的第二維的長度相同。 3)函數類型不一致問題
①若函數中沒有return語句,則函數類型為void;

②若函數中有ret urn語句,則函數的類型必須與rerun後的變數類型一致;
記住,調用函數的類型與main中的該函數的類型一致! 12、語法錯誤問題:
1)語句缺少分號。若錯誤號中語句沒有以分號結束則加上分號;
2)變數名不一致。C語言是區分大小寫的,若錯誤行中有大寫字母一般都改為小寫字母;
3)若錯誤行中有一條橫線,則必須將橫線刪除再填空。填空題中亦是如此。 13、邏輯錯誤問題:
這種題型主要是表達式錯誤,占的題量比較多而且沒有統一的做題方法,需要我們具體問題具體分析。對於邏輯錯誤,可按下列步驟查找:
①先讀試題,看清題目的功能要求。
②通讀程序,看懂程序中演算法的實現方法。 ③細看程序,發現常見錯誤點。 14、書寫錯誤問題:
特別注意我們的注釋部分,注釋是以/*開始,以*/結尾,不能有多餘的,有也只能在/*和*/裡面。注意,比如「/***注釋部分*****/*/」是錯誤的!
二、編程時容易犯的錯誤
1.書寫標識符時,忽略了大小寫的區別
C語言認為大些字母和小寫字母時兩個不同的字元,如在編譯程序過程中,系統會把a和認為時兩個不同的變數名。習慣上,符號常量名用大寫表示,變數名用小寫表示,以增加程序的可能性。
2.忽略了變數的類型,進行了不合法的運算
3.忽略了「=」與「= =」的區別;C語言中,「=」是賦值運算符,「= =」是關系運算符
4.忘記加分號
考生應特別注意這種情況,分號是C語言中不可缺少的一部分,語句末尾必須有分號,但有時候千萬不能加;
5.輸入變數時忘記加地址運算符「&」,而在不應加「&」的位置加了地址運算符
(1)忘記加「&」的情況。
如int a,b; scanf(「%d%d」,a,b);
此時,無法正確給a和b讀入數據。scanf函數的作用是:按照a、b在內存中所分配的地址將a、b的值存進去。「&a」指a在內存中的地址,因此正確的書寫格式為scanf(「%d%d」,&a,&b);。
(2)多加「&」的情況。如int str[ ]; scanf(「%s」,&str);
C語言編譯程序對數組名的處理是:數組名代表數組的起始地址,scanf函數中的輸入項是字元數組名,因此不必再加地址符&,應該去掉。
6.輸入數據的方式余要求格式(通配符)不符。例如:scanf(「%d,%d」,&a,&b);
C規定:如果在「格式控制」字元串中,除了格式說明以外還有其他字元,則在輸入數據時應輸入與這些字元相同的字元。下面輸入是合法的:3,4

此時不用逗號而用空格或其他字元是不對的,如:3 4(中間為空格)3:4(中間為冒號);
三、相關概念
(1)素數:定義是除了能被1和自身整除外,不存在其他任何能整除該數的自然數。因此,在判斷一個數是否為素數時,只要有除了1和本身能整除它,還有一個數能整除它,就判定此數不是素數。
(2)判斷一個年份是否為閏年:如果年份能被4 整除但是不能被100整除,或者能被400整除,這兩種情況滿足之一都是閏年。
(3)利用選擇法進行從小到大的排序。選擇法的思路為:把第一個元素與其後面的元素比較,如果比後面的大,則交換,比較完所有的元素後,第一個位置的元素是最小的元素;在把第二個元素與其後面的元素進行比較,結果是除了第一個元素外,第二個元素是最小的元素;以此類推。
(4)數的按位分離演算法是:對10取模求個位上的數字,整除10後再對10取模求十位上的數字,整除100後再對10取模求百位上的數字。
(5)最大公約數的演算法是:(1)若n>m,則用n除以m求余數r;(2)若r=0,則m為最大公約數,若r≠0,則將r賦值於m,m賦值於n,繼續用n除以m求余數r;(3)直到r=0,m為最大公約數。根據演算法判斷每一條語句是否正確。 (6)求最小公倍數的演算法:等於兩個數的乘積除以它們的最大公約數。 (7)矩陣時以行為外循環,列為內循環,可以同時計算周邊元素的和。

❺ 急!!敘述對C語言指針的認識,在使用指針時應該注意什麼問題 謝謝大神幫助

指針
從變數名處起,根據運算符優先順序結合,一步一步分析:
int p; //這是一個普通的整型變數
int *p; //首先從P 處開始,先與*結合,所以說明P 是一個指針,然後再與int 結合,說明指針所指向的內容的類型為int 型.所以P 是一個返回整型數據的指針
int p[3]; //首先從P 處開始,先與[]結合,說明P 是一個數組,然後與int 結合,說明數組里的元素是整型的,所以P 是一個由整型數據組成的數組
int *p[3]; //首先從P 處開始,先與[]結合,因為其優先順序比*高,所以P 是一個數組,然後再與*結合,說明數組里的元素是指針類型,然後再與int 結合,說明指針所指向的內容的類型是整型的,所以P 是一個由返回整型數據的指針所組成的數組
int (*p)[3]; //首先從P 處開始,先與*結合,說明P 是一個指針然後再與[]結合(與"()"這步可以忽略,只是為了改變優先順序),說明指針所指向的內容是一個數組,然後再與int 結合,說明數組里的元素是整型的.所以P 是一個指向由整型數據組成的數組的指針
int **p; //首先從P 開始,先與*結合,說是P 是一個指針,然後再與*結合,說明指針所指向的元素是指針,然後再與int 結合,說明該指針所指向的元素是整型數據.由於二級指針以及更高級的指針極少用在復雜的類型中,所以後面更復雜的類型我們就不考慮多級指針了,最多隻考慮一級指針.
int p(int); //從P 處起,先與()結合,說明P 是一個函數,然後進入()里分析,說明該函數有一個整型變數的參數然後再與外面的int 結合,說明函數的返回值是一個整型數據
Int (*p)(int); //從P 處開始,先與指針結合,說明P 是一個指針,然後與()結合,說明指針指向的是一個函數,然後再與()里的int 結合,說明函數有一個int 型的參數,再與最外層的int 結合,說明函數的返回類型是整型,所以P 是一個指向有一個整型參數且返回類型為整型的函數的指針
int *(*p(int))[3]; //從P 開始,先與()結合,說明P 是一個函數,然後進入()裡面,與int 結合,說明函數有一個整型變數參數,然後再與外面的*結合,說明函數返回的是一個指針,然後到最外面一層,先與[]結合,說明返回的指針指向的是一個數組,然後再與*結合,說明數組里的元素是指針,然後再與int 結合,說明指針指向的內容是整型數據.所以P 是一個參數為一個整數據且返回一個指向由整型指針變數組成的數組的指針變數的函數.

1、細說指針
指針是一個特殊的變數,它裡面存儲的數值被解釋成為內存里的一個地址。
要搞清一個指針需要搞清指針的四方面的內容:指針的類型、指針所指向的類型、指針的值或者叫指針所指向的內存區、指針本身所佔據的內存區。
1.指針的類型
從語法的角度看,你只要把指針聲明語句里的指針名字去掉,剩下的部分就是這個指針的類型。這是指針本身所具有的類型。
例1:
(1)int*ptr;//指針的類型是int*
(2)char*ptr;//指針的類型是char*
(3)int**ptr;//指針的類型是int**
(4)int(*ptr)[3];//指針的類型是int(*)[3]
(5)int*(*ptr)[4];//指針的類型是int*(*)[4]
2.指針所指向的類型
當你通過指針來訪問指針所指向的內存區時,指針所指向的類型決定了編譯器將把那片內存區里的內容當做什麼來看待。
從語法上看,你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符*去掉,剩下的就是指針所指向的類型。
(1)int*ptr; //指針所指向的類型是int
(2)char*ptr; //指針所指向的的類型是char
(3)int**ptr; //指針所指向的的類型是int*
(4)int(*ptr)[3]; //指針所指向的的類型是int()[3]
(5)int*(*ptr)[4]; //指針所指向的的類型是int*()[4]
在指針的算術運算中,指針所指向的類型有很大的作用。
指針的類型(即指針本身的類型)和指針所指向的類型是兩個概念。當你對C 越來越熟悉時,你會發現,把與指針攪和在一起的"類型"這個概念分成"指針的類型"和"指針所指向的類型"兩個概念,是精通指針的關鍵點之一。
3.指針的值----或者叫指針所指向的內存區或地址
指針的值是指針本身存儲的數值,這個值將被編譯器當作一個地址,而不是一個一般的數值。在32 位程序里,所有類型的指針的值都是一個32 位整數,因為32 位程序里內存地址全都是32 位長。指針所指向的內存區就是從指針的值所代表的那個內存地址開始,長度為si zeof(指針所指向的類型)的一片內存區。以後,我們說一個指針的值是XX,就相當於說該指針指向了以XX 為首地址的一片內存區域;我們說一個指針指向了某塊內存區域,就相當於說該指針的值是這塊內存區域的首地址。
指針所指向的內存區和指針所指向的類型是兩個完全不同的概念。在例一中,指針所指向的類型已經有了,但由於指針還未初始化,所以它所指向的內存區是不存在的,或者說是無意義的。
以後,每遇到一個指針,都應該問問:這個指針的類型是什麼?指針指的類型是什麼?該指針指向了哪裡?(重點注意)
4 指針本身所佔據的內存區
指針本身佔了多大的內存?你只要用函數sizeof(指針的類型)測一下就知道了。在32 位平台里,指針本身占據了4 個位元組的長度。
指針本身占據的內存這個概念在判斷一個指針表達式(後面會解釋)是否是左值時很有用。
2、指針的算術運算
指針可以加上或減去一個整數。指針的這種運算的意義和通常的數值的加減運算的意義是不一樣的,以單元為單位。例如:
例二:
char a[20];
int *ptr=(int *)a; //強制類型轉換並不會改變a 的類型
ptr++;
在上例中,指針ptr 的類型是int*,它指向的類型是int,它被初始化為指向整型變數a。接下來的第3 句中,指針ptr 被加了1,編譯器是這樣處理的:它把指針ptr 的值加上了sizeof(int),在32 位程序中,是被加上了4,因為在32 位程序中,int 佔4 個位元組。由於地址是用位元組做單位的,故ptr 所指向的地址由原來的變數a 的地址向高地址方向增加了4 個位元組。
由於char 類型的長度是一個位元組,所以,原來ptr 是指向數組a 的第0 號單元開始的四個位元組,此時指向了數組a 中從第4 號單元開始的四個位元組。
我們可以用一個指針和一個循環來遍歷一個數組,看例子:
例三:
int array[20]={0};
int *ptr=array;
for(i=0;i<20;i++)
{
(*ptr)++;
ptr++;
}
這個例子將整型數組中各個單元的值加1。由於每次循環都將指針ptr
加1 個單元,所以每次循環都能訪問數組的下一個單元。
再看例子:
例四:
char a[20]="You_are_a_girl";
int *ptr=(int *)a;
ptr+=5;
在這個例子中,ptr 被加上了5,編譯器是這樣處理的:將指針ptr 的值加上5 乘sizeof(int),在32 位程序中就是加上了5 乘4=20。由於地址的單位是位元組,故現在的ptr 所指向的地址比起加5 後的ptr 所指向的地址來說,向高地址方向移動了20 個位元組。在這個例子中,沒加5 前的ptr 指向數組a 的第0 號單元開始的四個位元組,加5 後,ptr 已經指向了數組a 的合法范圍之外了。雖然這種情況在應用上會出問題,但在語法上卻是可以的。
這也體現出了指針的靈活性。
如果上例中,ptr 是被減去5,那麼處理過程大同小異,只不過ptr 的
值是被減去5 乘sizeof(int),新的ptr 指向的地址將比原來的ptr 所指向的地址向低地址方向移動了20 個位元組。

❻ c語言指針怎麼理解,什麼時候會用到指針,要注意哪些方面

cpu自己有運算器和寄存器,通過匯流排與存儲器件相連,在執行運算時,
需要將數據沖存儲器件上面將參與運算的數據讀入,運算完成後再送出到
存儲區。那麼cpu讀入時需要訪問存儲器件的某個單元,需要指定這個單元
的編號,我們管這個編號叫存儲地址。
比如:int a[10],*p; p=&a[3];a就是一個擁有10個整型數據的數據區
的首地址,變數p是存放地址的,稱為指針型變數,賦值時需要取相應存儲
區的地址,p=&a[3];就是取數組a的第4個單元的地址給p,那麼p就拿到了
這個單元的地址,*p=5;就相當於a[3]=5;的操作,p++;後p指針就指向a[4]。
在操作大塊數據時,一般記錄首地址(數組指針),然後根據首地址再加
上偏移量來訪問整個數據,在你程序中寫a[3]時,計算機就會取a數組對應
的首地址再加3個整型偏移量來訪問相應數據。用指針p訪問a數組的好處
是,不用每次計算a加多少偏移訪問數據,而是使p指向某數據後可以p++
或p--來訪問前一個或後一個數據。
注意:
1.指針存放地址用,不是存儲實際數據的,它是用來找數的,在
程序中要注意這點,往往出問題的是,指針還沒有賦值就用來操作,或
用指針來存放數據,如:int *p=15,s[10]={ 0,15,{0} };的
p指針賦值有問題,這樣計算機會把15當成地址存放到p變數中,以後用
*p訪問得到的數據就不是你想要的數據了。(應該類似:p=s+1; *p=15;)
2.指針訪問數據區一般需要程序來控制不要越界,比如定義了10個單元
的數據區,你不能讓指針超出這10個單元的范圍,否則得到的數據就是
不靠譜的。
3.指針的定義只是開設了可以訪問數據區或數組的變數,數據區和數組
需要你的程序另行開設,然後把數據區或數組的某個單元的地址賦值給
指針變數,不要認定義了能訪問數組的指針,數組就定義好了。
4.指針存放的地址最好不要用來與其他地址比較,除非你能確認地址比
較的結果肯定是你想要的。
5.舉例來說,int a[10],*p=a;中a和p都是指針(地址),但a和p是不同的
在編譯器眼中,a是一個數據區的首地址,是一個標記,你程序中使用a
時,編譯器會知道用數據區的首地址來替換操作,而p是你自己程序開
設的變數,可以在程序中操作比如p++; p=a;等,但作為記號的a就不能
在程序中操作了,如a++; a=p;就是錯的了。
6.子程序如果參數是指針型的,這個參數由子程序開設的指針型臨時
變數存儲,這個臨時變數可以進行操作,但不會返回給調用者的指針型
變數。
如:int a[10],*p; int f(int *s) { s++; } main() { p=a; f(p); }
s再怎麼加減都不會影響p。

❼ 大一c語言期末考試復習的重點,通常考什麼東西(越詳細越好)

北京理工大學的-。-!唉。。我北理工又被我黑了
信息學院
基本概念/運算/基本語句 13
數組/字元串 20
函數/遞歸 21
指針 16
結構/聯合/枚舉/鏈表 25
文件 5
合計(分) 100

◆非信息學院
基本概念/運算/基本語句 18
數組/字元串 21
函數/遞歸 22
指針 16
結構/聯合/ 12
文件 5
綜合演算法 6
合計(分) 100

● 考試范圍說明:
1、基本語句中,goto語句不考。
2、數組部分重點是一維數組,基本概念部分涉及到二維數組的概念。
3、指針部分,多級指針不考。
4、文件部分,11.5文件操作狀態和出錯檢測函數不考。
5、非信息類考生,聯合、枚舉、typedef和鏈表不考。

還有還有。。這是非軟體專業的。。我記得當時我們軟體學院考的時候。。二維數組是小重點

❽ 求C語言中指針優點和注意事項說明(要有例子的)

Joel Spolsky認為,對指針的理解是一種aptitude,不是通過訓練就可以達到的。雖然如此,我還是想談一談這個C/C++語言中最強勁也是最容易出錯的要素。

鑒於指針和目前計算機內存結構的關聯,很多C語言比較本質的特點都孕育在其中,因此,本篇和第六、第七兩篇我都將以指針為主線,結合在實際編程中遇到的問題,來詳細談談關於指針的幾個重要方面。

指針類型的本質分析

1、指針的本質

指針的本質:一種復合的數據類型。下面我將以下面幾個作為例子進行展開分析:

a)、int *p;
b)、int **p;
c)、int (*parValue)[3];
d)、int (*pFun)();

分析:

所謂的數據類型就是具有某種數據特徵的東東,比如數據類型char,它的數據特徵就是它所佔據的內存為1個位元組, 指針也很類似,指針所指向的值也占據著內存中的一塊地址,地址的長度與指針的類型有關,比如對於char型指針,這個指針占據的內存就是1個位元組,因此指針也是一種數據類型,但我們知道指針本身也占據了一個內存空間地址,地址的長度和機器的字長有關,比如在32位機器中,這個長度就是4個位元組,因此指針本身也同樣是一種數據類型,因此,我們說,指針其實是一種復合的數據類型,

好了,現在我們可以分析上面的幾個例子了。

假設有如下定義:

int nValue;

那麼,nValue的類型就是int,也就是把nValue這個具體變數去掉後剩餘的部分,因此,上面的4個聲明可以類比進行分析:

a)、int *

*代表變數(指針本身)的值是一個地址,int代表這個地址裡面存放的是一個整數,這兩個結合起來,int *定義了一個指向整數的指針,類推如下:

b)、int **

指向一個指向整數的指針的指針。

c)、int (*)[3]

指向一個擁有三個整數的數組的指針。

d)、int (*)()

指向一個函數的指針,這個函數參數為空,返回值為整數。

分析結束,從上面可以看出,指針包括兩個方面,一個是它本身的值,是一個內存中的地址;另一個是指針所指向的物,是這個地址中所存放著具有各種各樣意義的數據。

2、對指針本身值的分析

下面例子考察指針本身的值(環境為32位的計算機):

void *p = malloc( 100 );

請計算sizeof ( p ) = ?

char str[] = 「Hello」 ;
char *p = str ;

請計算sizeof ( p ) = ?

void Func ( char str[100])
{
請計算 sizeof( str ) = ? //注意,此時,str已經退化為一個指針,詳情見
//下一篇指針與數組
}

分析:上面的例子,答案都是4,因為從上面的討論可以知道,指針本身的值對應著內存中的一個地址,它的size只與機器的字長有關(即它是由系統的內存模型決定的),在32位機器中,這個長度是4個位元組。

3、對指針所指向物的分析

現在再對指針這個復合類型的第二部分,指針所指向物的意義進行分析。

上面我們已經得到了指針本身的類型,那麼將指針本身的類型去掉 「*」號就可得到指針所指向物的類型,分別如下:

a)、int

所指向物是一個整數。

b)、int*

所指向物是一個指向整數的指針。

c)、int ()[3]

()為空,可以去掉,變為int [3],所指向物是一個擁有三個整數的數組。

d)、int ()()

第一個()為空,可以去掉,變為int (),所指向物是一個函數,這個函數的參數為空,返回值為整數。

4、附加分析

另外,關於指針本身大小的問題,在C++中與C有所不同,這里我也順帶談一下。

在C++中,對於指向對象成員的指針,它的大小不一定是4個位元組,這主要是因為在引入多重虛擬繼承以及虛擬函數的時候,有些附加的信息也需要通過這個指針進行傳遞,因此指向對象成員的指針會增大,不論是指向成員數據,還是成員函數都是如此,具體與編譯器的實現有關,你可以編寫個很小的C++程序去驗證一下。另外,對一個類的靜態成員(static member,可以是靜態成員變數或者靜態成員函數)來說,指向它的指針只是普通的函數指針,而不是一個指向類成員的指針,所以它的大小不會增加,仍舊是4個位元組。
指針運算符&和*

「&和*」,它們是一對相反的操作,』&』取得一個物的地址(也就是指針本身),』*』得到一個地址里放的物(指針所指向的物)。這個東西可以是值(對象)、函數、數組、類成員(class member)等等。

參照上面的分析我們可以很好地理解&與*。

使用指針的好處?

關於指針的本質和基本的運算符我們討論過了,在這里,我想再籠總地談一談使用指針的必要性和好處,為我們今後的使用和對後面篇章的理解做好鋪墊。簡而言之,指針有以下好處:

1)、方便使用動態分配的數組。

這個解釋我放在本系列第六篇中進行講解。

2)、對於相同類型(甚至是相似類型)的多個變數進行通用訪問。

就是用一個指針變數不斷在多個變數之間指來指去,從而使得非常應用起來非常靈活,不過,這招也比較危險,需要小心使用:因為出現錯誤的指針是編程中非常忌諱的事情。

3)、變相改變一個函數的值傳遞特性。

說白了,就是指針的傳地址作用,將一個變數的地址作為參數傳給函數,這樣函數就可以修改那個變數了。

4)、節省函數調用代價。

我們可以將參數,尤其是大個的參數(例如結構,對象等),將他們地址作為參數傳給函數,這樣可以省去編譯器為它們製作副本所帶來的空間和時間上的開銷。

5)、動態擴展數據結構。

因為指針可以動態地使用malloc/new生成堆上的內存,所以在需要動態擴展數據結構的時候,非常有用;比如對於樹、鏈表、Hash表等,這幾乎是必不可少的特性。

6)、與目前計算機的內存模型相對應,可按照內存地址進行直接存取,這使得C非常適合於一些較底層的應用。

這也是C/C++指針一個強大的優點,我會在後面講述C語言的底層操作時,較詳細地介紹這個優點的應用。

7)、遍歷數組。

據個例子來說吧,當你需要對字元串數組進行操作時,想一想,你當然要用字元串指針在字元串上掃來掃去。

…實在太多了,你可以慢慢來補充^_^。
指針本身的相關問題

1、問題:空指針的定義

曾經看過有的.h文件將NULL定義為0L,為什麼?

答案與分析:

這是一個關於空指針宏定義的問題。指針在C語言中是經常使用的,有時需要將一個指針置為空指針,例如在指針變數初始化的時候。
C語言中的空指針和Pascal或者Lisp語言中的NIL具有相同的地位。那如何定義空指針呢?下面的語句是正確的:

char *p1 = 0;
int *p2;
if (p != 0)
{
...
}
p2 = 0;

也就是說,在指針變數的初始化、賦值、比較操作中,0會被編譯器理解為要將指針置為空指針。至於空指針的內部表示是否是0,則隨不同的機器類型而定,不過通常都是0。但是在另外一些場合下,例如函數的參數原型是指針類型,函數調用時如果將0作為參數傳入,編譯器則不能將其理解為空指針。此時需要明確的類型轉換,例如:

void func (char *p);
func ((char *)0);

一般情況下,0是可以放在代碼中和指針關聯使用的,但是有些程序員(數量還不少呦!也許就包括你在內)不喜歡0的直白,認為其不能表示作為指針的特殊含義,於是要定義一個宏NULL,來明確表示空指針常量。這也是對的,人家C語言標准就明確說:「 NULL應該被定義為與實現相關的空指針常量」。但是將NULL定義成什麼樣的值呢?我想你一定見過好幾種定義NULL的方法:

#define NULL 0
#define NULL (char *)0
#define NULL (void *)0

在我們使用的絕大多數計算系統上,例如PC,上述定義是能夠工作的。然而,世界上還有很多其它種類的計算機,其CPU也不是Intel的。在某些系統上,指針和整數的大小和內部表示並不一致,甚至不同類型的指針的大小都不一致。為了避免這種可移植性問題,0L是一種最為安全的、最妥帖的定義方式。0L的含義是: 「值為0的整數常量表達式」。這與C語言給出的空指針定義完全一致。因此,建議採用0L作為空指針常量NULL的值。

其實 NULL定義值,和操作系統的的平台有關, 將一個指針定義為 NULL, 其用意是為了保護操作系統,因為通過指針可以訪問任何一塊地址, 但是,有些數據是不許一般用戶訪問的,比如操作系統的核心數據。 當我們通過一個空(NULL)的指針去方位數據時,系統會提示非法, 那麼系統又是如何知道的呢??

以windows2000系統為例, 該系統規定系統中每個進程的起始地址(0x00000000)開始的某個地址范圍內是存放系統數據的,用戶進程無法訪問, 所以當用戶用空指針(0)訪問時,其實訪問的就是0x00000000地址的系統數據,由於該地址數據是受系統保護的,所以系統會提示錯誤(指針訪問非法)。

這也就是說NULL值不一定要定義成0,起始只要定義在系統的保護范圍的地址空間內,比如定義成(0x00000001, 0x00000002)都會起到相同的作用,但是為了考慮到移植性,普遍定義為0 。

2、問題:與指針相關的編程規則&規則分析

指針既然這么重要,而且容易出錯,那麼有沒有方法可以很好地減少這些指針相關問題的出現呢?

答案與分析:

減少出錯的根本是徹底理解指針。

在方法上,遵循一定的編碼規則可能是最立竿見影的方法了,下面我來闡述一下與指針相關的編程規則:

1) 未使用的指針初始化為NULL 。

2) 在給指針分配空間前、分配後均應作判斷。

3) 指針所指向的內容刪除後也要清除指針本身。

要牢記指針是一個復合的數據結構這個本質,所以我們不論初始化和清除都要同時兼顧指針本身(上述規則1,3)和指針所指向的內容(上述規則2,3)這兩個方面。

遵循這些規則可以有效地減少指針出錯,我們來看下面的例子:

void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, 「hello」);
free(str);
if(str != NULL)
{
strcpy(str, 「world」);
printf(str);
}
}

請問運行Test函數會有什麼樣的結果?

答:

篡改動態內存區的內容,後果難以預料,非常危險。因為free(str);之後,str成為野指針,if(str != NULL)語句不起作用。

如果我們牢記規則3,在free(str)後增加語句:

str = NULL;

那麼,就可以防止這樣的錯誤發生。