C語言指標關鍵知識點總結

2021-10-03 08:04:37 字數 3490 閱讀 2955

三、指標對比

四、空指標null與nul以及void指標

在我們目前所學到的語法中,星號主要有三種用途:

如果乙個指標指向了陣列,我們就稱它為陣列指標(array pointer)

重點:陣列名是常量,它的值不能改變,而陣列指標是變數(除非特別指明它是常量),它的值可以任意改變。也就是說,陣列名只能指向陣列的開頭,而陣列指標可以先指向陣列開頭,再指向其他元素。

表示方法

char str = "";

char *pstr = str;

第二種方法是直接使用乙個指標指向字串(也稱字串常量):

char *str = "";
兩種表示方法的區別:

它們最根本的區別是在記憶體中的儲存區域不一樣,字元陣列儲存在全域性資料區或棧區,第二種形式的字串儲存在常量區。全域性資料區和棧區的字串(也包括其他資料)有讀取和寫入的許可權,而常量區的字串(也包括其他資料)只有讀取許可權,沒有寫入許可權。

例項:

void swap(int *p1, int *p2)
例項:

char *strlong(char *str1, char *str2)else

}

注意:用指標作為函式返回值時需要注意的一點是,函式執行結束後會銷毀在它內部定義的所有區域性資料,包括區域性變數、區域性陣列和形式引數,函式返回的指標請盡量不要指向這些資料,c語言沒有任何機制來保證這些資料會一直有效,它們在後續使用過程中可能會引發執行時錯誤。

定義:如果乙個陣列中的所有元素儲存的都是指標,那麼我們就稱它為指標陣列。

定義形式:

datatype *arrayname[length];
[ ]的優先順序高於*,該定義形式應該理解為:

datatype *(arrayname[length]);
定義例項:

int a[3][4] = , ,  };

int (*p)[4] = a;

括號中的*表明 p 是乙個指標,它指向乙個陣列,陣列的型別為int [4],這正是 a 所包含的每個一維陣列的型別。

使用指標p訪問二維陣列中的每個元素

p指向陣列 a 的開頭,也即第 0 行;p+1前進一行,指向第 1 行。

#include

int main(), , };

int (p)[4] = a;

printf("%d\n", sizeof((p+1)));

return 0;
執行結果:

16*(p+1)+1表示第 1 行第 1 個元素的位址。

((p+1)+1)表示第 1 行第 1 個元素的值。很明顯,增加乙個 * 表示取位址上的資料。

指標陣列和二維陣列指標的區別

指標陣列和二維陣列指標在定義時非常相似,只是括號的位置不同:

int *(p1[5]);  //指標陣列,可以去掉括號直接寫作 int *p1[5];

int (*p2)[5]; //二維陣列指標,不能去掉括號

定義:乙個函式總是占用一段連續的記憶體區域,函式名在表示式中有時也會被轉換為該函式所在記憶體區域的首位址,這和陣列名非常類似。我們可以把函式的這個首位址(或稱入口位址)賦予乙個指標變數,使指標變數指向函式所在的記憶體區域,然後通過指標變數就可以找到並呼叫該函式。這種指標就是函式指標。

函式指標的定義形式為:

returntype (*pointername)(param list);
returntype 為函式返回值型別,pointernmae 為指標名稱,param list 為函式引數列表。引數列表中可以同時給出引數的型別和名稱,也可以只給出引數的型別,省略引數的名稱,這一點和函式原型非常類似。

例項:

#include //返回兩個數中較大的乙個

int max(int a, int b)

int main()

辨析:僅乙個括號之差

int *p1[6];  //指標陣列

int *(p2[6]); //指標陣列,和上面的形式等價

int (*p3)[6]; //二維陣列指標

int (*p4)(int, int); //函式指標

常見指標變數的定義

定 義含 義int *p;

p 可以指向 int 型別的資料,也可以指向類似 int arr[n] 的陣列。

int **p;

p 為二級指標,指向 int * 型別的資料。

int *p[n];

p 為指標陣列。[ ] 的優先順序高於 *,所以應該理解為 int *(p[n]);

int (*p)[n];

p 為二維陣列指標。

int *p();

p 是乙個函式,它的返回值型別為 int *。

int (*p)();

p 是乙個函式指標,指向原型為 int func() 的函式。

1、null空指標

null 是「零值、等於零」的意思,在c語言中表示空指標。從表面上理解,空指標是不指向任何資料的指標,是無效指標,程式使用它不會產生效果。

null 是在stdio.h中定義的乙個巨集,它的具體內容為:

#define null ((void *)0)
(void *)0表示把數值 0 強制轉換為void *型別,最外層的( )把巨集定義的內容括起來,防止發生歧義。從整體上來看,null 指向了位址為 0 的記憶體,而不是前面說的不指向任何資料。

在程序的虛擬位址空間中,最低位址處有一段記憶體區域被稱為保留區,這個區域不儲存有效資料,也不能被使用者程式訪問,將 null 指向這塊區域很容易檢測到違規指標。

2、nul

nul 表示字串的結束標誌 『\0』,它是ascii碼表中的第 0 個字元。nul 沒有在c語言中定義,僅僅是對 『\0』 的稱呼,不能在**中直接使用。

3、void 指標

void 用在函式定義中可以表示函式沒有返回值或者沒有形式引數,void * 表示指標指向的資料的型別是未知的。

void *表示乙個有效指標,它確實指向實實在在的資料,只是資料的型別尚未確定,在後續使用過程中一般要進行強制型別轉換。

c語言動態記憶體分配函式 malloc() 的返回值就是void *型別,在使用時要進行強制型別轉換,請看下面的例子:

#include int main()
執行結果:

c.biancheng.net↙

c.biancheng.net

C語言 C 指標知識點總結詳解

如果把某一塊已經開闢的記憶體空間比作房間,那麼指標就是一把鑰匙。房間有大有小,而鑰匙就那麼大,所以指標所占用的位元組為4位元組。這把鑰匙可以根據你的設定來讓它開哪個房間,但是,最多只能開乙個房間。1 定義 我們平常見到的定義指標有兩種寫法 int p和int p,其實這兩種寫法效果是一樣的,但是為了...

C語言 總結陣列指標相關知識點

1 陣列在記憶體中是連續存放的。2 記憶體中的乙個記憶體單元對應乙個位址。3 在32位平台上指標是4個位元組,64位平台8個位元組。4 陣列的陣列名其實是陣列首元素的位址。1 sizeof 陣列名 這裡陣列名表示整個陣列。2 陣列名,這裡陣列名表示整個陣列。例子 32位 includeint mai...

C語言知識點總結

有段事件沒有寫c程式了,有些地方有些生疏了。這兩天事情比較少,準備再系統的看一邊c的基礎知識。這裡再總結一下平時沒太注意的知識要點。1 c語言的語句塊在c語言中,任何允許出現語句的地方既可以是由 號結尾的一條語句,也可以是由 括起來的若干條語句或宣告組成的語句塊 statement block 語句...