溫馨提示×

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

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

C++中指針的使用方法

發(fā)布時(shí)間:2021-07-21 11:14:06 來(lái)源:億速云 閱讀:132 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“C++中指針的使用方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C++中指針的使用方法”吧!

C++編程中使用指針能有速度快,節(jié)約內(nèi)存等優(yōu)點(diǎn),是很多C++程序員的***。但指針是一把雙刃劍,用好了它,你就會(huì)發(fā)現(xiàn)指針有多么的方便,反之,你可能就頭疼了,往往會(huì)出現(xiàn)意想不到的問(wèn)題。

一.什么是指針:

其實(shí)指針就像是其它變量一樣,所不同的是一般的變量包含的是實(shí)際的真實(shí)的數(shù)據(jù),而指針只是一個(gè)指示器,它告訴程序在內(nèi)存的哪塊區(qū)域可以找到數(shù)據(jù)。

這是一個(gè)非常重要的概念,有很多程序和算法都是圍繞指針設(shè)計(jì)的,如鏈表、遍歷等。

指針是一個(gè)數(shù)據(jù)類型,本身也需要占用四個(gè)字節(jié)的存儲(chǔ)空間。所以用sizeof(void*)獲得的值為4。

二.指針的定義

看如下的例子:

int *pNumber;

這樣就定義了int類型的指針。

指針變量名稱以p為首字符,這是程序員通常在定義指針時(shí)的一個(gè)習(xí)慣,以提高便程序的閱讀性,表示這是個(gè)指針。另外,雖然int* pNumber和int *pNumber是相同的,但是使用后一種的編程風(fēng)格更好一些。比如:

int *pNumber1,*pNumber2;

表示定義兩個(gè)指針,*號(hào)和變量靠近;反之,我們可能會(huì)定義成int* pNumber1,pNumber2,這將是一個(gè)錯(cuò)誤的定義,pNumber2就不是指針了。

三.指針的優(yōu)點(diǎn)

a.為函數(shù)提供修改調(diào)用變?cè)氖侄危?/p>

b.支持C++動(dòng)態(tài)分配子程序

c.可以改善某些子程序的效率

d.為動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)(如二叉樹(shù)、鏈表)提供支持

四、指針賦值及轉(zhuǎn)換:

a.同類型直接賦值,異類型要進(jìn)行轉(zhuǎn)換。

b.強(qiáng)制轉(zhuǎn)換:可以把表達(dá)式結(jié)果硬性轉(zhuǎn)換為指定類型

c.char * p;(int *)p 把p強(qiáng)制轉(zhuǎn)換為int型,記住轉(zhuǎn)換過(guò)程中要注意兩個(gè)類型的大小,大轉(zhuǎn)小時(shí)可能會(huì)有數(shù)據(jù)丟失(如int到double)

d.涉及void *的:

c 中void *類型可賦值給任何類型的指針,反之亦然

c++ 中都需要強(qiáng)制轉(zhuǎn)換

void * 可看作無(wú)窮大能接納任何類型賦值,反之不行int * p =9;void * t= p(正確);p=t(錯(cuò)誤)

e.不涉及void *的都要強(qiáng)制轉(zhuǎn)換

五.指針和數(shù)組

不帶下標(biāo)的數(shù)組名返回?cái)?shù)組的起始地址,即數(shù)組首元素的地址,所以對(duì)數(shù)組的訪問(wèn)可有兩種方式:數(shù)組下標(biāo)和指針?biāo)阈g(shù)。例如:

char* pChar;  char chs[100];  pChar = chs;

這樣pChar就指向chs數(shù)組的首地址。

六.?dāng)?shù)組與引用

a.引用只是變量的別名,而不是指向變量的指針(區(qū)別于取址運(yùn)算符"&")不占內(nèi)存空間,對(duì)變量引用的改變其相應(yīng)的變量也會(huì)改變。

b.不能對(duì)引用使用指針間接運(yùn)算符“*”進(jìn)行復(fù)引用操作

c.引用必須在聲明時(shí)初始化 int &c = count;(c是count的別名)

七.指針空間的動(dòng)態(tài)分配與回收

動(dòng)態(tài)分配是指針的關(guān)鍵技術(shù)。它是用來(lái)在不必定義變量的情況下分配內(nèi)存和讓指針去指向它們。分配了內(nèi)存,別忘了回收。你動(dòng)態(tài)地分配了一個(gè)內(nèi)存空間,可它絕不會(huì)被自動(dòng)刪除。

也就是說(shuō),這塊內(nèi)存空間會(huì)一直存在,直到你告訴電腦你已經(jīng)使用完了??山Y(jié)果是,你并沒(méi)有告訴電腦你已不再需要這塊內(nèi)存空間了,所以它會(huì)繼續(xù)占據(jù)著內(nèi)存空間造成浪費(fèi),甚至你的程序運(yùn)行完畢,其它程序運(yùn)行時(shí)它還存在。當(dāng)這樣的問(wèn)題積累到一定程度,最終將導(dǎo)致系統(tǒng)崩潰。所以這是很重要的,在你用完它以后,請(qǐng)釋放它的空間。

八.實(shí)際使用指針時(shí),容易出現(xiàn)的錯(cuò)誤

筆者歸納出指針錯(cuò)誤的原因有以下幾點(diǎn)(個(gè)人經(jīng)驗(yàn),歡迎大家補(bǔ)充):

1.指針未初始化。

指針的初始化,不是指指針的定義,而是指針變量存儲(chǔ)的數(shù)值是個(gè)無(wú)效的數(shù)值。比如定義float a;這個(gè)a會(huì)分配一個(gè)地址,但初始值是一個(gè)亂七八糟的數(shù)據(jù)。同樣,float *a;也會(huì)為a分配一個(gè)地址,初始值也是亂七八糟的數(shù)據(jù)。初始化可以將a = NULL,這樣在以后的程序中可以增加if(a == NULL)來(lái)判斷指針是否有效,否則不行。或者為指針?lè)峙浠蛘咧付臻g。如

float *a = new float;  或者  float b;   float *a = &b;

都可以為指針指向一塊內(nèi)存以實(shí)現(xiàn)初始化。

2.指針越界

指針越界是個(gè)比較難以捕捉的錯(cuò)誤。如果測(cè)試不全面,不容易被發(fā)現(xiàn)。對(duì)于為指針?lè)峙涞目臻g大小,程序員一定要時(shí)刻注意。

3.指向局部變量的指針

指針是記錄某塊內(nèi)存起始地址的變量,要使指針有效,則必須確保這塊內(nèi)存有效。用new分配的內(nèi)存空間,只要不delete,則一直有效。但是對(duì)于指向某個(gè)變量地址的指針,程序員必須清楚該變量的作用域。如果離開(kāi)了變量的作用域,該變量的內(nèi)存空間就會(huì)被系統(tǒng)自動(dòng)回收,再使用指針時(shí),將會(huì)發(fā)生錯(cuò)誤。這是程序中最容易出現(xiàn)的錯(cuò)誤。

4.指針指向的轉(zhuǎn)移

有些初涉C++的程序員,常常會(huì)寫出這樣的程序:

char *pChar = new char;  char chs;  pChar = &chs;  delete pChar;

他們的目的是想將chs內(nèi)容傳遞給pChar指針指向的內(nèi)存。但這樣寫,將會(huì)使pChar先前指向的空間編程垃圾地址,因?yàn)榈刂窡o(wú)法再獲取了。俗稱野指針。將會(huì)導(dǎo)致內(nèi)存泄漏。而且,在調(diào)用delete pChar時(shí),也會(huì)發(fā)生異常錯(cuò)誤。因?yàn)椴皇莕ew的空間是不能使用delete刪除的。因?yàn)閜Char已經(jīng)轉(zhuǎn)到指向chs這個(gè)變量的地址了。

指針的藝術(shù)遠(yuǎn)不止這些,留待我們的愛(ài)好者進(jìn)行深入的探討。指針給我們的程序帶來(lái)了太多的方便,同樣,它也有很多難以控制的問(wèn)題。如何更好的駕馭指針,可以說(shuō)是C++程序員提高自己的一個(gè)手段。

到此,相信大家對(duì)“C++中指針的使用方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向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