一伴逸、指針與指針變量
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è)變量官紫,只不過其存放的內(nèi)容為地址,如 int* p州藕,這個(gè)p是指針類型束世,它的值存的是地址。
二床玻、指向變量的指針和指向本身的指針
假設(shè)我們定義了一個(gè)指針變量 int *p毁涉;
1、 p:p是一個(gè)指針變量的名字锈死,表示此指針變量指向的內(nèi)存地址贫堰,如果使用%p來輸出的話,它將是一個(gè)16進(jìn)制數(shù)
2待牵、 p:p表示此指針指向的內(nèi)存地址中存放的內(nèi)容严嗜,一般是一個(gè)和指針類型一致的變量或者常量。
3洲敢、 &p:&是取地址運(yùn)算符漫玄,&p就是取指針p的地址。等會(huì),怎么又來了個(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 通過指針變量ap輸出a變量的地址
printf("%p\n", &ap);//輸出:002AF738 指針變量ap本身自己的地址
printf("%d\n", *ap);//輸出:100
printf("%p\n", &*ap);//輸出:002AF744 通過指針變量*ap輸出a變量的地址
}
三虑稼、為什么一個(gè)指針變量可以存儲(chǔ)一串字符
首先我們需要知道內(nèi)存地址(簡(jiǎn)稱地址)是一個(gè)十六進(jìn)制的數(shù)字琳钉,比如說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è)字符串的地址
不過可以用malloc函數(shù)開一塊空間出來,然后把地址給指針钾虐,也算是存儲(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; 指針常量的指針指向不可修改效扫,也說明為什么引用不可更改
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;
}