指標的靈活運用使得c語言更加強大,指標是c語言中十分重要的部分,可以說指標是c語言的靈魂。當然指標不是萬能的,但沒有指標是萬萬不能的,有些操作沒有指標是辦不到的,如動態記憶體分配。鑑於學習指標的必要性,好好整理一下哈哈哈
1、指標:
我們使用的計算機記憶體為8g,系統為了更好地管理我們的記憶體,就為記憶體區的每乙個位元組都分配乙個編號(唯一),這就是位址。指標的實質就是位址,就是這乙個個編號。
2、指標變數:
變數在編譯的時候系統要為它分配乙個位址,如用另乙個變數來存放這個位址,那麼這個變數就叫指向變數的指標變數。
指標變數就是用來存放指標(位址)的變數,它的值是另乙個變數的位址。在32位平台,所有型別變數的位址都是4位元組。
3、指標變數例項:
int *p; //指向整型變數的指標變數,用來存放整型變數的位址int a[5];
int *q = a; //指向陣列第0個元素的指標變數分析:int a[5],有五個元素,分別是變數 a[0]、 a[1]、 a[2]、 a[3]、 a[4],且a代表的是第0個元素(變數a[0])的起始位址。而變數a[0]的型別是int,所以int *p =a; 是合法的。
char *string = 「hello」; //指向字串的指標變數,string 是乙個指標變數,用來存放字串的首位址,而"hello"返回字串的首位址
int (*foo)(int x, int y); //指向函式的指標變數分析:int(*foo)(int x, int y) 中加粗部分說明foo是乙個指標變數,那又是怎樣的指標變數呢?再看接下來加粗部分:int(*foo)(int x, int y); 這說明foo是乙個指向函式(該函式有兩個int型別的形參,且返回int 型別的資料)的指標變數
struct student *boy; //指向結構體的指標變數
(1)指標變數定義的格式:
型別識別符號 變數名; 如:int point;
注意:在定義intpoint;的時候 ,加粗部分的不是取值符,而是修飾point是乙個指標變數,如何確定point指向什麼型別的變數呢,需要進行下一步:看非加粗部分,int則表示point指向int型別變數或儲存int型別變數的位址。
(2)指標變數的初始化
表示該變數的型別是乙個指標變數,指標變數名是p1而不是 *p1;如果在同一行定義多個指標變數應該是:int *p1, *p2;而不是int *p1, p2或者 int p1, p2;
給指標變數初始化有兩種方式:
在定義時初始化,如int p_2 = &b;
先定義再初始化,如int * p1; p1 = &a;*p1是p1所指向的變數的值;乙個指標變數只能指向同乙個型別的變數。
(3)對於指標變數的兩個運算子「*」與「&」:
& 取位址運算子 //&a就代表a的位址(指的是a所在記憶體空間的起始位址) 指標運算子 //*p為p所指向的儲存單元的內容
(4)如果有 int buf[4] = , *p = buf;
意味著p指向buf陣列中第0個元素的起始位址
(5)利用指標引用一維陣列的元素
:如果我們用乙個指標變數指向每乙個陣列元素的位址,然後對這個指標變數作取值運算,就可以引用一維陣列。
例如:int buf[10];用陣列名引用的方式為:buf[0],buf[1], buf[2]等;
如:int array[10];int *p = array;則此時p+i和array+i都是陣列元素array[i]位址
注意:p+i與&array[i]是等價的,而*(p+i)與array[i]是等價的。
(6)引用陣列元素:
下標法:array[i]指標法:* (p+i)或 * (array+i)array為陣列的首位址是乙個常量(如0x00c7),因此不能進行array++ 或者 ++array操作。至於原因,如果把array++拆寫成簡單的形式:array = array+1;就不難看出我們是不能給乙個常量量賦值的。int array[10];int *p = array; 這裡p是變數,其值為array陣列的首位址,p既然是乙個變數,那麼可以對p進行++操作。
再來看個例子:int a = 100; int *p = &a;
經過測試:*p++、(p)++、(p++); 結果值是一樣的。至於原因,看幾個例子就明白了
例一:*p++
說明:pointer++,pointer指向buf[0],由於、++是統一優先順序且他們的結合性從右至左,即先執行pointer++,但是對於pointer++來說是先用後加,所以先取pointer所指向的位址空間的值1(buf[0]),再執行pointer++操作,即pointer指向位址後移4位元組(因為pointer為int *型,其所指向位址空間存放的是int型資料,所以後移4位元組而不是1位元組),此時pointer指向buf[1], 即pointer所指向位址空間的值為2(buf[1])。
例二:(*p)++
說明:(pointer)++,pointer指向buf[0], 由於小括號比++的優先順序高,所以先取pointer所指向位址空間的值1(buf[0]),然後將值1進行++(得到2),這裡pointer所指向的位址沒有改變,只是改變了pointer所指向位址空間的值,所以兩次列印pointer所指的位址都是010ffc40,再列印這個空間裡的值已經被賦值成2了。
例三:(p++)
說明:(pointer++),括號的優先順序比的優先順序高,所以先執行pointer++,注意pointer++先使用後++,故先取pointer所指向記憶體空間的值,此時pointer指向buf[0],取值結果為1。然後對pointer進行++,pointer指向位址變為0093f748,即此時pointer指向buf[1],為了驗證這一點(即pointer指向buf[1]),再次列印pointer所指向的位址,發現變為0093f748,最後列印*pointer結果為2(buf[1])。
C語言指標整理
記憶體是按照位元組編址的,所以它的定址單位是位元組 byte 而乙個位元組又有是由8位 bit 的0或1組成。所以這樣的話4gb記憶體的定址空間就從0x00000000到0xffffffff,總共有 明白記憶體位址後,指標實際上就是記憶體位址,指標變數則是儲存指標的變數,也即是儲存了記憶體位址。下面...
c語言指標知識整理
謹以此文送給初入程式設計坑的女票梁童鞋。目錄 基本概念 位址和指標的關係 指標操作 指標運算 指標與陣列 指標與一維陣列 指標與二維陣列 指標陣列 指標 是指向另一變數在記憶體中位置的位址。在程式中定義乙個變數,進行編譯時就會給這個變數在記憶體中分配乙個位址,通過訪問這個位址即可以找到所需變數,這個...
C語言指標整理2
例題 編寫程式把乙個陣列中的所有內容前後顛倒.比如陣列中原有內容是1 2 3 4 5 顛倒後內容是5 4 3 2 1 要求使用指標編寫程式 顛倒陣列內容 include void main num 0 int p start arr,p end arr 4 while p start p end f...