在32位程序當中,int佔據4個字節,地址以字節爲單位,每一個指針佔據四個字節,因此指針+1或者-1都是向高地址或者低地址變化四個字節。
經過一個小例子來加深理解:設計
#include<stdio.h> int main(int argc, const char *argv[]) { int i; int array[20]={0}; int *ptr=array; for(i=0;i<20;i++) { (*ptr)++; ptr++; printf("第%d次循環,%d,%d.\n",i+1,*ptr,ptr); // printf("第%d次循環,%d.\n",i+1,ptr); } return 0; }
第1次循環,0,-759299244. 第2次循環,0,-759299240. 第3次循環,0,-759299236. 第4次循環,0,-759299232. 第5次循環,0,-759299228. 第6次循環,0,-759299224. 第7次循環,0,-759299220. 第8次循環,0,-759299216. 第9次循環,0,-759299212. 第10次循環,0,-759299208. 第11次循環,0,-759299204. 第12次循環,0,-759299200. 第13次循環,0,-759299196. 第14次循環,0,-759299192. 第15次循環,0,-759299188. 第16次循環,0,-759299184. 第17次循環,0,-759299180. 第18次循環,0,-759299176. 第19次循環,0,-759299172. 第20次循環,-759298928,-759299168.
第二十次循環,發生意想不到的錯誤。
按照程序,應該第一次,(*ptr)=1,一直到第二十次,(*ptr)=20。ptr的值也應該是每次像高位增長4.
爲了找出錯誤,設計test2.c和test3.c。指針
#include<stdio.h> int main(int argc, const char *argv[]) { int i; int array[20]={0}; int *ptr=array; for(i=0;i<20;i++) { (*ptr)++; ptr++; // printf("第%d次循環,%d,%d.\n",i+1,*ptr,ptr); // printf("第%d次循環,%d.\n",i+1,ptr); // printf("第%d次循環,%d.\n",i+1,*ptr); } return 0; }
for循環中,分別只運行printf(ptr)和printf(*ptr).
當只運行printf(ptr):code
第1次循環,624857700. 第2次循環,624857704. 第3次循環,624857708. 第4次循環,624857712. 第5次循環,624857716. 第6次循環,624857720. 第7次循環,624857724. 第8次循環,624857728. 第9次循環,624857732. 第10次循環,624857736. 第11次循環,624857740. 第12次循環,624857744. 第13次循環,624857748. 第14次循環,624857752. 第15次循環,624857756. 第16次循環,624857760. 第17次循環,624857764. 第18次循環,624857768. 第19次循環,624857772. 第20次循環,624857776.
當只運行printf(*ptr):io
第1次循環,0. 第2次循環,0. 第3次循環,0. 第4次循環,0. 第5次循環,0. 第6次循環,0. 第7次循環,0. 第8次循環,0. 第9次循環,0. 第10次循環,0. 第11次循環,0. 第12次循環,0. 第13次循環,0. 第14次循環,0. 第15次循環,0. 第16次循環,0. 第17次循環,0. 第18次循環,0. 第19次循環,0. 第20次循環,-1906311296.
分析源代碼,for循環中,*ptr的初值是a[0]=0,(*ptr)++,ptr=1,可是ptr++,說明ptr指針指向的地址已經從a[0]變成了a[1],因此第一次循環,printf輸出的ptr是a[1]的值,ptr的值爲a[1]的地址,因此第二十次循環的時候,*ptr指向的是a[20]後面的一個地址,該地址並未賦值,因此它的值具備不肯定性。ptr則繼續向高位+4.for循環