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 更新時間: