C指標 溫故

2022-03-23 15:22:47 字數 3658 閱讀 1876

概念

1 指標也是乙個變數,做為指標變數的值是另乙個變數的位址。指標存放的內容是乙個位址,該位址指向一塊記憶體空間

其一般形式為:

型別說明符  *變數名;
其中,*表示這是乙個指標變數,變數名即為定義的指標變數名,型別說明符表示本指標變數所指向的變數的資料型別。

例如:    int *p1;

表示p1是乙個指標變數,它的值是某個整型變數的位址。或者說p1指向乙個整型變數。至於p1究竟指向哪乙個整型變數,應由向p1賦予的位址來決定。

2 圖例解釋

int i = 10;//

乙個int變數,名字叫i

int *p;//

定義了乙個指向整數的指標變數

注意:

//

在以下中

int i = 10;//

乙個int變數,名字叫i

int *p;//

定義了乙個指向整數的指標變數

//p = 10;

//錯誤,不可以把乙個整數直接賦值給指標變數.

//c語言當中每個變數都有自己的記憶體位址。&符號就是取變數位址操作符.

printf("%x

",&i); //

輸出i的16進製制位址

printf("

%d",*p); //

輸出i的值

printf("

%x",&*p); //

輸出i的16進製制位址

printf("

%x",&p); //

輸出p的位址,注意,指標也有自己的記憶體位址

printf("

%x",p); //

輸出i的16進製制位址

切記,指標變數只能存放位址,不能將乙個int型變數直接賦值給乙個指標。

3 指標變數的引用

指標變數同普通變數一樣,使用之前不僅要定義說明,而且必須賦予具體的值。未經賦值的指標變數不能使用,否則將造成系統混亂,甚至宕機。指標變數的賦值只能賦予位址, 決不能賦予任何其它資料,否則將引起錯誤。在c語言中,變數的位址是由編譯系統分配的,對使用者完全透明,使用者不知道變數的具體位址。

兩個有關的運算子:

1)   &:取位址運算子。

2)   *:指標運算子(或稱「間接訪問」 運算子)。

c語言中提供了位址運算子&來表示變數的位址。

其一般形式為:

&變數名;

如&a表示變數a的位址,&b表示變數b的位址。變數本身必須預先說明。

(1) 指標變數初始化的方法

int a;

int *p=&a;

(2) 賦值語句的方法

int a;

int *p;

p=&a;

不允許把乙個數賦予指標變數,故下面的賦值是錯誤的:

int *p;

p=1000;

4 野指標

定義了乙個指向int的指標變數;沒有賦初值,就是個野指標,指向什麼記憶體位址不知道

int *p3;
* 野指標的危害只是程式本身,不會影響到作業系統。

* 如果你做的是乙個驅動程式或者核心**,那麼可能是致命的,作業系統崩潰

* 野指標也叫懸空指標,不能給野指標指向的記憶體區域賦值。

注意:乙個指向null的指標,我們稱之為空指標(也就是說野指標),意味著這個指標不指向任何乙個變數。

5 無型別指標

定義乙個指標變數,但不指定它指向具體哪種資料型別。可以通過強制轉化將void *轉化為其他型別指標,也可以用(void *)將其他型別指標強制轉化為void型別指標。

void *p
在c語言當中,可以將任何一種位址賦值給void *指標

例如:

void *p4;//

定義了乙個無型別的指標。

p4 = &i;//

可以將任意型別的位址賦值給void *

//p1 = p4;

//(在c語言中可以將void *賦給任意型別的指標變數).但c++這個語句是非法的

6  指標變數作為函式引數函式的引數不僅可以是整型、實型、字元型等資料,還可以是指標型別。它的作用是將乙個變數的位址傳送到另乙個函式中。

例:輸入的兩個整數按大小順序輸出

swap(int *p1,int *p2)

main()

說明:swap是使用者定義的函式,它的作用是交換兩個變數(a和b)的值。swap函式的形參p1、p2是指標變數。程式執行時,先執行main函式,輸入a和b的值。然後將a和b的位址分別賦給指標變數pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。

7  陣列指標

乙個變數有位址,乙個陣列包含若干個元素,每個元素在記憶體中都有位址。

int a[10

];int *p =a;

p和&a[0]的位址是否相同?

相同

在c語言當中陣列的名稱代表陣列的首位址,如果取陣列名稱的位址,c語言認為就是取陣列的首位址。

int array[10] = ;//

array[0]的值是6

int *p = &array[0];//

p指向了陣列的第乙個元素的位址

int *p1 = array;//

p1指向了陣列的首位址.

//*p和*p1是一樣的。

8  通過指標引用陣列元素如果指標變數p已指向陣列中的乙個元素,則p+1指向同一陣列中的下乙個元素。

如果p的初值為&a[0],則:

1)   p+i和a+i就是a[i]的位址,或者說它們指向a陣列的第i個元素。

2)   *(p+i)或*(a+i)就是p+i或a+i所指向的陣列元素,即a[i]。例如,*(p+5)或*(a+5)就是a[5]。

3)   指向陣列的指標變數也可以帶下標,如p[i]與*(p+i)等價。

根據以上敘述,引用乙個陣列元素可以用:

1)   下標法,即用a[i]形式訪問陣列元素。在前面介紹陣列時都是採用這種方法。

2)   指標法,即採用*(a+i)或*(p+i)形式,用間接訪問的方法來訪問陣列元素,其中a是陣列名,p是指向陣列的指標變數,其處值p=a。

例:輸出陣列中的全部元素。(下標法)

main()
輸出陣列中的全部元素。(通過陣列名計算元素的位址,找出元素的值)

main()
輸出陣列中的全部元素。(用指標變數指向元素)

main()

main()

}

注意:1)   指標變數可以實現本身的值的改變。如p++是合法的;而a++是錯誤的。因為a是陣列名,它是陣列的首位址,是常量。

【感謝譚浩強老師的《c語言》】

c 語言溫故

1 編譯指令 cc c 檔名 批量編譯 cc c 檔名1 檔名2 cc 檔名.o 生成.out執行檔案 3 將.out檔案用終端開啟 c語言常見檔案的副檔名 1 c是c語言原始檔,在編寫 的時候建立 2 o是目標檔案,在編譯成功的時候產生 總結clang指令 1 編譯 cc c c 檢查語法是否正確...

C 溫故知新 之 指標 函式指標變數 指標型函式

猛一看還真有點糊糊 注意區別 1 函式型指標 指函式返回 值的型別。指標型函式 返回值是乙個 指標 即位址 2 int p 和int p 是一樣嗎?為什麼?int p 是乙個變數說明,說明 p 是乙個指向函式入口的指標變數,該函式的返回值是整型量,p 的兩邊的括號不能少。函式型指標 int p 則不...

C 溫故知新 之 指標 函式指標變數 指標型函式

猛一看還真有點糊糊 注意區別 1 函式型指標 指函式返回 值的型別。指標型函式 返回值是乙個 指標 即位址 2 int p 和int p 是一樣嗎?為什麼?int p 是乙個變數說明,說明 p 是乙個指向函式入口的指標變數,該函式的返回值是整型量,p 的兩邊的括號不能少。函式型指標 int p 則不...