【C語言】指標的算術運算
阿新 • • 發佈:2019-02-10
之前在學習指標時,我們知道指標其實也是一種變數,既然這樣,那麼指標應該和普通變數一樣,可以進行算術運算。下面我們介紹指標的加減運算。先看一個例項: 則整個陣列對應的地址如下:圖1 陣列arr對應地址 *p = 10,是將陣列首元素的值改為10:圖2 修改陣列arr首元素的內容 第一種情況:加一個數組;圖3 指標p向後移一個數組 這種情況是無意義的。使用指標的目的就是訪問陣列內的元素,若為加一個數組,則直接到陣列的後一個地址,並沒有訪問陣列內元素,所以這種情況可以排除。 第二種情況:加一個位元組; 陣列arr為整型,每一個單元格佔4個位元組,我們把前兩個單元格用位元組的形式畫出。arr[0]=10,十進位制的10轉化為十六進位制為0xa。a佔用4個位元組,也就是8位,即0x0000000a。十進位制的2轉化為十六進位制為0x00000002。因電腦使用的小端,即低地址存放小資料,如下圖所示: 圖4 前兩個陣列元素 當p為加一個位元組時,將*p賦值為20,十六進位制為0x00000014,則:圖5 指標p加一個位元組 此時arr[0]的值為0x140a,轉化為十進位制為5130。arr[1]=0,顯然與我們想要的結果不符。 第三種情況:加一個單元格;p向後加一個單元格,即指向arr[1]。將arr[1]修改為20,如圖:圖6 指標p加一個單元格 將arr[0]和arr[1]轉化為十進位制分別為10,20,此時結果才是正確的。說明對於整型指標p++,應為加一個單元格,也就是四個位元組。因此指標的加法和減法是需要調整的,調整的權重是sizeof(指標去掉一個*)。 下面是指標加法的一些例項:
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4};
int *p = arr;
*p = 10;
printf("%d\n",*p);
p++;
*p = 20;
printf("%d\n",*p);
return 0;
}
關於上述例項中的p++,可能會有以下三種情況: 1.加一個數組; 2.加一個位元組; 3.加一個指標。 在上述例子中,我們定義了一個整形陣列arr,p指向陣列首地址。假設其首地址為1000,#include <stdio.h>
int main()
{
int *p = (int *)1000;
printf("%d\n",p+5);//1020
printf("%d\n",(short *) p+5);//1010
printf("%d\n",(unsigned long *)p+5);//1020
printf("%d\n",(double *)p+5);//1040
printf("%d\n",(char ***)p+5);//1020
printf("%d\n",(char *)p+5);//1005
printf("%d\n",(long long)p+5);//1005
return 0;
}
執行結果:圖7 指標加法例項執行結果 下面是指標減法的一些例項:#include <stdio.h>
int main()
{
int *p = (int *)0x2010;
printf("%x\n",p-2);//2008
printf("%x\n",(float *) p-2);//2008
printf("%x\n",(double **)p-2);//2008
printf("%x\n",(long long *)p-2);//2000
printf("%x\n",(short *)p-2);//200c
printf("%x\n",(char *)p-2);//200e
printf("%x\n",(unsigned long)p-2);//200e
return 0;
}
執行結果: 圖8 指標減法例項執行結果 指標加指標非法,指標減指標表示兩個指標間隔的單元格數。計算方法:1.算出位元組數;2.除以調整權重。下面是指標減指標的例項:#include <stdio.h>
int main()
{
int arr[10] = {0};//x
int *p = &arr[9];//x+36
int *q = &arr[1];//x+4
printf("%d\n",p-q);//8
printf("%d\n",q-p);//-8
printf("%d\n",(short *)p-(short *)q);//16
printf("%d\n",(long *)p-(long *)q);//8
printf("%d\n",(char **)p-(char **)q);//8
printf("%d\n",(double *)p-(double *)q);//4
printf("%d\n",(long long)p-(long long)q);//32
printf("%d\n",(char *)p-(char *)q); //32
return 0;
}
執行結果:圖9 指標減指標例項執行結果