C語言關於指針P、*P、&P三者的區別

一、指針與指針變量

1、指針和指針變量是兩個不同的概念,但要注意的是,通常我們敘述時會把指針變量簡稱爲指針。

2、指針就是地址,地址就是指針,它是一個形無符號整型,一個整數,它的大小取決於系統是16 32 還是64位的 16/8=2byte 32/8=4byte 64/8=8byte.

3、指針變量其實是一個變量,只不過其存放的內容爲地址,如 int* p,這個p是指針類型,它的值存的是地址。

 

二、指向變量的指針和指向本身的指針

假設我們定義了一個指針變量 int *p;

1、 p:p是一個指針變量的名字,表示此指針變量指向的內存地址,如果使用%p來輸出的話,它將是一個16進制數

2、 *p:*p表示此指針指向的內存地址中存放的內容,一般是一個和指針類型一致的變量或者常量。

3、 &p:&是取地址運算符,&p就是取指針p的地址。等會,怎麼又來了個地址,它到底和p有什麼區別?

p和&p區別在於指針p同時也是個變量,既然是變量,編譯器肯定要爲其分配內存地址,無論是普通的變量還是指針變量在內存中都有一個地址 ,就像程序中定義了一個int型的變量i,編譯器要爲其分配一塊內存空間一 樣。而&p就表示編譯器爲變量p分配的內存地址,而因爲p是一個指針變量,這種特殊的身份註定了它要指向另外一個內存地址,程序員按照程序的需要讓它指向一個內存地址,這個它指向的內存地址就用p表示。而且,p指向的地址中的內容就用*p表示。

#include <stdio.h>
int main()
{
    int a = 100;
    int *ap = &a;
    printf("%p\n",&a);//輸出:002AF744  輸出的是a變量的地址
    printf("%p\n",ap);//輸出:002AF744  通過指針變量ap輸出a變量的地址
    printf("%p\n",&ap);//輸出:002AF738  指針變量ap本身自己的地址
    printf("%d\n",*ap);//輸出:100
    printf("%p\n",&*ap);//輸出:002AF744
}

三、爲什麼一個指針變量可以存儲一串字符

首先我們需要知道內存地址(簡稱地址)是一個十六進制的數字,比如說0x403024這就可以表示一個地址,拿這個東西可以表示任意一個字符。

指針並不是真的可以存儲字符串,而是存儲了字符串首字母的地址,其實每個字符串都是以'/0'爲結束符,當用%s輸出時,在輸出前一個字符的同時指針會自動跳到下個字符的地址處,直到遇到'/0'停止,所以%s可以輸出一個字符串

如:char *str = "hello world"
指針只能存儲地址,上面“hello world”存儲在文字常量區,str只是保存這個字符串的地址
不過可以用malloc函數開一塊空間出來,然後把地址給指針,也算是存儲字符串
比如char *str = (char*)malloc(str_size);

 

 

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