C語言盲點筆記1

2021-09-07 01:57:04 字數 2915 閱讀 5700

寥寥數筆。我的紀錄c語言盲點筆記,只是以前所經歷。還誤,可以交流。

沒有不論什麼差別,都表示a是int指標

建議這麼寫int *a;這樣明顯一點

理由例如以下

int *a,b;

a是指標,b是整形,一幕了然

可是你假設寫成int* a,b;

儘管a還是指標,b還是整形

可是a前面沒直接跟*,一不留神,還真把b看成指標了

2.c語言中和微控制器c語言的資料型別char,前者是字串型別。後者和int一樣是8位的資料型別

3.c語言malloc申請結構體內存。通過free釋放

4.c語言函式不能返回區域性變數的位址

#include

char *returnstr()

int main()

#include 

char *returnstr()   

int main()   

5。

返回指向堆記憶體的指標是能夠的

char *getmemory3(int num)  

void test3(void)  

#include 

//此函式中d也是個區域性變數,函式執行完自己主動銷毀。可是指標分配的空間不會被自己主動**。除非程式猿delete掉。

//所以這個能夠正常輸出。

char *a()

//可是第二個陣列空間是系統維護的,函式執行完自己主動銷毀

char *b()

;return p;

}上面兩列子充分說明,在c語言中,字串常量,和字元陣列儲存的位置不一樣,前者存放在字串常量區,後者是在棧區開闢的暫時記憶體,儘管a的數值在編譯時就規定了(因此a的值不能做改動)

//引數是值傳遞方式,改變形參的位址,傳遞的實參的位址確不會因此改變

void c(int n,char *pname)

;pname = a[n];

}void main()

{int n=0;

char *pname = "db";

printf("%s\n",a());//輸出zet

printf("%s\n",b());//隨機輸出亂碼

c(2,pname);

printf("%s\n",pname); //輸出db。由於char *pname = "db";已經使得pname指向了db,但c(2,pname);並不能改變pname指向的位址。

//形象點說就是:我有乙個箱子給你用,你能夠在裡面裝東西。可是你不能把我的箱子換成另外乙個給我。

//在這裡指的是不能函式呼叫不能使pname變成函式中的二維陣列a。

scanf("%d

",&n);

這個樣例充分說明在函式中。不能對傳入的指標代表的位址做轉化。這個如p=a,這時的p是函式在棧開闢的,

不再代表實參所表示的位址,也近一步說明要是在函式內部給形參賦值,那麼這個形參就會自帶獲取乙個記憶體。

而實參的內容不變,故指標傳入僅僅能改動其指向的內容,改動他的數值(位址)是沒有意義的。

主函式是實引數表示的位址沒有變化

6.一般涉及字串操作時。最好使用標準的字串操作函式。如strcpy,strcat,strcmp等

同一時候這些函式傳入的指標初始化得指向char型別,不能是unsigned char否則出現例如以下警告pointer targets in passing argument 1 of 'strlen' differ in signedness

7,一級指標傳在函式中,能夠改動函式指定的值。2級指標就能夠改動指標指向的位置。

8.c語言中int資料型別強制轉化為char型,僅僅保留最低的8位,如int a ;(unsigned char)a.

char型(1位元組)賦值給int型(2位元組):數值賦給int的低8位。高8位補0

9,int *p和char *p中,p++,在記憶體空間看來。前者移動4個位元組int型資料,後者僅僅移動1個位元組。

10 .c語言中對檔案的操作嵌入式開發主要是fopen,fread,fwrite,這些操作主要針對2進製的檔案進行資料的讀和寫。

fopen:wb 僅僅寫開啟或新建乙個二進位制檔案;僅僅同意寫資料。rb 讀寫開啟乙個二進位制檔案,僅僅同意讀寫資料。ab表示執行讀和寫

11.字串陣列和普通字串的差別在於後者分配記憶體時自己主動在後面加ascii為0的\0結束符號。
也就是0x00.

12.

c語言中陣列的名字不能改變。陣列名編譯時默覺得指標常量const。

程式呢不同意出現有改動

c語言裡定義乙個字串能夠使用指標也能夠使用陣列。如:

(1) char *s="hello"; //"hello"是字串常量,屬於const 型別,s是指向字串常量的指標,常量僅僅能讀,是不同意改變的。不能寫成s[0]=x,但能夠改變指標的值,使其指向不同的常量,如 s = "xeron";

(2) char s="hello"; //指標常量,s本身的值不能改動。但能夠改動其指向的內容。s[0]=x

兩者的差別是

(1)前者定義的字串在程式裡不能被改動,由於它存放在**段內,字元常量區。

(2)後者定義的字串可被改動。它存放在資料段或者棧內。

字串內容要發生改動的多考慮使用字串陣列

13.fread和fwrite開闢的快取區的話。最好用char型別的指標作為buffer的位址

同一時候須要指定buffer的大小。否則會出現segmentation fault錯誤

14.要善於使用資料型別的強制轉化,這個對資料在記憶體的儲存結構緊密相聯系
15.c語言函式引數入棧順序從右到左,使得能夠確定動態引數的個數。

C語言筆記 1

字與位元組 不同系統的字的定義可能不一樣,位元組長度與編譯器有關 bit 位 位元組 8bit 字 4位元組 32bit 半字 2位元組 16bit int 4位元組 char 1位元組 double 8位元組 float 4位元組 short 2位元組 long 4位元組 注意 指標都是4位元組 ...

C語言筆記1

helloworld include main fahrshiftcelsius1.0 include 當fahr 0,20,300時,分別 列印華氏溫度 攝氏溫度對照表 main getch fahrshiftcelsius2.0 include 當fahr 0,20,300時,分別 列印華氏溫度...

C語言筆記1

程式執行的目的是結果,過程 資料型別的本質含義是所佔位元組數和解析方法 函式名是函式的首位址 呼叫函式的方法還可以用函式指標來解引用以呼叫該函式 函式指標指向乙個函式位址後,直接呼叫該函式名就可以執行指向的函式了,因為已經確定了首位址 指標全名是指標變數,普通變數與指標變數沒有區別。c語言使用棧來儲...