C Primer Plus 第10章 數組和指針 10.5 指針操做

C提供了6種基本的指針操做,下面的程序將具體演示這些操做。爲了顯示每個操做的結果,程序將打印出指針的值(即指針指向的地址)、指針指向地址中存儲的內容,以及指針自己的地址(若是您的編譯器不支持%p說明符,那麼想要打印出地址,就須要使用%u或者%lu)。數組

程序清單10.13示例了可對指針8種基本操做。除了這些操做,你還能夠使用關係運算符來比較指針。函數

程序清單10.13  ptr_ops.c程序指針

//ptr_ops.c指針操做
#include <stdio.h>
int main(void)
{
    int urn[5]={100,200,300,400,500};
    int * ptr1,* ptr2,* ptr3;

    ptr1 = urn;  //把一個地址賦給指針
    ptr2 = &urn[2];  //同上
                     //取得指針指向的值,而且獲得指針的地址
    printf("pointer value, dereferenced pointer, pointer address:\n");
    printf("ptr1 = %p,*ptr1 = %d,&ptr1 = %p\n",
           ptr1,*ptr1,&ptr1);
    //指針加法
    ptr3 = ptr1 + 4;
    printf("\nadding an int to a pointer:\n");
    printf("ptr1 + 4 = %p, *(ptr1+3)=%d\n",
           ptr1+4,*(ptr1+3));
    //遞增指針
    ptr1++;
    printf("\nvalues after ptr1++\n");
    printf("ptr1 = %p,*ptr1 = %d,&ptr1 = %p\n",
           ptr1,*ptr1,&ptr1);
    //遞減指針
    ptr2--;
    printf("\nvalues after ptr2--\n");
    printf("ptr2 = %p,*ptr2 = %d,&ptr2 = %p\n",
           ptr2,*ptr2,&ptr2);
    //恢復爲初始值
    --ptr1;
    ++ptr2;
    printf("\npointers reset to original values:\n");
    printf("ptr1 = %p,ptr2 = %p\n",
           ptr1,ptr2);
    //一個指針減去另外一個指針
    printf("\nsubtracting one pointer from another:\n");
    printf("ptr2 = %p, ptr1 = %p,ptr2 - ptr1 = %d\n",
           ptr2,ptr1,ptr2-ptr1);
    //一個指針減去一個整數
    printf("\nsubtracting an int from a pointer:\n");
    printf("ptr3 = %p, ptr3 - 2 = %p\n",
           ptr3,ptr3 - 2);
    return 0;
}

下面的列表描述了可對指針變量執行的基本操做:code

** 賦值(assignment)---能夠把一個地址賦給指針。一般使用數組名或地址運算符&來進行賦值。注意:地址應該和指針類型兼容。也就是說,不能把一個double類型的地址賦給一個指向int的指針。內存

** 求值(value - finding)或取值(dereferencing)---運算符*可取出指針指向地址中存儲的數值。所以,*ptr1開始爲100,即存儲在地址0x0012ff38中的值。ci

** 取指針地址---指針變量同其餘變量同樣具備地址和數值,使用運算符&能夠獲得存儲指針自己的地址。本例中,ptr1被存儲在內存地址ox0012ff34中。該內存單元的內容是0x0012ff38,即urn的地址。編譯器

** 將一個整數加給指針---能夠使用+運算符來把一個整數加給一個指針,或者把一個指針加給一個正數。兩種狀況下,這個整數都會和指針所指類型的字節數相乘,而後所得結果會加到初始地址上。因而ptr1+4的結果就等同於&urn[4]。若是相加的結果超出了初始指針所指向數組的範圍,那麼這個結果是不肯定的,除非超出數組最後一個元素的地址可以確保是有效的。io

** 增長指針的值 ---能夠經過通常的加法或增量運算符來增長一個指針的值對指向某數組元素的指針作增量運算,可讓指針指向數組的下一個元素。所以,ptr1++運算把ptr1加上數值4(咱們系統上int爲4個字節),使ptr1指向urn[1]。如今ptr1的值是0x0012ff3c,*ptr1的數值爲200。請注意ptr1自己的地址仍然是0x0012ff34。別忘了,變量是不會由於它的值的變化而移動位置的編譯

** 從指針中減去一個整數 ---能夠使用-運算符來從一個指針中減去一個整數指針必須是第一個操做數,或者是一個指向整數的指針這個整數都會和指針所指類型的字節相乘,而後所獲得的結果會從初始地址中減掉。因而,ptr3-2的結果等同於&urn[2],由於ptr3是指向&urn[4]的。若是相減結果超出了初始指針所指向的數組範圍,那麼這個結果是不肯定的,除非超出數組最後一個元素的地址可以確保有效。class

** 減少指針的值---指針固然也能夠作減量運算。請注意,你能夠使用前綴或後綴形式的增量和減量運算符。

** 求差值(Differencing)---能夠求出兩個指針以前的差值。一般對分別指向同一個數組內的兩個元素的指針求差值,以求出元素之間的距離差值的單位是相應類型的大小有效指針差值運算的前提是參加運算的兩個指針是指向同一個數組(或是其中之一指向數組後面的第一個地址)。

** 比較---能夠使用關係運算符來比較兩個指針的值,前提是兩個指針具備相同的類型

注意,這裏有兩種形式的減法。能夠用一個指針減掉另外一個指針獲得一個整數,也能夠從一個指針中減掉一個整數獲得一個指針

在進行指針的增量和減量運算時,要牢記一些注意事項。計算機並不檢查指針是否仍然指向某個數組元素。C保證指向數組元素的指針和指向數組後的第一個地址的指針都是有效的。

另外,能夠對指向一個數組元素的指針進行取值運算。但不能對指向數組後的第一個地址的指針進行取值運算,儘管這樣的指針是合法的

特別注意:不能對未初始化的指針取值

切記:當建立一個指針時,系統只分配了用來存儲指針自己的內存空間,並不分配有來存儲數據的內存空間。所以在使用指針以前,必須給它賦予一個已分配的內存地址。好比,能夠把一個已存在的變量地址賦給指針。

指針的最初功能在於同函數交換信息。從前面所學的內容可知,若是須要讓被調函數修改調用函數中的變量,就必須使用指針。

指針的另外一個基本功能是用在處理數組的函數中。

相關文章
相關標籤/搜索