1. 程式人生 > >C語言高階篇

C語言高階篇

原文:https://www.2cto.com/kf/201604/497355.html

C語言高階部分

一、記憶體大話題
{
1.0、記憶體就是程式的立足之地,體現記憶體重要性。
1.1、記憶體理解:記憶體物理看是有很多個Bank(就是行列陣式的儲存晶片),每一個Bank的列就是位寬 ,每一行就是Words,則儲存單元數量=行數(words)×列數(位寬)×Bank的數量;通常也用M×W的方式來表示晶片的容量(或者說是晶片的規格/組織結構)。
M是以位寬為單位的總容量,單位是兆 ,W代表位寬, 單位是bit。計算出來的晶片容量也是以bit為單位,但使用者可以採用除以8的方法換算為位元組(Byte)。比如8M×8,這是一個8bit位寬晶片,有8M個儲存單元,總容量是64Mbit(8MB)。



1.2、c語言中其實沒有bool型別:以0表示假,非0表示真,則在記憶體儲存是以int型存放的。如果想要表示真假,可以用int/char型做替換,在c++中就有bool x=true/false;

1.3、記憶體對齊:記憶體對齊(提高訪問效率速度,編譯器一般預設是4位元組對齊):https://blog.csdn.net/hbuxiaofei/article/details/9491953


1.4、char/int/short/long/float/double型:放在記憶體的長度和解析作用。(int *)0,使0地址指向一個int型。又比如0000111010101可以解析成int型也可以解析成float型。

1.5、
Linux核心是面向物件的,而c語言是面向過程的,但可以用結構體內嵌指標變成面向物件。如 struct student{
int age; //變數
int lenth; //將相當於一個類,有變數有函式
char *name;
void (*eat)(void); //函式指標
}

1.6、棧的理解:(1) 執行時自動分配&自動回收:棧是自動管理的,程式設計師不需要手工干預。方便簡單。(表現在彙編程式碼,編譯時,會自動編譯成彙編碼實現函式呼叫完立即改變棧頂)
(2) 反覆使用:棧記憶體在程式中其實就是那一塊空間,程式反覆使用這一塊空間。(硬體上有個暫存器,用來存放棧的棧頂地址,棧是有大小的空間)

(3) 髒記憶體:棧記憶體由於反覆使用,每次使用後程序不會去清理,因此分配到時保留原來的值。
(4) 臨時性:(函式不能返回棧變數的指標,因為這個空間是臨時的)
(5) 棧會溢位:因為操作系統事先給定了棧的大小,如果在函式中無窮盡的分配棧記憶體總能用完。棧的操作(怎麼出棧怎麼入棧)是由具體硬體來干預,程式設計師只要明白原理就可以了,但是要給相應的棧暫存器賦值。當呼叫函式時,變數會自動放在棧中(入棧)當函式呼叫完後,棧會自動出棧.
( 6 ) 棧的 "發展"有四種情況,滿增棧,滿減棧,空增棧,空減棧,至於是那種要根據編譯器決定,而s5pv21 是滿減棧。

1.7、堆的理解:(1)作業系統堆管理器管理:堆管理器是作業系統的一個模組,堆管理記憶體分配靈活,按需分配。
(2)大塊記憶體:堆記憶體管理者總量很大的作業系統記憶體塊,各程序可以按需申請使用,使用完釋放。
(3)髒記憶體:堆記憶體也是反覆使用的,而且使用者用完釋放前不會清除,因此也是髒的。
(4)臨時性:堆記憶體只在malloc和free之間屬於我這個程序,而可以訪問。在malloc之前和free之後都不能再訪問,否則會有不可預料的後果。
(5)程式手動申請&釋放:手工意思是需要寫程式碼去申請malloc和釋放free。(記住:不要把申請的地址給搞丟了, 不然自己用不了,也釋放不了)
申請一段記憶體,可以是: malloc(10*sizeof ( int ) ); 原型:void *malloc(size_t size); //指標函式 size_t是巨集定義int 都是便於可移植性 ,返回一個記憶體地址,void *可以看出,希望申請的記憶體用來存放什麼就強制型別什麼。
calloc( 10,sizeof ( int ) ); 原型:void *calloc(size_t nmemb, size_t size);// nmemb個單元,每個單元size位元組
void *realloc(void *ptr, size_t size);// 改變原來申請的空間的大小的ptr是原來申請記憶體的指標,size是想要重新申請記憶體的大小
使用就是*(p+1)=12 ; *(P+3)=110;
申請失敗返回NULL,申請成功返回一個地址,申請之後一定要檢驗(NULL!=p)用完一定要 free ( p ) ;釋放後不是不能用,是不應該使用了。可以給它“洗盤子‘,p=NULL;
其實申請的記憶體並不能真正改變大小,原理是先重新申請一段記憶體,然後把原來申請的記憶體上的內容複製到新的記憶體上,然後釋放掉原來的記憶體,返回新的指標。
(6) 在申請記憶體時,malloc(0)其實也是成功的,因為系統規定少於一定數目的大小,都申請規定的大小,如在win32系統下申請少於32位元組的地址,最後申請到的空間是32位元組,
在朱老師視訊中申請少於16位元組的地址,最後申請到的是16位元組,至於規定多少位元組,由具體的系統而言。


1.8、記憶體裡的資料: (1)程式碼段:存放程式碼二進位制、常量(char *p="linux",則”linux“存放在程式碼段,是不可更改的)
(2) 資料段: 存放非0全域性變數、靜態區域性變數(區域性只屬於函式的,不是整個程式的)
(3) bss : 存放為0的全域性變數/為0的靜態區域性變數、存放未初始化全域性變數/靜態區域性變數
注意:const int a=9; 有兩種存放方式:第一種確實存放在程式碼段,讓a不能修改,第二種是仍然存放在資料段中,讓編譯器來判斷,如果有改變的程式碼就會報錯。 至於那種,是不確定的,像微控制器就屬於第一種。

1.9、《1》一個原始檔實際上是以段為單位編譯成連線成可執行檔案(a .out );這個可執行檔案總的說是分為資料段,程式碼段,自定義段,資料段還可以細分成 .bbs 段。而雜段會在執行的時候拿掉。所以a.out分為雜段,資料段(存放的是非0全域性變數).bbs段,程式碼段。
《2》記憶體實際上被劃分了兩大區域,一個是系統區域,另一個是使用者區域,而每一個區域又被劃分成了幾個小區域,有堆,棧,程式碼區,.bbs區,資料區(存放的是非0全域性變數)。
《3》對於有作業系統而言, 當我們在執行a.out可執行檔案時,執行這個檔案的那套程式會幫我們把雜段清掉,然後把相應的段載入到記憶體對應的段。對於裸機程式而言,我們是使用一套工具將a.elf的可執行程式給清掉了所有段的符號資訊,把
純淨的二進位制做成.bin格式的燒錄檔案。所以我們載入到記憶體的程式是連續的,也就是說程式碼段和資料段、.bbs段都是連續的。當然,棧空間是我們自己設定的。而且在裸機中我們不能使用malloc函式,因為我們使用的只是編譯器、聯結器工具沒有整合庫函式,沒有定義堆空間區。
《4》大總結多程式執行情況: 在Linux系統中執行cdw1.out時,執行這個檔案的那套程式會幫我們把相應的段載入到記憶體對應的段。然後作業系統會把下載到記憶體的具體實體地址與每條命令(32位)的連結地址對映到TTB中(一段記憶體空間),當我們又執行cdw2.out時,
同樣也像cdw1.out一樣載入進去,並對映到TTB表中。而且這兩個.out檔案預設都是連結0地址(邏輯),當cpu發出一個虛擬地址(Linux中程式邏輯地址)通過TTB查詢的實體地址是不一樣的。所以對於每一個程式而言,它獨佔4G的記憶體空間,看不到其他程式。

}

二、位操作
{
2.1 ~(0u)是全1;

2.2 位與& 位或 | 位取反~ 位異或^

2.3、位與、位或、位異或的特點總結:
位與:(任何數,其實就是1或者0)與1位與無變化,與0位與變成0
位或:(任何數,其實就是1或者0)與1位或變成1,與0位或無變化
位異或:(任何數,其實就是1或者0)與1位異或會取反,與0位異或無變化

2.4、左移位<< 與右移位>> C語言的移位要取決於資料型別。
對於無符號數,左移時右側補0(相當於邏輯移位)
對於無符號數,右移時左側補0(相當於邏輯移位)
對於有符號數,左移時右側補0(叫算術移位,相當於邏輯移位)
對於有符號數,右移時左側補符號位(如果正數就補0,負數就補1,叫算術移位)

2.5、小記:常與 1 拿來 做位運算。讓他取反、移位 得到想要的數。

2.6、直接用巨集來置位、復位(最右邊為第1位)。 置位置1,復位置0 ;
#define SET_NTH_BIT(x, n) (x | ((1U)<<(n-1)))
#define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1)))
}


三、指標—精髓
{
3.1 printf("%p \n"); 其中%p表示輸出一個指標,就是指標變數(其存放的那個地址),可以理解為輸出一個地址。

3.2 int* p1, p2 ; 等同於 int *p1; int p2;  int *p="Linux",其不能改變*P,因為”linux"是一個常數。

3.3 ( 程式碼規範性 )在定義指標時,同時賦值為NULL,在用指標時,先判斷它是不是NULL。尤其是在malloc申請記憶體後,free(p);則一定要讓p=NULL

3.4 C/C++中對NULL的理解: { #ifdef _cplusplus// 定義這個符號就表示當前是C++環境
#define NULL 0;// 在C++中NULL就是0
#else
#define NULL (void *) 0;// 在C中NULL是強制型別轉換為void *的0
#endif
3.5、修飾詞:const (修飾變數為常量,應該理解為不應該去變它,當作常量,而並非永遠不能改變,當然要看具體執行環境,在gcc,const 這種就可以採用指標方式修改,但是在
在VC6.6++中就不可以修改):其雖然是當作常數,但是仍然存放在資料段中,用指標仍然可以改變值。
第一種:const int *p;
第二種:int const *p;
第三種:int * const p;
第四種:const int * const p;
3.6、 陣列 int a[2]; 其中a是指首元素的首地址,&a是整個陣列的收地址(陣列指標,其這個指標指向一個數組),他們的值是一樣的,但意義不一樣,可以參照 int a; int *p=&a; 來理解。陣列和指標天生姻緣在於陣列名;
int a[3]; int* p=a;是可以的,但是 int *p=&a;就會報錯,儘管他們的值是一樣的,但意義不一樣,所以是不允許的,除非強制型別轉換。在訪問時是a[0],其實編譯器會把它變成
*(a+0)的方式,只是用a[0]看起來更方便,封裝了一下而已,實質還是指標。

3.7、 siziof()是一個運算子,測試所佔記憶體空間,如 int a[100] ;sizeof(a)=400;
與strlen( )要有所區別,他是測字串實際長度的,不包括‘\0‘,如果給strlen傳的引數不是一個字串,則它會一直去找,直到 找到第一個 ‘\0’,然後再計算其長度。
如 char a[]="chen"; char *p=a; 則strlen(p)=4;

3.8、 當陣列作為一個形參時,其實參是一個數組名(也可以是指標,其本質就是指標),意義是首元素的首地址,則傳過去隻影響形參的第一個元素。形引數組的地址被實引數組地址所繫結;
實參的大小會丟失,所以往往會傳一個int num 大小進去。

3.9、 結構體做為形參時,應儘量用指標/地址方式來傳,因為結構體變數有時會佔很大,效率很低。

4.0、 int *p=&u; p存放的是變數u的地址,而&p的意思就是變數p本身的地址。

4.1、當要傳參的個數比較多時,我們可以打包成一個結構體,傳參的個數越多,其開銷就更大. 

4.2 一個函式作用其實就是輸入輸出,引數可以作為輸入,返回可以作為輸出,但是當要返回多個輸出時,這時候就不夠用了,所以常常返回值用來判斷程式又沒有出錯,而引數
就是當作輸入輸出的,輸入時可以加const表示它沒必要去修改,而輸出都是指標,因為要改變它的值,只能採用地址傳遞這種方式。比如:char *strcpy(char *dest,const char *src)

}

四、C語言複雜表示式
{
4.1、在表示式中,要看符號的優先順序和結合性。

4.2、在理解記憶體時,記憶體0地址在最底下,至上地址逐漸增加。

4.3、int *p;是定義的一指標變數p,而int ( *p)[4];也是一個指標變數p;也可以這樣想:凡是遇到(*p)什麼的判斷他是指標後,就可以說他是指標變數,包括函式指標。

4.4、一個函式 int max(int a ,int b); 則他的函式指標是 int ( *p ) (int ,int );其意思就是定義這個型別的函式指標變數p; p=max是賦值,引用是p();則相當於max()呼叫這個函式。
函式指標必須和原函式的型別一樣。


4.5 函式指標其實就是為了做結構體內嵌指標的,這樣就構成了高階語言中的類。再一個就是上述4.4中p=&max;也是可以的,它和p=max,值和意義都是一樣的,
這個和陣列有所區別,陣列的a和&a的值雖然一樣,但是意義完全不一樣。int a[4];a有兩層意思,第一層是陣列名,&a表示整個陣列的地址,第二層表示首元素的首地址。

4.6 int (*p[4])(int ,int)其意思是函式指標陣列,一個4長度的陣列,裡面存了4個函式指標。

* 4.7 printf在做輸出時,其機制是緩衝行來輸出,即當遇到一個\n後再打印出來,即使再多printf,沒有遇到\n,都不是一個一個列印。
'\r'是回車,'\n'是換行,前者使游標到行首,後者使游標下移一格,通常敲一個回車鍵,即是回車,又是換行(\r\n)。Unix中每行結尾只有“<換行>,
即“\n”;Windows中每行結尾是“<換行><回車>”,即“\r\n”;Mac中每行結尾是“<回車>”。scanf("");裡面不要加\n符。

4.8 在一個c檔案中,有時候會多次引入一個.h檔案,所以在寫.h檔案時,要寫{#ifndef _FINE_
#define _FINE_
XXXXXXXX


XXXXXXXXXXX
#endif }
4.9、typedef int *intType; const intType p,其意思是指標p為const;


4.9.1 對於typedef的定義:如typedef const int cdw; 可以這樣理解,typedef就是給一個型別區別名的,那麼系統會自動識別該型別,如果typedef const int char 則就報錯。

4.9.2 在開發中經常會typedef int int32_t ; typedef short int16_t; 這樣做的目的是便於在不同平臺下的移植,如果當在另一個平臺下,int 是64位的,但是我的專案中都是用的int32_t;
所以只需要修改int32_t就可以了,我可以讓他typedef short int32_t;這樣我只更改一次,其餘的都改了,做到一改全改。

** 4.9.3 int **p; int *a[4]; p=a;可以這樣理解:首先它是指標陣列,既然是陣列,則a即表示陣列名又表示首元素的首地址,a[0]是一個一重指標,而a是a[0]的地址,
那麼a就是一個二重指標;{ 一重指標的地址就是二重指標變數,所以有p=a; 而 int a[4][3] ,a和一維陣列的意思是一樣的,如 int a[3][6],int *p ;p=a[0];所以不能p=a,
int *a[3][3],int **p;p=a[0];}

** 4.9.4、二維陣列是為了簡化程式設計,平面型。陣列以下標示方式訪問其實是編譯器封裝起來的,實質是指標訪問。int (*p)[5]; int a[2][5];則有 p=a; 關鍵是要把二維陣列抽象成n行n列
用指標訪問方式理解:二維陣列可以看作是一個方格子的矩陣,比如a[2][5],那麼就是2行5列的10個小格子,第一行可以收納起來變成一個指向一維陣列的指標,第二行也是如此;
這樣收納後就變成了一個新的陣列a[2],每一個格子存放的是它收納的第一個元素的地址,如a[0]存放的是第一行第一列元素的地址,“a”[1]存放的是第二行第一列的地址;
再與一維陣列相聯絡,一維陣列名即表示陣列名又表示陣列第一個元素的地址,所以a[2][5]中的a表示“a"[2]陣列第一個元素的地址;那麼再把p=a;層層推遞,(p+i)表示
指向第幾行的地址,*(p+i)表示取第幾行的值(而這個值存放的是第幾行一列元素的首地址),*(p+i)+j 表示指向第幾行第幾列的地址,最後在引用這個地址,*(*(p+i)+j)
就表示第幾行第幾列的值了。
一重指標----------->一維陣列

二重指標----------->指標陣列

陣列指標----------->二維陣列

函式指標----------->普通函式


}

五、陣列&字串&結構體&共用體&列舉(5.6?)
{
5.1、c語言中定義一個字串: char a[6]={'l','i','n','u','x','\0'}; '\0'的字元編碼為0就是NULL;也就是說記憶體中遇到0,翻譯成字元是就是'\0',或這是NULL;
char a[6]="linux";
char *p="linux";

5.2、 sizeof(a)=6是運算子,其意思是所佔空間大小,包括字串後面的‘\0',strlen(a)=5是一個函式,其意思是字串的長度。strlen( p);其中p只有是字元指標變數才有意義,
它的形參是陣列變數是沒有意義的,因為strlen是根據什麼時候遇到 '\0',才結束測試字串的長度,就算陣列不初始化也是有長度的。
char *p="linux"; sizeof(p)永遠等於4,因為p是指標變數,存的是地址。所以總結:sizeof()是拿來測陣列的大小,strlen()是拿來測試字串的長度。

5.3、結構體用 . 或者是 ->訪問內部變數,其實質是用的指標訪問。如 struct student{
int a;
double b;
char c;
}s1;
則s1.a =12;實質就是int *p=(int *) &s1;*p=12 首先a是int 型,所以是強制型別 int * ,其次是就是算地址,然後強制型別,地址應該是int 型然後加減,不然的話,系統
s1.b=12.2;實質就是double *p= (double *) ((int)&s1+4),*p=12.2; 不知道是以int 型加減還是以float型加減,還是以char型加減,所以 應當 (int)&s1; 而且因為地址是
s1.c=c;實質就是 char *p=(char *) ((int)&s1+12); *p=c; 4位元組的,所以必須是int型。

&* 5.4、對齊方式:(1)猜測如果是32位系統,那麼編譯器預設是4位元組對齊,64位系統,那麼編譯器預設是8位元組對齊,因為32位或64位一次性訪問效率是最高的。
(2)<1>結構體首地址對齊(編譯器自身幫我們保證,會給它分配一個對齊的地址,因為結構體自身已經對齊了,那麼第一個變數也就自然對齊,所以我們才可以想象成第一個變數從0地址存放);
<2>結構體內部的各個變數要對齊。
<3>整個結構體要對齊,因為定義結構體變數s1時,再定義變數s2時,如果s1沒有對齊,就坑了s2,所以也要保證整個結構體對齊。
無論是按照幾字節對齊,我們都可以聯想到記憶體實際的安排。1位元組對齊那麼不管int float double 型別,在每4個格子的記憶體挨著存放。2位元組對齊,也是一樣的
想法,舉一個列子,如果第一個變數是char 型,第二個變數是int型,那麼0地址存放char型,1地址空著,2地址存放int型地址部分,3地址存放int型地址部分,然後

相關推薦

C語言高階 - 1.C語言複雜表示式和指標高階應用

1.指標陣列與陣列指標 1.1、字面意思來理解指標陣列與陣列指標 (1)指標陣列的實質是一個數組,這個陣列中儲存的內容全部是指標變數。 (2)陣列指標的實質是一個指標,這個指標指向的是一個數組。   1.2、分析指標陣列與陣列指標的表示式 (1)int *

C語言高階 - 5.記憶體

1、馮諾依曼結構和哈佛結構      (1)馮諾依曼結構是:資料和程式碼放在一起。      (2)哈佛結構是:資料和程式碼分開存在。      (3)什麼是程式碼:函式   &nbs

C語言高階 - 4.連結串列&狀態機與多執行緒

1.連結串列的引入 1、從陣列的缺陷說起         (1)陣列有2個缺陷,一個是陣列中所有元素的型別必須一致;第二個是陣列的元素個數必須事先制定並且一旦指定之後不能更改。         (2)如何解決

C語言高階 - 3.儲存類&作用域&生命週期&連結屬性

1.概念解析 1.1、儲存類         (1)儲存類就是儲存型別,也就是描述C語言變數在何種地方儲存。         (2)記憶體有多種管理方法:棧、堆、資料段、bss段、.text段······一個

C語言高階 - 2.C語言位操作

1、位操作符         (1)位與&         (2)位或|         (3)位取反~      

C語言高階 - 6.陣列&字串&結構體&共用體&列舉

1.程式中記憶體從哪裡來1 1.1、程式執行需要記憶體支援 ()對程式來說,記憶體就是程式的立足之地(程式是被放在記憶體中執行的);程式執行時需要記憶體來儲存一些臨時變數。 1.2、記憶體管理最終是由作業系統完成的 (1)記憶體本身在物理上是一個硬體器件,由硬體系統提供。 (2)

C語言高階 - 7.指標

1、指標使用三部曲:定義指標變數、關聯指標變數、解引用         (1)當我們int *p定義一個指標變數p時,因為p是區域性變數,所以也遵循C語言區域性變數的一般規律(定義區域性變數並且未初始化,則值是隨機的),所以此時p變數中儲存的是一個隨機的數

C語言高階

原文:https://www.2cto.com/kf/201604/497355.html C語言高階部分 一、記憶體大話題 { 1.0、記憶體就是程式的立足之地,體現記憶體重要性。 1.1、記憶體理解:記憶體物理看是有很多個Bank(就是行列陣式的儲存晶片

C語言已死(連載1)——趣味、通俗、實用的計算機達人成長之路之C語言高階技巧

第一章 學習C語言的起跑線1.1 C語言已死?本書描述的就是使用C語言的高階技巧,力求將你的C語言能力由“基礎”提升為“高階”。但是學習態度勝過學習方法,在正式學習之前,有一個問題不吐不快,那就是“C語言還值得學習嗎?”正方觀點——C語言已死正方論據:C語言的三宗罪:1、程式

嵌入式LInux之C語言提升---Skr Skr Up Up

任務 開發者 三目運算 關鍵字const 此外 mat 庫函數 linu 限制 嵌入式C語言提升 致敬:每一個奮鬥的人! Up Up UpC語言常見編譯錯誤1.預處理錯誤 -E 1-1 找不到源文件錯誤 自己定義頭文件 使用 “xxx.

C語言基礎-數據類型(二)關鍵字

至少 硬件 邏輯結構 內存空間 結構 根據 什麽 操作 自定義 導航:   1. 數據類型   2. 自定義類型   3. 邏輯結構   4. 類型修飾符   5. 雜項 ----->x<------------->x<--------------

朱有鵬C語言高階---4.9.12--雙鏈表--刪除節點(雙鏈表的完整程式)(12)

朱有鵬C語言高階---4.9.12--雙鏈表--刪除節點(12)   刪除的過程就是一個遍歷的過程。   刪除尾節點   刪除普通節點   程式碼如下: #include <stdio.h> #inc

朱有鵬C語言高階---4.9.11--雙鏈表--遍歷節點(11)

朱有鵬C語言高階---4.9.11--雙鏈表--遍歷節點(11)   遍歷節點 (1)雙鏈表是單鏈表的一個父集。雙鏈表中如何完全無視pPrev指標,則雙鏈表就變成了單鏈表。這就決定了雙鏈表的正向遍歷(後向遍歷)和單鏈表是完全相同的。 (2)雙鏈表中因為多了pPrev指標,因

朱有鵬C語言高階---4.9.10--雙鏈表--頭插入和尾插入(10)

朱有鵬C語言高階---4.9.10--雙鏈表--頭插入和尾插入(10)   尾插入:   頭插入:   注意下面的程式碼中,insert_head()函式裡面語句的順序,第一語句和第二語句的順序可以互相調換,但是第一語句和第二語句要在

朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)

朱有鵬C語言高階---4.9.9--雙鏈表--引入和實現(9)   單鏈表的侷限性 (1)單鏈表是對陣列的一個擴充套件,解決了陣列的大小比較死板不容易擴充套件的問題。使用堆記憶體來儲存資料,將資料分散到各個節點之間,其各個節點在記憶體中可以不相連,節點之間通過指標進行單向連線。

朱有鵬C語言高階---4.9.8-單鏈表--逆序(單鏈表的完整程式)(8)

朱有鵬C語言高階---4.9.8-單鏈表--逆序(8)   什麼是連結串列的逆序? 連結串列的逆序又叫反向,意思就是把連結串列中所有的有效節點在連結串列中的順序給反過來。   單鏈表逆序演算法分析 (1)當我們對一個數據結構進行一個操作時,我們就需要一套演

C語言基礎(二)運算子

導航:   2.1 算數運算子   2.2 邏輯運算子   2.3 位運算   2.4 賦值運算   2.5 記憶體訪問符號 ----->x<------------->x&

C語言小節1:關於C語言結構體引用變數的問題

這個問題以前沒注意過,今天和同事討論後,查詢相關資料,想搞懂一個問題: 關於結構體引用變數的符號  .   和   ->   的區別。 目前得到的結論是: 變數引用   . 直針引用&n

朱有鵬C語言高階---4.9.3--單鏈表--從連結串列的頭部插入節點(3)

朱有鵬C語言高階---4.9.2--單鏈表--訪問單鏈表中各個節點的資料(1) 朱有鵬C語言高階---4.9.3--單鏈表--將建立節點的程式碼封裝成一個函式(2) 朱有鵬C語言高階---4.9.3--單鏈表--從連結串列的頭部插入節點(3)   從連結串列的尾部插入節點

朱有鵬C語言高階---4.9.3--單鏈表--將建立節點的程式碼封裝成一個函式(2)

  朱有鵬C語言高階---4.9.2--單鏈表--訪問單鏈表中各個節點的資料(1) 朱有鵬C語言高階---4.9.3--單鏈表--將建立節點的程式碼封裝成一個函式(2)     原始碼:4.9.3danlianbiao2.c #include &