C指標總結 20150920

2021-09-30 12:31:26 字數 3153 閱讀 1777

指標其實是記憶體單元位址在高階語言中的另一種叫法,位址也是資料,存放這種資料的變數就是指標變數,簡稱指標。變數的位址稱為變數的指標,指變數存放空間的首位址。

如果指標變數p的值恰好是變數a的位址,就說指標變數p指向了變數a。c語言規定乙個指標變數只能指向同種型別的變數,比如

int *p1;     //定義指標變數p1,只能指向整型變數

char *p2; //定義指標變數p2,只能指向字元型變數

指標變數的定義格式型別名 *變數名1, *變數名2, ...;其實比較好理解,只需注意區分指標變數的型別和指標所指向變數的型別。指標變數的型別明確指出它能存放什麼型別變數的位址,而不是它能存放什麼型別的資料(指標只能存放位址),例如

int *p1, *p2;   //定義了兩個指向整型資料的指標p1,p2
其中,指標變數p1、p2的型別都是int *,而不是int。所以初學者需要特別注意下面幾條語句的使用

int* p1, p2;    //錯誤,雖然指向整型的指標變數型別是int*,但不能這樣使用,可以理解為*自動與變數名匹配而不是與型別名匹配

int *p1, *p2, a; //正確,定義了指向整型的指標變數p1、p2和整型變數a

陣列是若干個相同型別變數的集合,在記憶體中占用一片連續的位址空間。按照指標的概念,陣列在記憶體中的起始位址就是陣列的指標,而陣列元素的位址稱為陣列元素的指標。c語言規定,陣列名就是陣列的指標,代表陣列在記憶體空間的首位址,同時也指向陣列的第乙個元素。

(note:陣列名,即陣列的指標,是位址常量,不能更改)

int *p, data[10];

p = data; //指標變數p指向整型陣列data[10]

printf("%d", *p); //輸出data[0]的值

printf("%d", *(p+2)); //輸出data[2]的值

可以看到指標和整數執行算術運算後得到乙個新的指標,那麼它指向**呢?如果對字元指標加1,運算結果產生的指標指向記憶體中下乙個字元。如果對整型指標加1,運算結果產生的指標指向記憶體中下乙個整數,即移動4個位元組而不是1個位元組。也就是說,當指標和整數執行算術運算後,整數在運算時始終根據「合適的大小」(指標所指向變數的型別在記憶體中占用的位元組數)進行調整,這個調整便是把整數值和「合適的大小」相乘。在上例中p+2相當於指標後移了8個位元組(整型變數在記憶體中佔4個位元組)

(note:c不會檢查陣列的下標溢位,所以針對陣列使用下標引用或者間接訪問操作一定要特別小心)

c使用字元陣列存放字串,和指向整型陣列的指標一樣可以使用字元指標指向字串常量,這時指標代表字元陣列(字串)在記憶體中的起始位址。

等價於`str = temp;`

當直接使用字元指標指向字串常量時,實際上系統隱含定義了乙個無名字元陣列來存放字串,字元指標指向了這個無名陣列,而不是字元指標存放了字串。

指標變數作為函式引數時,同樣是從實參單向傳遞指標變數的值給形參,也即形參得到實參值的乙份copy,但由於實參變數是指標,它的值是某個變數的記憶體位址,所以形參的值也是這個變數的記憶體位址。需要特別注意的是,這時實參和形參作為變數在記憶體中占用不同的記憶體單元,但是具有相同的值,即指向相同的記憶體單元,使用間接訪問操作符*可以得到相同的值。

(1)使用間接訪問操作改變形參所指向變數的值,則實參所指向變數的值也發生變化

(2)改變形參的值並不會改變實參的值以及實參所指向變數的值

見下例

#include //交換兩個形參變數的值,並不會改變實參的值和實參所指向變數的值

void swap(int *a, int *b)

int main()

輸入

3 8
程式輸出

main_1: a=3, b=8

swap: a=8, b=3

main_1: a=3, b=8

可以見到,雖然使用指標變數作為函式引數,但在被調函式內交換的是兩個指標變數,而不是指標所指向的變數,因此實參所指向變數的值並未發生改變。

#include //交換兩個形參所指向變數的值,實參所指向變數的值也發生改變

void swap(int *a, int *b)

int main()

輸入

3 8
程式輸出

main_1: a=3, b=8

swap: a=8, b=3

main_1: a=8, b=3

這次使用指標變數作為函式引數,且在被調函式內交換指標所指向的變數,因此實參所指向變數的值發生改變。

把相同型別的指標變數存放在乙個陣列中,便構成了指標陣列。一般字元指標陣列用的比較多,多用於存放不等長的字串。如下

char *log[10];      //定義字元指標陣列,存放日誌資訊
陣列log[10]的元素型別是char *,即字元指標,可以指向不等長的字串。比如

char *log[10] = ;
函式在編譯後執行時,會被分配一塊記憶體區域,這個記憶體區的起始位址便是函式的入口位址,也即函式的指標。指向函式的指標的定義如下,

返回值型別 (*指標變數名)(引數型別列表);

double (*p)(float, float); //定義了乙個函式指標p,指向的函式有兩個float型引數且返回double型資料

為方便理解,可以這樣想: (實際編譯是通不過的,存在語法錯誤)

double(float,float) *p; //定義乙個double(float,float) *型的指標p(僅限於理解,實際存在語法錯誤)
(note:(*p)中的括號是必需的,因為*的優先順序低於函式定義的(),和下面要介紹的返回指標的函式有區別)

函式同樣可以返回指標型別,定義如下

型別名 *函式名(引數列表)

比如

int *fun(int a, int b); //定義乙個返回int *型資料的函式fun(int,int)

C 指標總結

指標定義和基本操作 指標是記憶體的乙個位址。定義格式,型別名 指標變數名 其中指標變數名指的是記憶體位址,加 是表示指向這一記憶體位址所儲存的內容,如果要取位址的話就要用 來處理,比如 指標變數名 或 指標變數名,如果指標暫時不用的時候,可以賦給乙個空指標 null。統配指標型別void void ...

C 指標 總結

對指標的一些總結 計算機記憶體中的每個位置都由乙個位址標識。通常,鄰近的記憶體位置合成一組,這樣就允許儲存更大範圍的值。指標就是他的值表示記憶體位址的變數。無論是程式設計師還是計算機都無法通過值的位模式來判斷它的型別。型別是通過值的使用方法隱式地確定的。編譯器能夠保證值的宣告和值的使用之間的關係是適...

C 指標總結

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!指標是一變數或函式的記憶體位址,是乙個無符號整數,它是以系統定址範圍為取值範圍,32位,4位元組。存放位址的變數。在c 中,指標變數只有有了明確的指向才有意義。int ptr 指向int型別的指標變數 char ptr float ptr char...