關於指針的算術運算

在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循環

相關文章
相關標籤/搜索