1. 程式人生 > >【C語言】指標的算術運算

【C語言】指標的算術運算

    之前在學習指標時,我們知道指標其實也是一種變數,既然這樣,那麼指標應該和普通變數一樣,可以進行算術運算。下面我們介紹指標的加減運算。先看一個例項:
#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,
則整個陣列對應的地址如下:圖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 *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 指標減指標例項執行結果