指標算術

指標新增

給定一個指標和一個標量型別 N,求值為指向指向型別的 Nth 元素的指標,該元素直接跟隨記憶體中的指向物件。

int arr[] = {1, 2, 3, 4, 5};
printf("*(arr + 3) = %i\n", *(arr + 3)); /* Outputs "4", arr's fourth element. */

指標是用作運算元值還是標量值無關緊要。這意味著像 3 + arr 這樣的東西是有效的。如果 arr[k] 是陣列的 k+1 成員,則 arr+k 是指向 arr[k] 的指標。換句話說,arrarr+0 是指向 arr[0] 的指標,arr+1 是指向 arr[2] 的指標,依此類推。一般來說,*(arr+k)arr[k] 相同。

與通常的算術不同,將 1 新增到指向 int 的指標會將 4 位元組新增到當前地址值。由於陣列名稱是常量指標,+是我們可以使用陣列名稱通過指標表示法訪問陣列成員的唯一運算子。但是,通過定義指向陣列的指標,我們可以更靈活地處理陣列中的資料。例如,我們可以按如下方式列印陣列的成員:

#include<stdio.h>
static const size_t N = 5
    
int main()
{
    size_t k = 0;
    int arr[] = {1, 2, 3, 4, 5};
    for(k = 0; k < N; k++)
    {
        printf("\n\t%d", *(arr + k));
    }
    return 0;
}

通過定義指向陣列的指標,上述程式等效於以下內容:

#include<stdio.h>
static const size_t N = 5
    
int main()
{
    size_t k = 0;
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr = arr; /* or int *ptr = &arr[0]; */
    for(k = 0; k < N; k++)
    {
        printf("\n\t%d", ptr[k]);
        /* or   printf("\n\t%d", *(ptr + k)); */
        /* or   printf("\n\t%d", *ptr++); */
    }
    return 0;
}

看到使用運算子+++訪問陣列 arr 的成員。可以與指標 ptr 一起使用的其他運算子是 ---

指標減法

給定兩個指向同一型別的指標,求值為 ptrdiff_t 型別的物件,該物件儲存必須新增到第二個指標的標量值,以獲得第一個指標的值。

int arr[] = {1, 2, 3, 4, 5};
int *p = &arr[2];
int *q = &arr[3];
ptrdiff_t diff = q - p;

printf("q - p = %ti\n", diff); /* Outputs "1". */
printf("*(p + (q - p)) = %d\n", *(p + diff)); /* Outputs "4". */