深入理解 C 指標 二 指標的算術運算

2021-06-16 07:11:14 字數 1386 閱讀 7761

指標的算術運算

指標可以加上或減去乙個整數。指標的這種運算的意義和通常的數值的加減運算的意義是不一樣的。例如:

例二:1.char a[20];

2.int *ptr=a;

3.ptr++;

在上例中,指標ptr的型別是int*,它指向的型別是int,它被初始化為指向整形變數a。接下來的第3句中,指標ptr被加了1,編譯器是這樣處理的:它把指標ptr的值加上了sizeof(int),在32位程式中,是被加上了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,所以每次迴圈都能訪問陣列的下乙個單元。再看例子:

例四:1.char a[20];

2.int *ptr=a;

3.ptr+=5;

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

如果上例中,ptr是被減去5,那麼處理過程大同小異,只不過ptr的值是被減去5乘sizeof(int),新的ptr指向的位址將比原來的ptr所指向的位址向低位址方向移動了20個位元組。

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

C語言指標用法詳解(二) 指標的算術運算

例題1 char a 20 int ptr int a ptr include using namespace std int main 例題2 int arr 20 int ptr arr for int i 0 i 20 i include using namespace std int mai...

C語言 二 指標

一 指標概述 1.簡介 2.初始化 1 先定義後初始化 int a 10 int p p a 2 定義並初始化 int a 10 int p a 備註 在資料型別後,變數名稱前的 是乙個說明符,用來說明該變數是乙個指標變數。如果前面沒有資料型別,如 p,這裡的 是乙個指標運算子,用來取出指標變數所指...

二 指標的定義及運算

上一講已經說過,指標是一種變數,它也有自己的位址,但由於它是專門用來存放位址的變數,所以把它認為是種特殊的變數,既然有著特殊的身份,那麼也理應受到特殊的待遇,下面來看看它享受了那些優待。1 指標的定義 在c語言中,定義乙個普通的變數 如整型數 我們這樣做 int i 而定義乙個指標變數 指標 我們需...