溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

c++指針怎么初始化

發(fā)布時(shí)間:2022-02-23 13:43:26 來(lái)源:億速云 閱讀:625 作者:iii 欄目:web開(kāi)發(fā)

這篇文章主要介紹“c++指針怎么初始化”,在日常操作中,相信很多人在c++指針怎么初始化問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”c++指針怎么初始化”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

c++指針全攻略

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++;

c++指針怎么初始化

      指針變量 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í)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

c++
AI