C[7] 指針(pointer)


C[7] 指針(pointer)

1、概念

對於指針的描述,很多資料描述的摸棱兩可,理解起來過於的復雜,這里加上自己對指針概念的理解,

指針(pointer)是指向對象變量的內存地址,是內存地址,是變量的內存地址,是函數的入口地址。計算機按變量的地址取出其內容,並按變量的地址將計算結果存入到變量占據的內存中。

指針變量 是用來存放內存地址的變量,在同一CPU構架下,不同類型的指針變量所占用的存儲單元長度是相同的,而存放數據的變量因數據的類型不同,所占用的存儲空間長度也不同。有了指針以后,不僅可以對數據本身,也可以對存儲數據的變量地址進行操作。 
指針描述了數據在內存中的位置,標示了一個占據存儲空間的實體,在這一段空間起始位置的相對距離值。在 C/C++語言中,指針一般被認為是指針變量,指針變量的內容存儲的是其指向的對象的首地址,指向的對象可以是變量(指針變量也是變量),數組,函數等占據存儲空間的實體。

這里重點理解一下:指針即指向的變量和指針變量,兩個概念。

2、示例:

#include <stdio.h>

int main()
{
    //滔Roy 2021.11.05
    //測試環境:win10 64
    int i = 10;  //編譯器為i分配一個變量地址,這個變量地址代表一個存儲空間,空間中存儲的數據的類型是int ,存儲空間寫入變量的值10
    int *p;   // 定義指針   Delphi寫法: var p:^Interger;  
    p = &i;   // 將i的內存地址分配給指針變量p    Delphi寫法:p:=@i
    //以上兩句,也可以寫成: int *p=&i;

    //16 進制輸出
    printf("i 變量的值: %p\n", i);       //000000000000000A      //i的內存值
    printf("i 變量的地址: %p\n", &i);    //000000000061FE1C      //i的內存值地址,這個地址根據系統運行分配可能不一樣,它僅代表分配的一個內存地址        printf("i 變量的地址: %x\n", &i);   //61fe14     //i的內存值地址
    printf("p 變量的值: %p\n", p);       //000000000061FE1C      //p變量的值指向(等於)i的內存值地址
    printf("p 變量的地址: %p\n", &p);    //000000000061FE10      //p變量也有一個內存值地址 , 這個一般不用,不用理會,只是輸出對比
    printf("p 變量的指針值*p: %p\n", *p);//000000000000000A      //p變量的指針值等於i的值,  即*p等同於i

    //10 進制輸出
    printf("i 變量的值: %d\n", i);      //10 = A (16進制)         //i存儲空間的值=10
    printf("i 變量的地址: %d\n", &i);   //6422044 = 61FE1C
    printf("p 變量的值: %d\n", p);      //6422044 = 61FE1C         //p存儲空間的值是 i的變量地址
    printf("p 變量的地址: %d\n", &p);   //6422032 = 61FE10
    printf("p 變量的指針值: %d\n", *p);   //10 = A

    *p=*p+1;   //改變指針的值,即改變了i的值
    printf("*p 變量的值: %d\n", *p);   //11
    printf("i 變量的值: %d\n", i);     //11
    printf("p 變量的值: %d\n", p);     //6422044 = 61FE1C    指針變量的值不變

    i=i+1;  //改變i的值,指針的值也改變,因為指針指向了這個地址,這個地址的值改變,它也改變
    printf("i 變量的值: %d\n", i);     //12
    printf("*p 變量的值: %d\n", *p);   //12
    printf("p 變量的值: %d\n", p);     //6422044 = 61FE1C    指針變量的值不變

    p=p+1;
    printf("p 變量的值: %d\n", p);   //6422048=61FE20      //指針變量的值改變
    printf("i 變量的值: %d\n", i);   //12                  //改變指針變量的值,不會改變i的值,因為指針變量存儲的是變量的地址。
    printf("*p 變量的值: %d\n", *p);   //12854240  //改變指針變量,即指針的值也改變. 應該是個隨機值,每次運行都一樣 ,也可能是 0

    //sizeof()  返回變量的大小。 注意:C語言中的sizeof() 不是函數,相當於運算符。
    printf("i 變量的大小: %d\n", sizeof(i));   //4   i是int類型,值占用4個字節
    printf("i 變量的大小: %d\n", sizeof(&i));  //8

    printf("p 變量的大小: %d\n", sizeof(p));    //8  //同一CPU下,不同類型的指針變量所占用的存儲單元長度是相同的
    printf("*p 變量的大小: %d\n", sizeof(*p));  //4   指針指向i的值,大小與i一致。存放數據的變量因數據的類型不同,所占用的存儲空間長度也不同。
    printf("&p 變量的大小: %d\n", sizeof(&p));  //8

}  

3、空指針和判斷

#include <stdio.h>

int main()
{
// 滔Roy 2021.11.05
    int *p;  p=NULL;  //可以寫成: int *p=NULL;    //指針設置成空值,不會改變原來指針變量p的內存地址

    printf("p 的地址是 %p\n", p );  //0000000000000000
    printf("*p 指針的大小 %d \n", sizeof(*p));  //4
    printf("p 變量的大小 %d \n", sizeof(p));   //8

    if (p)   //注意:這里的判斷相當於 p是否等於1 ,即不為空,  如果是: if (!p)  即不等於1 ,即為0 ,即為空
    {
        printf("p指針不為空");
    } else
    {
        printf("p指針為空");
    }
}

 

 

 

 

創建時間:2021.11.04  更新時間:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM