C 漫談指標運算

2021-09-17 07:59:35 字數 1175 閱讀 7841

首先我們先提出乙個問題:指標為什麼要有自己的型別?

前不久我也問過自己同樣的問題,既然指標儲存的是乙個位址,即一串十六進製制的數字,那他完全沒必要有自己的型別,因為位址並不會有什麼和資料型別有關的差異。那為什麼還要有int型別指標,char型別指標這些呢,後來聯想到指標運算才想明白這個問題。那麼,什麼是指標運算呢?

指標作為乙個變數當然也可以進行運算,但是他的運算方式與普通運算不同,我們先來看乙個例子:

#include int main(void)

執行這段**檢視輸出結果,你會發現兩個位址的差值是4個位元組,正好是乙個int型別佔的位元組數。這兩者有什麼聯絡嗎?為什麼不是乙個位元組而四個位元組呢?是因為在指標運算中,編譯器是根據指標的型別來進行加減運算,也就是說,加減的位元組數將與指標的型別進行繫結。比如,如果我們把乙個指向char型別的指標進行加一操作,位址的變化將會是乙個位元組,這正好就是乙個char型別所佔的位元組數。

以int舉例,指標的加減運算可以理解為:指標加1,就是下乙個int型別變數的首位址;指標加2,就是下下乙個int型別變數的首位址;指標減1,就是上乙個int型別變數的首位址;指標減2,就是上上乙個int型別變數的首位址;以此類推。是不是很好理解呢?

如果理解的話我們再來看乙個例子:

#include using namespace std;

int main() ;

int* p = m;

for (int i = 0; i < 5; i++)

}

如此一來我們就可以用指標來遍歷乙個陣列,有一點要注意的是,這裡的陣列名m實際上是陣列第乙個元素的位址,即陣列的首指標,因此我們才可以將他的值賦值給指標p,完成下面的指標運算。

我們再回到文章開頭的那個問題,現在大家心裡應該有了答案了吧。指標的型別使得所有資料型別的指標運算全部統一起來,無論是什麼資料型別,指標+1都是指下乙個元素的位址,這種特性使得我們在進行指標運算的時候沒有必要再考慮這個資料型別佔幾個位元組,大大簡化了編寫**的過程,降低了錯誤率。

2023年4月9日

漫談C 過載運算子

1.前置運算子和後置運算子,左值和右值。其實很久以來一直都沒有怎麼搞清楚左值和右值的區別,只知道左值可以放在等號的左邊,也可以放在等號的右邊,但是右值卻只能放在等號的右邊,然後形成乙個大概直觀的印象,知道怎麼樣做才不出錯而已。不過今天看看c 卻發現有了點新的體會。對於表示式a 5 這樣乙個表示式,明...

漫談C 過載運算子

1.前置運算子和後置運算子,左值和右值 其實很久以來一直都沒有怎麼搞清楚左值和右值的區別,只知道左值可以放在等號的左邊,也可以放在等號的右邊,但是右值卻只能放在等號的右邊,然後形成乙個大概直觀的印象,知道怎麼樣做才不出錯而已。不過今天看看c 卻發現有了點新的體會。對於表示式a 5 這樣乙個表示式,明...

C語言 指標運算

p a 將變數位址賦值給指標 p array 將陣列位址賦值給指標 p array i 將陣列元素賦值給指標 p1 p2 將指標位址賦值給指標 include 引用函式庫 void main f0889414 f0889414 f0889414 10 10 10 p 1 和 p 意義不相同,前者沒有...