指標 陣列指標 指標陣列 指向指標的指標

2021-07-16 00:27:33 字數 2468 閱讀 6239

程式中一般通過變數名對變數進行訪問操作,其實質是通過位址進行的。對變數的訪問分為直接訪問和間接訪問,如語句「printf(「%d」,i);」,執行的時候,根據變數名 與位址的對應關係,找到i的位址,依次取相應的位元組數中的資料(即i的值),把它輸出。這種按照變數位址訪問變數值的方式成為直接訪問;還可以將變數i的位址存放在另乙個變數中,假設該變數為i_pointer(在32位windows作業系統下,無論指向什麼型別的指標都只有4個位元組),通過語句i_pointer=&i;將i的其實位址存放到i_pointer中,若要取變數,先找到存放i的位址的變數i_pointer,從中取出i的位址,然後從該位址開始的4個位元組中取出i的值,這就是間接訪問。乙個變數的位址成為該變數的指標。用來存放變數位址的變數是指標變數。

指標變數可以做函式引數,我們知道,函式傳參方式是「單向值傳遞」,即在被呼叫的函式中改變形參的值是無法改變呼叫處實參的值,因為形參是存放在棧中的,呼叫結束後,記憶體被釋放,該資料的值也就不存在了。但是利用指標變數做函式引數,在函式執行的過程中使指標變數所指向的變數的值發生變化,函式呼叫結束後,這些變數值的變化依然保留下來,這樣就實現了*」通過呼叫函式使變數的值發生變化,在主調函式中使用這些改變了的值「的目的。這種方式也遵循單向的」值傳遞「,即呼叫函式是不會改變指標變數的值,但是可以改變實參指標變數所指向變數的值。

陣列指標的實質還是指標,我們可以將其解釋為指向由m個元素組成的一維陣列的指標變數。我們先來了解二維陣列名代表的含義,定義乙個二維陣列int a[3][4]=;,我們知道,陣列名代表陣列首元素的位址,現在的首元素不是乙個整型變數,而是由4個整型元素組成的一維陣列,因此a代表的是首行的起始位址,即&a[0],a+1代表a[1]行的首位址,即&a[1]。假設a的首行起始位址為2000,則a+1所代表的位址為2000+4*4=2016。a[0],a[1],a[2]既然是一維陣列名,而陣列名又代表陣列首元素位址,因此a[0]代表陣列a[0]中0列元素的位址,即&a[0][0], a[1]的值是&a[1][0]。言歸正傳,現在我們想將陣列名a賦值給乙個指標變數,用語句 int *p=a;肯定是不行的,因為p指向乙個整型資料,而a指向的是首行的4個資料,因此,我們定義語句int (*q)[4];其中p就是乙個指標變數,它指向包含4個整型元素的以為陣列。我們稱q為陣列指標。

和陣列指標一樣,指標陣列的實質是陣列。如果乙個陣列,其元素均為指標型別資料,該陣列稱為指標陣列。語句int p[4];中,[ ]比優先順序高,因此p先和[ ]結合,顯然p是乙個陣列名,有4個元素。再與p前面的結合,代表此陣列是指標型別的,每個陣列元素(相當於乙個指標變數)都可指向乙個整形變數。如 char name=;name是乙個指標陣列,他有3個元素,其初值分別是」abc」,」def」,」ghi」的起始位址。

下面我們來看一段運用指標陣列的**。

//對字串從小到大排序

#include

#include

#include

void sort_str(char *name, int n)

}}int main()

所以,p就是指向指標型資料的指標變數,即指向指標的指標。定義乙個指向指標型資料的指標變數格式為:型別 ()p;如char ()p; 。運算子的結合性是從右至左的,因此可以改寫為 char * * p;。

下面我們來看一段運用指標陣列的**。

#include 

#include

int main()

//結果是china c

再來看下面這段**,使我們對以上四個定義進一步了解:

#include 

#include

int main()

; //int *parr[10];//指標陣列,parr是陣列名,存放10和整型資料的位址

//char** parr[10];//parr陣列的大小10, 每個元素是char**型別的,即指向指標資料的指標

//char ** (*ptr)[10];//ptr是指標,指向包含10個char **型元素的一維陣列

int(*ptr)[10];//陣列指標,ptr是指標,指向包含10個整型元素的一維陣列

ptr = &arr;

/*for (int i = 0; i < 10; i++)

system("pause");

return

0;}

這段**中只有定義ptr為int(ptr)[10];,即陣列指標的形式, ptr = &arr;才能編譯過去,因為&arr是取整個陣列賦值給prt,所以接收它的prt也必須是指向10個整型元素的指標;注意這個語句,for (int i = 0; i < 10; i++) ,printf(「%d 「, (int )ptr[i]);我將其注釋掉,也就是不能企圖通過這種方式將陣列的10個元素輸出,應為prt+1,1代表的是偏移量,此處偏移量為整個陣列的長度,即10,所以,當i=0的時候輸出1,i=1的時候輸出的是陣列最後乙個元素的下一段記憶體位址。

指標陣列和指向指標的指標

今天終於弄明白了,指標陣列,和指向指標的指標的區別。1 include 2 include 3 void main 4 11 for i 0 i 3 i 12 15 一 指標概念 當我們程式如下申明變數 short int i char a short int pi 程式會在記憶體某位址空間上為各變...

指標陣列以及指向指標的指標

include include define maxlines 5000 進行排序的最大文字行 char lineptr maxlines 指向文字行的指標陣列 int readlines char lineptr,int nlines void writelines char lineptr,in...

指標陣列與指向陣列的指標

指標陣列 定義 int p n 優先順序高,先與p結合成為乙個陣列,再由int 說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p 1時,則p指向下乙個陣列元素,這樣賦值是錯誤的 p a 因為p是個不可知的表示,只存在p 0 p 1 p 2 p n 1 而且它們分別是指標變數可以用來存...