標籤:style blog http color io 使用 ar for sp
本文是自己學習所做筆記,歡迎轉載,但請註明出處:http://blog.csdn.net/jesson20121020
指標是一個特殊的變數,表示一個地址,而地址可以上減去或加上一個整數,從而可以表示新的地址.
下面通過一段代碼來分析指標的算術運算:
#include <stdio.h>int main(){int i;char str[]={'a','b','c','d','e'};int *p = str;char *q = str;q++;p++;printf("數組str的首地址:%x\n",str);printf("指標q指向的內在區:%x\n",q);printf("指標p指向的記憶體區:%x\n",p);printf("數組的第一個元素的值:%c\n",*str);printf("數組的第一個元素的值:%c\n",*p);//遍曆數組第一種方法,下標法printf("遍曆數組第一種方法,下標法:");for(i = 0 ;i < sizeof(str);i++)printf("%c",str[i]);//遍曆數組第二種方法,數組名指標法printf("\n遍曆數組第二種方法,數組名指標法:");for(i = 0 ;i < sizeof(str);i++)printf("%c",*(str+i));//遍曆數組第三種方法,指標法q = str;printf("\n遍曆數組第三種方法,指標法:");for(i = 0 ;i < sizeof(str);i++)printf("%c",*q++);} 執行結果:
可以看出,數組的首地址為163c4730.通過上節的指標的概念和四個要素,很容易得知,指標q的類型為char*,且指標q指向的類型為char; char *q = str;的作用是將數組str的首地址賦給指標q,也就是說指標q的值或q指向的記憶體區就是數組str的首地址. 接下來,指標q自加1,這時,編譯器是這樣處理的,它把指標q的值加上了sizeof(char),也就是在原來的地址的基礎上向後移動了一個位元組,即指標q的指向的記憶體區為163c4730+1=163c4731. 同理,指標p的類型為int*,且指向的類型為int, int *p = str; 作用也是將數組的首地址賦給指標p,p++,編譯器將把指標p的值加上了sizeof(int),也就是在原來的基礎上向後移動了4個位元組,即指標p指向的記憶體區為163c4734,所以指標p在自加前,是指向數組第0號單元開始的四個位元組,在自加1後指向了數組第四號單元開始的四個位元組。
因此,判斷指標向後移動的多少位時,需要判斷指標指向的類型。
也可以用指標來遍曆數組,如上述代碼,可以使用數組名,因為這裡的數組名就是指向了數組的第0號單元,如果在此基礎上加上一個位移量,就可以訪問數組的其他元素,因此,可以用數組名+位移量來遍曆數組。同理,另設一個指標指向數組的第0號單元,每次指標自加1,就可以遍曆整個數組,這裡要注意,指標的所指向的類型,要和數組的元素類型要一致,所以上述代碼中用指標q來遍曆數組,而不是用指標p來遍曆。
當然,如果指標減去一個整數,處理過程和加上一個過程類似,只是向前移動了,而不是向後移動。
總結一下,一個指標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指標解析 ------ 指標的算術運算