當前位置:才華齋>計算機>C語言>

C語言中的指標指什麼

C語言 閱讀(2.72W)

指標是一個變數,該變數的數值是地址,或者說,指標是一個數據物件。C語言中的指標指什麼?下面是小編為大家整理的C語言中的指標指什麼的相關資料,歡迎參考~

C語言中的指標指什麼

  指標概念

指標是一個變數,該變數的數值是地址,或者說,指標是一個數據物件。

類似於,int 型別變數的數值是整數。

  與指標相關的運算子

間接運算子:*

ptr 指向 bath,ptr = &bath。

獲取 bath 中存放的數值,val = * ptr。

上面兩句語句等價於 val = bath。

地址運算子:&

後跟一個變數名時,& 給出該變數的地址。

  指標宣告

int * pi;

int 表明被指向的變數的型別是整型,* 表示該變數是一個指標。pi 所指向的值(*pi)是 int 型別,pi 的

型別是“指向 int 的指標”。

* 和指標名之間的空格是可選的。

指標的輸出格式是 %p。

使用指標在函式間通訊

結合PHP中函式的引用賦值來理解。

變數的值在函式中改變還是全域性改變。

  指標和陣列

概念

在 C 中,對一個指標加 1 的結果是對該指標增加 1 個儲存單元(storage unit)。對陣列而言,地址會增加到下一個元素的地址,而

不是下一個位元組。歸納如下:

指標的數值就是它所指向的物件的地址。對於包含多個位元組的資料型別,物件的地址通常是指其首位元組的地址。

在指標前運用運算子 * 可以得到該指標所指向的物件的數值。

對指標加1,等價於對指標的值加上它所指向的物件的位元組大小。

  函式、陣列和指標

宣告陣列參量

下面的四種原型都是等價的

int sum(int *ar, int n);int sum(int *, int);int sum(int ar[], int n);int sum(int [], int);

定義函式時,下面兩種形式等價

int sum(int * ar, int n){

}int sum(int ar[], int n){

}

宣告形式參量時,int *ar 和 int ar[] 都表示 ar 是指向 int 的指標。

sizeof 求變數、指標、陣列大小。

  使用指標引數

使用陣列形參的.函式需要知道陣列的起點和終點。告知終點有兩種方法,一種是直接使用整數參量指明陣列元素的個數,一種是用指標

指明陣列的結束地址。比如,

int sum(int * start, int * end);

若陣列的元素個數是 SIZE,那麼,* end 的值是 &start + SIZE(表示陣列的最後一個元素後面的下一個元素)。

一元運算子 * 和 ++ 具有相等的優先級別,但它在結合時是從右向左進行的。

  指標操作

 指標基本操作

賦值(assignment)。

通常使用陣列名或地址運算子&進行地址賦值。地址應該和指標型別相容。

求職(value-finding)或取值(dereferencing)。

  取指標地址。

將一個整數加給指標。

增加指標的值。

從指標中減去一個整數。

減小指標的值。

求差值(Differencing)。指向同一個陣列內兩個元素的指標使用此運算。

比較。兩個指標具有相同的型別。

對未初始化的指標取值

不能對未初始化的指標取值。例如

int * pt; // 未初始化的指標*pt = 5;

合法的程式碼

int i = 5;int * pt = &i;

或者

double * ptd;

ptd = (double)malloc(30 * sizeof(double));

指標和多維陣列

例程

#include int main(void){ int zippo[4][2] = {{2, 4}, {6, 8}, {1, 3}, {5, 7}}; printf(" zippo = %p, zippo + 1 = %p",

zippo, zippo + 1); printf("zippo[0] = %p, zippo[0] + 1 = %p",

zippo[0], zippo[0] + 1); printf(" *zippo = %p, *zippo + 1 = %p",

*zippo, *zippo + 1); printf("zippo[0][0] = %d", zippo[0][0]); printf(" *zippo[0] = %d", *zippo[0]); printf(" **zippo = %d", **zippo); printf(" zippo[2][1] = %d", zippo[2][1]); printf("*(*(zippo+2) + 1) = %d", *(*(zippo+2) + 1)); return 0;

}

程式碼見 E:codecc_primer_plus_c10_15_zippo1.c。

這段程式碼中的疑點:*zippo[0]、**zippo。

宣告指向二維陣列的指標變數

正確的程式碼

int (* pz)[2]; // 宣告一個指向二維陣列pz[n][2]的指標

錯誤的程式碼

int * pax[2]; // 建立一個兩個指標的陣列

指標相容

int n = 5;double x;int * pi = &n;double * pd = &x;

x = n; // 隱藏的型別轉換pd = pi; // 編譯時錯誤

假如有如下宣告:

int * pt;

int (*pa)[3];

int ar1[2][3];

int ar2[3][2];

int **p2; // 指向指標的指標

那麼,有如下結論:

pt = &ar1[0][0]; // 都指向intpt = ar1[0]; // 都指向int pt = ar1; // 非法pa = ar1; // 都指向int[3]pa = ar2; // 非法p2 = &pt; // 都指向 int **p2 = ar2[0]; // 都指向int。不理解p2 = ar2; // 非法。不理解

保護陣列內容

對形參使用 const

如果不打算在函式中修改陣列,在函式原型和函式定義中對引數使用 const 可以達到目的。例程如下:

int sum(const int ar[], int n);int sum(const int ar[], int n){ int i; int total = 0; for(i = 0; i < n; i++)

total += ar[i]; return total;

}

使用了 const,在函式中試圖修改使用了 const 的引數時,編譯時會發現此錯誤。

有關 const 的其他內容

使用 const 建立符號常量。

const double PI = 3.14159;

指向常量的指標不能用於修改數值,但可以指向其他地址。

double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};const double * pd = rates; // pd指向陣列開始處* pd = 29.89; // 不允許pd[2] = 222.22; // 不允許 rates[0] = 99.99; // 允許,因為 rates 不是常量pd++; // 讓pd指向rates[1],允許

將常量或非常量資料的地址賦給指向常量的指標是合法的。

double rates[5] = {88.99, 100.2, 59.45, 183.11, 340.5};const double locked[4] = {0.08, 0.075, 0.0725, 0.07};const double * pc = rates; // 合法 pc = locked; // 合法 pc = &rates[3]; // 合法

只有非常量資料的地址才可以賦給普通的指標。

double rates[5] = {88.99, 100.2, 59.45, 183.11, 340.5};const double locked[4] = {0.08, 0.075, 0.0725, 0.07};double * pnc = rates; // 合法 pnc = locked; // 非法 pnc = &rates[3]; // 合法

使用 const 保證指標不會指向別處。

double rates[5] = {88.99, 100.2, 59.45, 183.11, 340.5};double * const pc = rates; // 指標指向陣列的開始處pc = &rates[2]; // 不允許 *pc = 92.99; // 可以

使用 const 禁止修改所指向的資料。

double rates[5] = {88.99, 100.2, 59.45, 183.11, 340.5};const double * const pc = rates; // 指標指向陣列的開始處pc = &rates[2]; // 不允許 *pc = 92.99; // 不允許