c語言學習經驗

2021-04-13 06:11:33 字數 2592 閱讀 6068

1.#include"stdio.h"

#include

上次在網路教室上看到有人問這個問題 ""link的時候首先在相對路徑下找.h,找不到然後在到path裡面找,而<>直接在path裡面找,path的設定可以檢視環境變數一般window在安裝目錄的system32中,linux在user/lib裡面

2 巨集使用問題

巨集替換一般在編譯前,所以沒有分配任何的空間,沒有任何的型別可言,同時他是直接替換巨集標號,所以使用一定要小心,有些人過分的喜歡用巨集,其實巨集的使用也不是越多越好,要防止**的膨脹,現在的作業系統基本都是頁式管理,當巨集替換內容過大發生換頁時,巨集的效率不會比呼叫函式快,還好 c++ inline解決了這個問題

3 void f();

void f(void);

void f(...);

第乙個函式的引數列表不是為空(c++裡面是空),他的引數是不確定,第二個函式引數才為空,第三個函式是可變引數函式,很多庫函式都是這樣實現的如:典型的printf(...);

4.c語言裡面只有值傳遞,(c++還有傳引用),實際引數傳進函式的時候,都會生成一些臨時變數儲存這些值,傳指標也是同樣的道理,故你可以改變指標指的內容,不可以改變指標本身,等於傳的是 type * ptr const ;

5.***和序列號

整個程式在執行時總是處於某個狀態,***能夠引起這個狀態的改變,而序列點是某個***已經改變而另乙個沒有開始的地方,倆個相臨的序列點對乙個左值只能夠改變一次,可以多次使用.凡是有序列點問題的量最終的值都是不確定的 象x = ((++x) + (++x) + (++x)) ; f(x , x ++ ) 都存在這樣的問題,具體的值看編譯器是怎麼理解,所以談這樣的問題是沒有任何的意義

6陣列越界問題

c語言為了追求最大的靈活和效率,不對陣列進行邊界檢查,這些工作都是程式設計師自己的事情,不要以為你一越界編譯器就會告訴你,只有當越界到編譯器需要換頁的時候才會報錯,在理想情況下,window下可以越界64k,不過很不幸,我試過很多次,最多達到了30k,不過這個數字也是很恐怖的,30k的彙編**足以對你的作業系統做任何事情.

7 int a[100] = ;能否對陣列初試化為零?初始化問題

這個是能夠初始化為0的,因為在為陣列初始化的時候,當初始化長度小於陣列的大小的時候用0來補充,但是不提倡這樣初始化,一般初試化可以用for迴圈或者memset()(string.h)函式來初始化,還有一種對static變數的初始化問題也是很有趣味的,static變數一般在靜態資料區分配空間,對於區域性的static變數採用的一種類似lazy initlazition的方法,在第一次使用的時候對其初始化,且初始化一次。在宣告變數的時候對它進行初始化是個很好的習慣。經常遇到的問題是:

int i ;然後後面出來個 i ++ ; a [i++]......出了問題連自己也不知道。尤其對於指標 int *p = null ;是個很好的習慣,加上aasert()可以防止對空指標的訪問。

在c++中初始化問題更加複雜。

free的順序也很重要,很多時候free的時候會出現空指標的引用,不足為齊。有人提議free(t);t = null ;這種用法,有一定的道理,當你free一塊空間後,作業系統不會立即**,所以在你再次用t的時候可能還是可以用的,t就成了個野指標,而將其t = null後,對t的引用會出問題。

9對齊與字段問題

看下面倆個結構的定義

struct a (

char a ;

int b ;

}  ;

struct b

對於a,sizeof(a) = 8的,因為存在乙個對齊問題,按照電子計算機組成原理上面的說法,為了取數方便,對於半字型最後一位需是0,字型00,雙字型000。a的長度需要是他裡面資料長度最長那個的整數倍.

b是個字段問題,其實它很簡單如 b:b表示的範圍就是[-8,7],和其他的型別沒有什麼區別。

還介紹乙個比較有技巧性的結構中的乙個變數相對於結構的偏移量。比如求a中b相對於a的偏移量 &((a*)(0)->b) ;

10 陣列和指標

首先請你記住,陣列是陣列,指標是指標,他們不是一回事。

int a[100];

int *p ;

a不是個左值,他不能夠被改變,而p是可以的

看看sizeof(a) = 100 和sizeof(p) = 4(vc6.0)

對於字串還要看看sizeof和strlen的區別:

sizeof還是陣列的大小,strlen以0結束(不包括0)大家一定要注意因為不注意出現問題你都不知道怎麼回事

如:void f( char * p )

char *t ;

int lenofp = strlen(p);

t = ( char *) malloc( sizeof(char) * lenofp );

strcpy ( t , p ) ;..

} 問題在那裡,大家想想。這裡有個越界。

陣列和指標的差別遠不止這些,你在運用中就會體會得到。下面有個很有意思的公式:

a[i] = *( a + i ) = * ( i + a ) = i[a] ;

呵呵 ,想想 char a[4] = "abc" ; 2[a] = 't' ; a[2] = ? ;

其實這個也很好理解,假如你學了彙編或者計算機組成原理你就應該知道乙個叫做基址變址定址的如:8[bx] ;

C語言學習經驗

我原來學的是c 現在要考試c語言,在學習之際,發現雖說是c 從c發展過來的,但是其中的細節的不同之處還是蠻多的,include void fun char s main fun a printf n 正如這段 如果把函式fun放在main的後面,編譯器就會報錯!錯誤如下 warning c4013 ...

C語言學習

c語言學習 2013 3 26 1 編寫strcat s,t 函式,功能 將t指向的字串複製到s指向的字串的尾部。程式設計思路 1 通過while迴圈找到字串s的結束符。2 從找到的結束符開始將t複製到s,同時移動二者的指標。2 編寫函式strend s,t 如果字串t出現在字串s的尾部,該函式返回...

c語言學習

今天總結一些c 語言方面的知識 變數的概念 其值在作用域內可以改變的量稱為變數。乙個變數應該有乙個名字,並在記憶體中佔據一定儲存空間。區域性變數和全域性變數 區域性變數是在函式內作定義說明的,其作用域僅限函式內,離開該函式再使用這種變數是非法的。全域性變數也稱為外部變數,是在函式外部定義的變數,它不...