C語言指標的運算

2021-06-26 08:39:04 字數 2120 閱讀 6755

指標的算術運算

指標可以加上或減去乙個整數。 

指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的

, 以單元為單位。 例如:

例二:char a[20];

int *ptr=(int *) a; //強制型別轉換並不會改變 a 的型別

ptr++;

在上例中, 指標 ptr 的型別是 int*,它指向的型別是 int, 它被初始化為指向整型變數 a。 接下來的第 3 句 中, 指標 ptr 被加了 1,編譯器是這樣處理的: 它把指標 ptr 的值加上了 sizeof(int) ,在 32 位程式中, 是被加上了 4, 因 為在 32 位程式中, int 佔 4 個位元組。由於位址是用 位元組做單位的,故 ptr 所指向的位址由原來的變數 a 的位址向高位址方向增加了 4 個位元組。由於 char 型別的長度是乙個位元組, 所以, 原來 ptr 是指向陣列 a 的第 0 號單元開始的四個位元組,此時指向了 陣列 a 中從第 4 號單元開始的四個位元組。我們可以用乙個指標和乙個迴圈來遍歷乙個陣列, 看例子:

例三:

int array[20]= ;

int *ptr=array;

for(i=0;i<20;i++)

這個

例子將整型陣列中各個單元的值加 1。 由於每次迴圈都將指標ptr

加1 個單元, 所以每次迴圈都能訪問陣列的下乙個單元。

再看例子:

例四:

chara[20]="you_are_a_girl";

int *ptr=(int *) a;

ptr+=5;

在這個例子中,

ptr被加上了5, 編譯器是這樣處理的: 將指標ptr的值加上 5 乘 sizeof(int) , 在 32 位程式中就是加上了 5 乘 4=20。 由於位址的單位是位元組, 故現在的 ptr 所指向的位址比起加 5 後的ptr 所指向的位址來說, 向高位址方向移動了 20 個位元組。 在這個例子中, 沒加 5 前的 ptr 指向陣列 a 的第 0 號單元開始的四個位元組, 加 5 後, ptr 已經指向了 陣列 a 的合法範圍之外了 。 雖 然這種情況在應用上會出 問題, 但在語法上卻是可以的。

這也體現出 了 指標的靈活性。

例五:

#includeintmain()

誤區一、 輸出 答案為y 和 o

誤解: ptr 是乙個 char 的二級指標,當 執行 ptr++; 時,會使指標加乙個sizeof(char),所以輸出 如上結果,這個可能只 是少部分人的結果。

誤區二、 輸出 答案為y 和 a

誤解:ptr 指向的是乙個 char *型別,當 執行 ptr++; 時,會使指標加乙個sizeof(char *)(有可能會有人認為這個值為 1,那就會得到誤區一的答案,這個值應該是 4,參考前面內 容),即&p+4;那進行一次取值運算不就指向陣列中的第五個元素了 嗎?那輸出 的結果不就是陣列中第五個元素了 嗎?答案是否定的。

正解: ptr 的型別是 char **,指向的型別是乙個 char *型別,該指向的位址就是p的位址(&p),當 執行ptr++;時,會使指標加乙個 sizeof(char*) ,即&p+4;那*(&p+4) 指向哪呢,這個你去問上帝吧,或者他會告訴你在哪?所以最後的輸出 會是乙個隨機的值,或許是乙個非法操作。

總結

乙個指標 ptrold 加(減) 乙個整數 n 後,結果是乙個新的指標 ptrnew,ptrnew 的型別和 ptrold 的型別相同 , ptrnew 所指向的型別和 ptrold所指向的型別也相同 。 ptrnew 的值將比 ptrold 的值增加(減少) 了 n 乘sizeof(ptrold 所指向的型別) 個位元組。 就是說, ptrnew 所指向的內 存區 將比 ptrold 所 指 向 的 內 存 區 向 高 (低) 位址方 向 移 動 了 n 乘sizeof(ptrold所指向的型別) 個位元組。

指標和指標進行加減

兩個指標不能進行加法運算, 這是非法操作, 

因為進行加法後, 得到的

結果指向乙個不知所向的地方, 而且毫無意義。

兩個指標可以進行減法操作, 但必須型別相同 , 一般用在陣列方面。

C語言指標 指標的運算

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

C語言指標的運算

指標的運算實質是位址的運算。c語言有一套適用於指標 陣列等位址運算的規則,正是這套規則賦予了c語言出色的處理能力。對於指標指向變數,能進行基型別資料所能進行的全部運算。1 引用運算 1 取位址運算 取位址運算 我們已非常熟悉。對指標變數進行取位址運算,可以得到指標變數本身的位址。2 取內容運算 取內...

C語言 指標的運算

一 取位址運算 與取內容運算 單目運算 是取操作物件的位址 是取指標指向的物件的內容 兩者互為逆運算 int x p p x p p 表示指標 x x 表示變數x 二 指標的算術運算 指標的運算與其基型別有關 一般的,如果p是乙個指標 n是乙個正整數 則對指標 p 進行 操作後的實際位址是 p n ...