指針操作---------賦值,解引用,取值,指針與整數相加,遞增指針,指針減去一整數,遞減指針,指針求差,比較

指針操作---------賦值,解引用,取值,指針與整數相加,遞增指針,指針減去一整數,遞減指針,指針求差,比較

 指針操作

 C提供了一些基本的指針操作,下面是8中不同操作,爲了顯示每種操作的結果,改程序打印了指針的值(該指針指向的地址),存儲在指針指向地址上的值,以及指針自己的地址


#include <stdio.h>


int main(int argc, const char * argv[]) {

    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 +4 ) = %d\n",ptr1+4,*(ptr1 + 4));

    printf("ptr1 + 2 = %p, *(ptr1 +2 ) = %d\n",ptr1+2,*(ptr1 + 2));

    

    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 = %td\n",ptr2,ptr1,ptr2 - ptr1);

//    一個指針減去一個整數

    printf("\nsubtracting an int from a pointer:\n");

    printf("ptr3 = %p,ptr3 - 2 = %p \n",ptr3, ptr3 - 2);

    printf("ptr3 = %p,ptr3 + 2 = %p \n",ptr3, ptr3 + 2);

    

    return 0;

}

輸出結果如下

1.賦值,可以吧地址賦值給指針。如,用數組名,帶地址運算符(&)的變量名,兩外一個指針進行賦值,在該例中,吧urn數組的手地址給ptr1,該地址的編號恰好是0x7ffeefbff540,變量ptr2獲得數組urn的第三個元素(urn[2])的地址。注意,地址應該和指針兼容。也就是說,不能吧double類型的地址賦給指向int的指針,至少避免不明智的類型轉換。

 2.解引用:*運算符給指針指向地址的值。因此,*ptr1的初值爲100,該值存儲在編號爲0x7ffeefbff540的地址上面。

 3.取值:和變量一樣,指針的變量也有自己的地址和值。對指針而言,&運算符給出指針本身的地址。 ptr1存儲的內存編號爲0x7ffeefbff528的低智商,該存儲單元存儲的內容是0x7ffeefbff540,既urn的地址。因此,&ptr1是指向ptr1的指針,而ptr1是指向utn[0]的指針,

    ptr1 = 0x7ffeefbff540,*ptr1 = 100,&ptr1 = 0x7ffeefbff528,

 

4.指針與證書相加:可以使用+運算符吧指針與證書相加,或證書與指針相加,無論那種情況,證書都會和指針所指向類型的大小(依字節爲單位)相乘,然後吧結果與初始化地址相加。因此ptr1+4與&urn[4]等價的。如果想家的結果超出了初始化指針指向的數組範圍,計算結果則是未定義的。除非正好超過數組末尾第一個位置,C保證指針有效。

 adding an  int to a pointer:

 ptr1 + 4 = 0x7ffeefbff550, *(ptr1 +4 ) = 500,&urn[4] == 500

 ptr1 + 2 = 0x7ffeefbff548, *(ptr1 +2 ) = 300


 5.遞增指針:遞增指向數組元素的指針可以讓該指針移動至數組的下一個元素。因此,ptr1++ 相當於吧ptr1的值加上4(int 爲4個字節),ptr1指向urn[1],如圖。現在ptr1的值是0x7ffeefbff544,也就是數組的下一個元素的地址,*ptr1的值爲200,即urn[1]的值。注意ptr1本身的地址任然是0x7ffeefbff528。因爲,變量不會因爲值發生變化就移動位置的。

     adding an  int to a pointer:

     ptr1 + 4 = 0x7ffeefbff550, *(ptr1 +4 ) = 500,&urn[4] == 500

     ptr1 + 2 = 0x7ffeefbff548, *(ptr1 +2 ) = 300


     values after ptr1++ :

     ptr1 = 0x7ffeefbff544,*ptr1 = 200,&ptr1 = 0x7ffeefbff528


 6.指針減去一個整數:可以使用-運算符從一個指針中減去一個整數。指針必須是從第一個運算對象,去乘積。所以ptr3-2與&urn[2]等價,因爲ptr3指向的是&arn[4]。如果想家的結果超出了初始化指針指向的數組範圍,計算結果則是未定義的。除非正好超過數組末尾第一個位置,C保證指針有效。

 subtracting an int from a pointer:

 ptr3 = 0x7ffeefbff550,ptr3 - 2 = 0x7ffeefbff548

 ptr3 = 0x7ffeefbff550,ptr3 + 2 = 0x7ffeefbff558

 

 7.遞減指針,參考遞增指針

 

 8.指針求差:可以計算兩個指針的差值,通常,求差的兩個指針分別指向同一個數組的不同元素,通過計算求出兩個元素之間的距離。差值的單位與數組類型的單位相同。如程序中,ptr2 - ptr1得2,意思是這兩個指針所指的兩個袁術像個兩個int,而不是2個字節。只要兩個指針都指向相同的數組(或者其中一個指針指向數組後面的第1個地址),C都是能保證相減運算有效。如果指向兩個不同數組的指針進項秋茶運算可能會得到一個值,或者導致運行時錯誤。

 

 9.比較:使用關係運算符可以比較兩個指針的值,前提是兩個指針都是指向相同類型的對象。

 PS:注意這兩個減法有兩種,可以用一個指針減去另外一個指針得到一個整數,活用一個指針減去一個整數得到另外一個指針。

 

 PS2:在遞增或者遞減指針時,還要注意一些問題,編譯器不會檢查指針是否仍指向數組元素。C只能保證指向數組中任意元素的指針和指向數組後面第一個位置的指針有效。但是如果遞增或者遞減一個指針超過了這個範圍,則是未定義。另外,可以解引用指向數組任意元素的指針。但是即使指針指向數組後面一個位置是有效的,也能解引用這樣的越界指針。



pointer value,dereferenced pointer ,pointer address:

ptr1 = 0x7ffeefbff540,*ptr1 = 100,&ptr1 = 0x7ffeefbff528


adding an  int to a pointer:

ptr1 + 4 = 0x7ffeefbff550, *(ptr1 +4 ) = 500

ptr1 + 2 = 0x7ffeefbff548, *(ptr1 +2 ) = 300


values after ptr1++ :

ptr1 = 0x7ffeefbff544,*ptr1 = 200,&ptr1 = 0x7ffeefbff528


values after ---ptr2:

ptr2 = 0x7ffeefbff544,*ptr2 = 200,&ptr2 = 0x7ffeefbff520


Pointers reset to original values:

ptr1 = 0x7ffeefbff540,ptr2 = 0x7ffeefbff548


subtracting one pointer from another:

ptr2 = 0x7ffeefbff548 ,ptr1 = 0x7ffeefbff540 ,ptr2 -ptr1 = 2


subtracting an int from a pointer:

ptr3 = 0x7ffeefbff550,ptr3 - 2 = 0x7ffeefbff548 

ptr3 = 0x7ffeefbff550,ptr3 + 2 = 0x7ffeefbff558 

Program ended with exit code: 0


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章