姓名:張立斐 ? 學(xué)號(hào):19020700001? ?學(xué)院:電子工程學(xué)院?
轉(zhuǎn)自:https://blog.csdn.net/lvliang2017232003/article/details/85341687
【嵌牛導(dǎo)讀】C++學(xué)習(xí)
【嵌牛鼻子】C++
【嵌牛提問(wèn)】如何學(xué)習(xí)C++?
【嵌牛正文】
指針前面的*運(yùn)算符稱為間接值或解除引用運(yùn)算符。
1.C++中指針聲明:int*? ptr; //強(qiáng)調(diào)int*是一種類型——指向int的指針。 ptr本身是一個(gè)指針
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int*? p1,p2;? //聲明一個(gè)指針p1和一個(gè)int變量p2.
2.**指針的初始化:(不是初始化它指向的值)? ? int h=5;? int* pt= &h;【指針的初始化非常重要】(delete pt; //不允許)
? ? 如下語(yǔ)句:long *fellow;? *fellow=23323; //會(huì)產(chǎn)生bug,無(wú)法確定fellow指向哪里,指向的可能不是儲(chǔ)存23323的地方
3. 指針不是整型 : int*? pt; pt=0xB8000000; //不合法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int*? pt; pt=(int *) 0xB8000000;? //合法
4.在C中用庫(kù)函數(shù)malloc()來(lái)分配內(nèi)存,在C++也可以這樣,還有種方法——new運(yùn)算符。new和delete要配對(duì)使用
? int * pn=new int;? ....delete pn; //用delete來(lái)釋放new分配的內(nèi)存
double * pd=new double; *pd=10000001.0;? //size of pd? =4 , size of *pd=8, 指針的長(zhǎng)度是4個(gè)字節(jié),與所指的數(shù)據(jù)類型無(wú)關(guān)
5.使用new創(chuàng)建動(dòng)態(tài)數(shù)組:
double * p3=new double [3];? //創(chuàng)建包含3個(gè)doble元素的數(shù)組,指針p3指向內(nèi)存中的第一個(gè)元素
p3[0]=0.2;? p3[1]=0.5;? p3[2]=0.8;? //指針訪問(wèn)數(shù)組中元素
p3=p3+1; cout<<p3[0]<<" "<<p3[1];? //輸出結(jié)果是p3[0]是0.5,p3[1]是0.8。p3+1導(dǎo)致指針指向第2個(gè)元素。
p3=p3-1; delete [] p3;? //在釋放指針時(shí),應(yīng)減1,指向原來(lái)的值。 釋放數(shù)組內(nèi)存時(shí)要加[]
6.指針變量加1后,增加的量等于它指向的類型的字節(jié)數(shù)。
多數(shù)情況, C++將數(shù)組名解釋為數(shù)組第1個(gè)元素的地址。
使用數(shù)組表示法時(shí),C++執(zhí)行下面的轉(zhuǎn)換: array[i] --> *(array+i)
使用的是指針,而不是數(shù)組名是,C++也執(zhí)行轉(zhuǎn)換:pt[i]--> *(pt+i)
7.對(duì)數(shù)組應(yīng)用sizeof得到的是數(shù)組長(zhǎng)度; 對(duì)指針應(yīng)用sizeof得到的是指針長(zhǎng)度(=4);
8. 數(shù)組的地址
short tell[10];?
cout<<tell<<endl;? //顯示&tell[0]的結(jié)果,是一個(gè)2字節(jié)的內(nèi)存塊地址
cout<<&tell<<endl; //對(duì)數(shù)組名取地址(&)顯示整個(gè)數(shù)組的地址,是一個(gè)20字節(jié)的內(nèi)存塊地址
//tell是一個(gè)short指針 *short
//&tell是一個(gè)指向包含20個(gè)元素的short數(shù)組的指針 short(*)[20]
short (*pas)[20]=&tell; //pas指針指向含20個(gè)short元素的數(shù)組
//*pas等價(jià)于tell, (*pas)[0]=tell[0];
9.如果給cout提供一個(gè)指針,它將打印地址,如果指針類型為char* ,則cout將顯示指向的字符。
? 如果要顯示字符串地址,則必須強(qiáng)制轉(zhuǎn)換(int *) ps。
char animal[20]="fox";? ? ? ? char *ps;
ps=animal;? cout<<ps<<" at "<<(int *) ps<<endl; //ps是一個(gè)指針,但顯示字符串,(int *) ps顯示字符串地址
10.通過(guò)使用new和strcpy()來(lái)獲取字符串?dāng)?shù)組的副本
? ps=new char[strlen(animal)+1];?
? strcpy(ps,animal); //不可直接賦值,ps=animal,只想將地址復(fù)制給ps,兩個(gè)指針指向相同的內(nèi)存單元和字符串,沒(méi)有復(fù)制字符串。
11.使用new創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)時(shí),指針pa表示指向結(jié)構(gòu)的指針,訪問(wèn)結(jié)構(gòu)成員的方式:(1)pa->name;(2)? (* pa).name [name為結(jié)構(gòu)成員]
12.
struct Years
{
int year;
int month;
};
Years y1,y2,y3; //創(chuàng)建結(jié)構(gòu)變量
Years ys[3];? ? //創(chuàng)建結(jié)構(gòu)數(shù)組
const Years * apy[3]={&y1,&y2,&y3};? //創(chuàng)建指針數(shù)組
//創(chuàng)建上述指針數(shù)組的指針,兩種方式
const Years ** ppya=apy;? //方法1
auto ppyb=apy;? ? ? ? ? ? //方法2,方便一點(diǎn),不易搞混
//訪問(wèn)
std::cout<<(*ppya)->year<<std::endl;
std::cout<<(*(ppyb+1))->yrar<<std::endl;
13.模板類 vector類(動(dòng)態(tài)數(shù)組) :應(yīng)用是加頭文件#include <vector>;
using spacename std;? ? vector<int>? vi(n); //名為vi的vector對(duì)象,可存儲(chǔ)n個(gè)int類型的元素,n可為整型常量,也可為整型變量
14.模板類array類? (C++11)應(yīng)用是加頭文件#include <array>; 與數(shù)組一樣,array對(duì)象長(zhǎng)度固定。
using spacename std;? ? array<int,5>? ai; //名為ai的array對(duì)象,可存儲(chǔ)n個(gè)int類型的元素,n為整型常量.,這里n=5;
15. 數(shù)組、array對(duì)象、vector對(duì)象都可以用標(biāo)準(zhǔn)數(shù)組表示法來(lái)訪問(wèn)每個(gè)元素。
array對(duì)象可以直接賦值給另一個(gè)array對(duì)象,而對(duì)于數(shù)組,必須逐元素復(fù)制數(shù)據(jù)。
array對(duì)象和數(shù)組存儲(chǔ)在相同的內(nèi)存區(qū)域(即棧)中; vector對(duì)象存儲(chǔ)在另一個(gè)區(qū)域(自由存儲(chǔ)區(qū)或堆)中。
————————————————
版權(quán)聲明:本文為CSDN博主「lvliang2229」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lvliang2017232003/article/details/85341687