C語言指標變數的運算

2021-07-24 19:56:37 字數 1946 閱讀 3714

指標變數儲存的是位址,本質上是乙個整數,可以進行部分運算,例如加法、減法、比較等,請看下面的**:

複製

格式化複製

#include

intmain

()else

return0;

}

#include int main()else

return 0;

}

執行結果:

&a=0x28ff44, &b=0x28ff30, &c=0x28ff2b

pa=0x28ff44, pb=0x28ff30, pc=0x28ff2b

pa=0x28ff48, pb=0x28ff38, pc=0x28ff2c

pa=0x28ff40, pb=0x28ff28, pc=0x28ff2a

2686784

從運算結果可以看出:pa、pb、pc 每次加 1,它們的位址分別增加 4、8、1,正好是 int、double、char 型別的長度;減 2 時,位址分別減少 8、16、2,正好是 int、double、char 型別長度的 2 倍。

這很奇怪,指標變數加減運算的結果跟資料型別的長度有關,而不是簡單地加 1 或減 1,這是為什麼呢?

以 a 和 pa 為例,a 的型別為 int,占用 4 個位元組,pa 是指向 a 的指標,如下圖所示:

剛開始的時候,pa 指向 a 的開頭,通過 *pa 讀取資料時,從 pa 指向的位置向後移動 4 個位元組,把這 4 個位元組的內容作為要獲取的資料,這 4 個位元組也正好是變數 a 占用的記憶體。 如果

這個時候 pa 指向整數 a 的中間,*pa 使用的是

紅色虛線畫出的 4 個位元組,其中前 3 個是變數 a 的,後面 1 個是其它資料的,把它們「攪和」在一起顯然沒有實際的意義,取得的資料也會非常怪異。 如果

我們知道,陣列中的所有元素在記憶體中是連續排列的,如果乙個指標指向了陣列中的某個元素,那麼加 1 就表示指向下乙個元素,減 1 就表示指向上乙個元素,這樣指標的加減運算就具有了現實的意義,我們將在《

c語言和陣列》一節中深入**。

不過c語言並沒有規定變數的儲存方式,如果連續定義多個變數,它們有可能是挨著的,也有可能是分散的,這取決於變數的型別、編譯器的實現以及具體的編譯模式,所以對於指向普通變數的指標,我們往往不進行加減運算,雖然編譯器並不會報錯,但這樣做沒有意義,因為不知道它後面指向的是什麼資料。

複製

格式化複製

#include

intmain

()return0;

}

#include int main()

return 0;

}

在 vs2010 debug 模式下的執行結果為:

3, -858993460, -858993460, 2, -858993460, -858993460, 1, -858993460,

可以發現,變數 a、b、c 並不挨著,它們中間還參雜了別的輔助資料。

指標變數除了可以參與加減運算,還可以參與比較運算。當對指標變數進行比較運算時,比較的是指標變數本身的值,也就是資料的位址。如果位址相等,那麼兩個指標就指向同乙份資料,否則就指向不同的資料。

上面的**(第乙個例子)在比較 pa 和 paa 的值時,pa 已經指向了 a 的上乙份資料,所以它們不相等。而 a 的上乙份資料又不知道是什麼,所以會導致 printf() 輸出乙個沒有意義的數,這正好印證了上面的觀點,不要對指向普通變數的指標進行加減運算。

另外需要說明的是,不能對指標變數進行乘法、除法、取餘等其他運算,除了會發生語法錯誤,也沒有實際的含義。

C語言 指標變數運算操作

指標變數除了的8種基本操作,還可以使用關係運算子來比較指標。1 賦值 注意,位址應該和指標型別相容。也就是說,不能把double型別的位址賦給指向int的指標,至少要避免不明智的型別轉換。c99 c11已經強制不允許這樣做。int a 6 int b 0 int p1 a int p2 賦值 p2 ...

C語言 指標變數和整數的運算

在c 語言中,指標也能進行自加 自減運算以及與整數做加減運即讓指標變數加 減1或者加上乙個整數 減乙個整數都是合法的運算。指標運算與整數的運算並不相同,指標變數運算的時候,表示了資料的移動。float x pf x 假設變數x 的位址為4 0 0 0 h pf 5所表示的位址值為4000h 5 4 ...

C語言指標 指標的運算

include int main void 執行這段 會出現錯誤嗎?如果出現錯誤,是什麼錯誤?分析 printf一種常規的用法就是printf please input a data 這種用法相信很多人都使用過,但是將這種用法分析一下,這樣的用法printf函式接收到的引數是乙個常量字串的首位址,然...