C語(yǔ)言關(guān)于指針P、*P、&P三者的區(qū)別

一、指針與指針變量

1、指針和指針變量是兩個(gè)不同的概念,但要注意的是,通常我們敘述時(shí)會(huì)把指針變量簡(jiǎn)稱為指針。

2、指針就是地址,地址就是指針,它是一個(gè)形無(wú)符號(hào)整型,一個(gè)整數(shù),它的大小取決于系統(tǒng)是16 32 還是64位的 16/8=2byte 32/8=4byte 64/8=8byte.

3、指針變量其實(shí)是一個(gè)變量,只不過(guò)其存放的內(nèi)容為地址,如 int* p,這個(gè)p是指針類型,它的值存的是地址。

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

假設(shè)我們定義了一個(gè)指針變量 int *p;

1、 p:p是一個(gè)指針變量的名字,表示此指針變量指向的內(nèi)存地址,如果使用%p來(lái)輸出的話,它將是一個(gè)16進(jìn)制數(shù)

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

3、 &p:&是取地址運(yùn)算符,&p就是取指針p的地址。等會(huì),怎么又來(lái)了個(gè)地址,它到底和p有什么區(qū)別?

p和&p區(qū)別在于指針p同時(shí)也是個(gè)變量,既然是變量,編譯器肯定要為其分配內(nèi)存地址,無(wú)論是普通的變量還是指針變量在內(nèi)存中都有一個(gè)地址 ,就像程序中定義了一個(gè)int型的變量i,編譯器要為其分配一塊內(nèi)存空間一 樣。而&p就表示編譯器為變量p分配的內(nèi)存地址,而因?yàn)閜是一個(gè)指針變量,這種特殊的身份注定了它要指向另外一個(gè)內(nèi)存地址,程序員按照程序的需要讓它指向一個(gè)內(nèi)存地址,這個(gè)它指向的內(nèi)存地址就用p表示。而且,p指向的地址中的內(nèi)容就用*p表示。

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

三、為什么一個(gè)指針變量可以存儲(chǔ)一串字符
首先我們需要知道內(nèi)存地址(簡(jiǎn)稱地址)是一個(gè)十六進(jìn)制的數(shù)字,比如說(shuō)0x403024這就可以表示一個(gè)地址,拿這個(gè)東西可以表示任意一個(gè)字符。

指針并不是真的可以存儲(chǔ)字符串,而是存儲(chǔ)了字符串首字母的地址,其實(shí)每個(gè)字符串都是以'/0'為結(jié)束符,當(dāng)用%s輸出時(shí),在輸出前一個(gè)字符的同時(shí)指針會(huì)自動(dòng)跳到下個(gè)字符的地址處,直到遇到'/0'停止,所以%s可以輸出一個(gè)字符串

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

下面看一下例子吧

#include<iostream>
using namespace std;
class P
{
public:
    P(int age)
    {
        this->age = 10;
    }
    P& addP()
    {
        this->age += age;
        return *this;
    }
    int age;
};
//發(fā)現(xiàn)是引用,轉(zhuǎn)換為int* const ref = &a
void func(int& ref)
{
    ref = 100; //ref是引用,轉(zhuǎn)換為*ref = 100
}
int main()
{
    //鏈?zhǔn)骄幊?    P p1(10);
    p1.addP().addP().addP();
    cout << p1.age << endl;
    //引用的本質(zhì)
    //自動(dòng)轉(zhuǎn)換為int* const ref = &a; 指針常量的指針指向不可修改,也說(shuō)明為什么引用不可更改
    int a = 10;
    int& ref = a;
    ref = 20; //內(nèi)部發(fā)現(xiàn)ref是引用自動(dòng)幫我們轉(zhuǎn)換為*ref = 20;
    cout << "a:" << a << endl;
    cout << "ref:" << ref << endl;
    func(a);
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容