您好,登錄后才能下訂單哦!
這篇文章主要介紹“c++指針怎么初始化”,在日常操作中,相信很多人在c++指針怎么初始化問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”c++指針怎么初始化”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
1、指針概念理解
int* p 定義一個(gè)指針(推薦使用這種寫(xiě)法int* ,理解上有好處)
p 指針變量;
* 間接運(yùn)算符(訪問(wèn)符),代表訪問(wèn)該地址所指向的空間;
*p 指針?biāo)4妫ㄖ赶颍┑牡刂分袑?duì)應(yīng)(指向)的值;
&p 獲取指針變量的內(nèi)存地址(指針本身占用內(nèi)存空間);
故 指針是
?。?)通過(guò)間接的方式訪問(wèn)內(nèi)存空間(直接方式是通過(guò)變量名稱(chēng)(內(nèi)存空間名字)直接訪問(wèn)空間);
?。?)指針是一種保存變量?jī)?nèi)存地址的變量,自身也占用內(nèi)存空間。
eg:
指針初始化的兩種方式
int a = 40; //指針初始化方式第一種寫(xiě)法 int* p;//p是指針變量,而不是*p p = &a;//指針變量用來(lái)存放內(nèi)存地址;注意,此處使用*p = &a是錯(cuò)誤的定義,應(yīng)該是對(duì)p(指針變量)賦值,而不是*p(指針保存的地址指向的值) //指針初始化方式第二種寫(xiě)法,實(shí)質(zhì)是第一種寫(xiě)法的簡(jiǎn)化方式。 int* p1 = &a; cout << " &p--對(duì)指針變量取地址--輸出指針變量的地址:" << &p << endl; cout << " *p--該指針保存的地址對(duì)應(yīng)的值--輸出指針?biāo)娣诺牡刂穼?duì)應(yīng)的在堆內(nèi)存中的值:" << *p << "\n";
2、聲明指向int類(lèi)型的指針,即指針包含的地址對(duì)應(yīng)的內(nèi)存單元存儲(chǔ)了一個(gè)整數(shù)
int* p = NULL;
3、使用 指針 存儲(chǔ) 由地址運(yùn)算符& 獲取的地址
int age = 30; int* pa = &age; cout << "*pa = " << *pa << endl; cout << "pa = " << pa << endl; //age的內(nèi)存地址 cout << "&age = " << &age << endl; cout << "指針自身的地址----&pa = " << &pa << endl; //指針自身的地址
4、const指針
int day = 30; int* const pDay = &day; //指針包含的地址是常量---常量指針 cout << pDay << endl; int hour = 24; const int* pHour = &hour; //指針指向的數(shù)據(jù)是常量---指向常量的指針 cout << pHour << endl; int h = 24; const int* const ph = &h; //指針包含的地址以及指向的值都是常量---指向常量的常量指針 cout << ph << endl;
5、 聲明指向內(nèi)存塊的指針,即void指針
void 指針是一種特殊的指針,表示為“無(wú)類(lèi)型指針”,由于 void 指針沒(méi)有特定的類(lèi)型,因此它可以指向任何類(lèi)型的數(shù)據(jù)。也就是說(shuō),任何類(lèi)型的指針都可以直接賦值給 void 指針,而無(wú)需進(jìn)行其他相關(guān)的強(qiáng)制類(lèi)型轉(zhuǎn)換。
eg:
void* p1; int* p2; p1 = p2; p2 = (int* )p1;
6、野指針:
把沒(méi)有合法指向的指針?lè)Q為“野”指針。因?yàn)椤耙啊敝羔橂S機(jī)指向一塊空間,該空間中存儲(chǔ)的可能是其他程序的數(shù)據(jù)甚至是系統(tǒng)數(shù)據(jù),故不能對(duì)“野”指針?biāo)赶虻目臻g進(jìn)行存取操作,否則輕者會(huì)引起程序崩潰,嚴(yán)重的可能導(dǎo)致整個(gè)系統(tǒng)崩潰。
eg:
int *pi,a; //pi未初始化,無(wú)合法指向,為“野”指針 *pi=3; //運(yùn)行時(shí)錯(cuò)誤!不能對(duì)”野”指針指向的空間做存入操作。該語(yǔ)句試圖把 3 存入“野”指針pi所指的隨機(jī)空間中,會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。 a=*pi; //運(yùn)行時(shí)錯(cuò)誤!不能對(duì)”野”指針指向的空間取操作。該語(yǔ)句試圖從“野”指針pi所指的空間中取出數(shù)據(jù),然后賦給變量a同樣會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。
7、指針運(yùn)算
eg:
int* p = 4;
p++;
指針變量 p 進(jìn)行 p++,p 是一個(gè) int 類(lèi)型的指針,指向內(nèi)存地址 0x10000008 處。則 p++ 將指向與 p 相鄰的下一個(gè)內(nèi)存地址,由于 int 型數(shù)據(jù)占 4 個(gè)字節(jié),因此 p++ 所指的內(nèi)存地址為 1000000b。這種運(yùn)算并不會(huì)改變指針變量 p 自身的地址,只是改變了它所指向的地址(存放的地址)。
8、補(bǔ)充: c++指針內(nèi)存空間釋放
int* pb = new int; int* pb2 = new int[4]; delete pb; delete[] pb2;
9、數(shù)組與指針:
(1)一維數(shù)組和指針
int* p,a[10] = {1,2,3,4,5}; p = a;//p指向數(shù)組a的首地址,即p=&a[0],數(shù)組名相當(dāng)于數(shù)組首元素的地址a[0] //數(shù)組的訪問(wèn)方式 //1、直接訪問(wèn)---數(shù)組名[下標(biāo)] cout << a[1] << "\n"; //2、間接訪問(wèn)---*(數(shù)組名+i) cout << *(a+2) << endl;// a+2表示數(shù)組首地址向后移動(dòng)2個(gè)位置,a+2相當(dāng)于&a[2] //3、間接訪問(wèn)--- *(指針變量) for (int i=0; i<10; i++) { cout << * p++ << endl;//++運(yùn)算符的優(yōu)先級(jí)要高于* }
指針數(shù)組:存儲(chǔ)指針的數(shù)組,int* p[5]
int a0,a1,a2,a3; int* b[5]; b[0] = &a0; b[1] = &a1; b[2] = &a2;
數(shù)組指針:指向一維數(shù)組的指針,int (*p)[5]
int c[3][4]; int (*p)[4];//定義一個(gè)數(shù)組指針,指向含4個(gè)元素的一維數(shù)組 p = c;//二維數(shù)組的首地址賦給p,即a[0],或&a[0][0]
(2)二維數(shù)組
int* p; int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; p = &a[0][0]; //通過(guò)數(shù)組下邊直接訪問(wèn) /* * 通過(guò)地址間接訪問(wèn),即*(*(a+i)j)的形式,二維數(shù)組可看成由特殊一維數(shù)組組成的一維數(shù)組,a[i]可看成一個(gè)由N列組成的一維數(shù)組, a表示a[0][0]的地址 * a[i]等價(jià)于*(a+i),表示i的首行地址,i行對(duì)應(yīng)的一維數(shù)組的數(shù)組名。 * a[i]+0 <---> *(a+i)+0 <---> &a[i][0] * a[i]+j <---> *(a+i)+j <---> &a[i][j] * 地址即指針,通過(guò)間接運(yùn)算符*,可以訪問(wèn)內(nèi)存空間,則 * *(a[i]+j) <---> *(*(a+i)+j) <---> *&a[i][j] <---> a[i][j] */ cout << "a[0][0]的地址:" << a << endl; cout << "a[0][1]的地址:" << a+1 << endl; cout << "a[1][0]的地址:" << a[1]+0 << endl; cout << *(a+1)+0 << endl; cout << &a[1][0] << endl;
10、函數(shù)與指針: (1)指針函數(shù),函數(shù)返回調(diào)用者某個(gè)地址即指針類(lèi)型;
char* str_cat(char* c1, char* c2){ char* p1 = c1; char* p2 = c2; while (*p1!='\0'){ p1++; } *p1++=' '; while (*p2!='\0'){ *p1++=*p2++; } return c1;//返回結(jié)果為指針類(lèi)型
}
(2)函數(shù)指針---指向函數(shù)的指針
int* pf (int, int);//函數(shù)的返回值為int指針類(lèi)型,int* int (*pf1) (int, int);//函數(shù)指針變量pf,可以指向任意含有兩個(gè)整形參數(shù),且返回值為整形的函數(shù) pf = &fun; pf = fun;//可以不用取地址,一個(gè)函數(shù)標(biāo)識(shí)符就代表了它的地址
調(diào)用函數(shù)指針的方式兩種方式
x = (*func)(); x = func();
到此,關(guān)于“c++指針怎么初始化”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。