指標的運算

2021-09-30 15:50:25 字數 1568 閱讀 5093

本文內容摘自《c和指標》

指標的運算包括算術運算和關係運算。只有指向陣列元素的指標可以進行指標的運算。

指標的算術運算僅限於2種形式。

第一種形式:指標 ± 整數

標準定義這種形式只能用於指向陣列中某個元素的指標。這類表示式的結果型別也是指標。

對乙個指標加1會使它指向陣列中下乙個元素,加5使它右移5個元素的位置。對乙個指標減3使它向左移動3個元素的位置。對某一型別的指標,指標加1是指指標的值增加1個該型別的大小,而不是1個位元組。整數在執行加法運算前始終會根據陣列元素型別的大小進行調整。例如:

乙個指標減去乙個整數後,如果結果指標指向陣列第乙個元素之前,那麼它是非法的

乙個指標增加乙個整數後,如果結果指標指向陣列最後乙個元素之後,仍是合法的,但不允許對其執行間接訪問操作

第二種形式:指標 - 指標

只有當2個指標都指向同乙個陣列中的元素,才允許從乙個指標減去另乙個指標。否則結果是未定義的。

兩個指標相減的結果的型別是ptrdiff_t,是標準庫中定義的乙個與機器相關的資料型別,它是一種有符號整數型別。減法運算的值是兩個指標在記憶體中的距離,以陣列元素的長度為單位,而不是以位元組為單位,這使指標的運算結果與資料型別無關。減法運算的結果允許是負值。例如p2-p1的值為5,則p1-p2的值則為-5。

同樣的,關係運算的前提是2個指標都指向同乙個陣列中的元素。

標準允許指向陣列元素的指標與指向陣列最後乙個元素後面的記憶體位置的指標進行比較。

標準不允許指向陣列元素的指標與指向陣列第乙個元素之前的那個記憶體為止的指標進行比較。

例如,利用迴圈清除乙個陣列中的元素:

#define n_values  5

float values[n_values];

float *p;

//迴圈1

for(p = &values[0]; p < &values[n_values]; )

//迴圈2

for(p = &values[n_values]; p > &values[0]; )

//迴圈3

for(p = &values[n_values - 1]; p >= &values[0]; p--)

對於以上3個迴圈,迴圈1和迴圈2能夠完成陣列清零。迴圈3則存在問題。

迴圈1:最後一次比較,p指向values[n_value]位置,迴圈終止,並未對p執行間接訪問操作,因此是安全的。

迴圈2:最後一次比較,p指向values[0],迴圈終止。

迴圈3:最後一次比較,p指向values[0]前面的記憶體位置,此時p指標與values[0]指標做比較,結果是未定義的。

附:*p++和*(p++)是等價的,++運算子的優先順序高於*運算子。

指標的運算

指標運算 指標演算法並不依賴於指標的型別,如果p是乙個指向char的指標,那麼p 1就指向下乙個char 算術運算 指標的算數運算只限於兩種形式 指標運算只有用於陣列中其結果才是可以 的,對於任何並非指向陣列元素的指標執行算數運算其結果是非法的 1.指標 整數 結果也是指標 這種形式只能用於指向陣列...

指標的運算

指標的運算包括 1 指標的加法 2 指標的減法 char short int long long long float double 位元組數 1 2 2 4 4 8 4 8 int不加說明為4個位元組 對指標的加法而言 指標是不能加指標的 它只能加乙個數字 比如 指標 1 加乙個單元格 需要調整 ...

指標的運算

include int main int p arr p 10 p p 20 printf d,08x n arr 0 arr 1 return 0 指標 1的含義,首先思考一下指標 1可能的幾個含義 1 加整個陣列 這種含義不太符合實際,題中要的是遍歷陣列中的數。如果是加整個陣列,那就是直接跳過去...