新聞中心
指針是c/c++學(xué)習(xí)一個(gè)比較讓人頭痛的問(wèn)題,在程序設(shè)計(jì)過(guò)程中,指針也往往是產(chǎn)生隱含bug的原因。下面就來(lái)談?wù)勚羔樀膽?yīng)用以及需要注意的一些問(wèn)題,里面也許就有你平時(shí)沒(méi)有注意到的問(wèn)題,希望能幫助各位讀者理解好指針。

一、我們先來(lái)回憶一下指針的概念吧,方便下面的介紹
指針是存放地址值的變量或者常量。例如:int a=1;&a就表示指針常量(“&”表示取地址運(yùn)算符,也即引用)。int *b,b表示的是指針變量(注意,是b表示指針變量而不是*b),*表示要說(shuō)明的是指針變量。大家注意int *b[2]和int(*b)[2]是不同的,int *b表示一個(gè)指針數(shù)組,而int (*b)[2]表示含有兩個(gè)元素的int指針,這里要注意運(yùn)算優(yōu)先級(jí)問(wèn)題,有助于理解指針問(wèn)題。在這里大概介紹基本概念就夠了,至于具體使用方法,如賦值等,很多書(shū)都有介紹,我就不多說(shuō)了。
二、應(yīng)用以及注意的問(wèn)題
1、 理解指針的關(guān)鍵所在——對(duì)指針類(lèi)型和指針?biāo)赶虻念?lèi)型的理解
①、 指針類(lèi)型:可以把指針名字去掉,剩下的就是這個(gè)指針
例如:int *a;//指針類(lèi)型為int *
int **a;//指針類(lèi)型為int **
int *(*a)[8];//指針類(lèi)型為 int *(*)[8]
②、 指針?biāo)赶虻念?lèi)型:是指編譯器將把那一片內(nèi)存所看待成的類(lèi)型。這里只要把指針聲明語(yǔ)句中的指針名字和名字右邊的“*”號(hào)去掉就可以了,剩下的就是指針?biāo)赶虻念?lèi)型。我之所以把他們放在***位,是因?yàn)榕宄麄兪菍W(xué)c/c++指針的重點(diǎn),正確理解他們才能使你打好c/c++的編程基礎(chǔ)。
2、 指針的應(yīng)用——傳遞參數(shù)。
其實(shí)它可以相當(dāng)于隱式的返回值,這就比return的方法更加靈活了,可以返回更多的值,看看下面的例子自然就明白了:
- #include "iostream.h"
- void example(int *a1,int &b1,int c1)
- {
- *a1*=3;
- ++b1;
- ++c1;
- }
- void main()
- {
- int *a;
- int b,c;
- *a=6;
- b=7;c=10;
- example(a,b,c);
- cout 《"*a="《*a<
- cout 《"b="<
- cout 《"c="<
- }
輸出:*a=18
b=8
c=10
注意到?jīng)]有,*a和b的值都改變了,而c沒(méi)有變。這是由于a1是指向*a(=6)的指針,也即與a是指向同一個(gè)地址,所以當(dāng)a1指向的值改變了,*a的值也就改變了。在函數(shù)中的參數(shù)使用了引用(int &b1),b1是b的別名,也可以把它當(dāng)作特殊的指針來(lái)理解,所以b的值會(huì)改變。函數(shù)中的參數(shù)int c1只是在函數(shù)中起作用,當(dāng)函數(shù)結(jié)束時(shí)候便消失了,所以在main()中不起作用。
3、 關(guān)于全局變量和局部變量的一個(gè)問(wèn)題
先看看程序:
- #include “iostream.h”
- int a=5;
- int *example1(int b)
- {
- a+=b;
- return &a;
- }
- int *example2(int b)
- {
- int c=5;
- b+=c;
- return &b;
- }
- void main()
- {
- int *a1=example1(10);
- int *b1=example2(10);
- cout 《”a1=”《*a1<
- cout 《”b1=”《*b1<
- }
輸出結(jié)果:
a1=15
b1=4135
*b1怎么會(huì)是4135,而不是15呢?是程序的問(wèn)題?沒(méi)錯(cuò)吧?由于a是全局變量,存放在全局變量的內(nèi)存區(qū),它一直是存在的;而局部變量則是存在于函數(shù)的棧區(qū),當(dāng)函數(shù)example2調(diào)用結(jié)束后便消失,是b指向了一個(gè)不確定的區(qū)域,產(chǎn)生指針懸掛。
下面是對(duì)example1和example2的反匯編(用TC++ 3.0編譯):
example1:
push bp;入棧
mov bp,sp
mov ax,[bp+04];傳遞參數(shù)
add [00AA],ax;相加
mov ax,00AA ;返回了結(jié)果所在的地址
pop bp;恢復(fù)棧,出棧
ret;退出函數(shù)
example2:
push bp;入棧
mov bp,sp
sub sp,02
mov word ptr [bp-02],0005
mov ax,[bp-02];傳遞參數(shù)
add [bp+04],ax;相加
lea ax,[bp+04];問(wèn)題就出在這里
mov sp,bp
pop bp;恢復(fù)棧,出棧
ret;退出函數(shù)
對(duì)比之后看出來(lái)了吧?ax應(yīng)該是存儲(chǔ)的是結(jié)果的地址。而在example2中,返回的卻是[bp+04]的內(nèi)容,因此指針指向了一個(gè)不確定的地方,由此產(chǎn)生的指針懸掛。example1中,ax返回了正確的結(jié)果的地址。
4、 內(nèi)存問(wèn)題:使用指針注意內(nèi)存的分配和邊界
使用指針過(guò)程中應(yīng)該給變量一個(gè)適當(dāng)?shù)目臻g,以免產(chǎn)生不可見(jiàn)的錯(cuò)誤。
請(qǐng)看以下代碼:
- #include “iostream.h”
- void main()
- {
- char *a1;
- char *a2;
- cin 》a1;
- cin 》a2;
- cout 《”a1=”<
- cout 《”a2=”<
- }
輸入:abc
123
輸出:
a1=123
a2=
Null pointer assignment
指針指向了“空”。解決辦法就是分配適當(dāng)?shù)膬?nèi)存給這兩個(gè)字符串。修正后的代碼
如下:
- #include “iostream.h”
- void main()
- {
- char *a1;
- char *a2;
- a1=new char [10];
- a2=new char [10];
- cin 》a1;
- cin 》a2;
- cout 《”a1=”<
- cout 《”a2=”<
- delete(a1);//注意,別忘了要釋放內(nèi)存空間
- delete(a2);
- }
到此就能輸出正確的結(jié)果了。分配了適當(dāng)?shù)膬?nèi)存之后要注意釋放內(nèi)參空間,同時(shí)還應(yīng)該注意不要超出所分配的內(nèi)存的大小,否則會(huì)有溢出現(xiàn)象產(chǎn)生,導(dǎo)致不可預(yù)料的結(jié)果。
5、 關(guān)于特殊的指針——引用
引用有時(shí)候應(yīng)用起來(lái)要比指針要靈活,用它做返回的時(shí)候是不產(chǎn)生任何變量的副本的這樣減小了內(nèi)存的占用,提高執(zhí)行的速度。引用使用起來(lái)要比指針好理解,比較直觀。當(dāng)引用作為參數(shù)時(shí),不會(huì)改變參數(shù)的地址,因此可以作為左值。
下面請(qǐng)看一個(gè)例子:
- #include “iostream.h”
- char ch[5]=”ABCD”;
- char &example(int b)
- {
- return ch;
- }
- void main()
- {
- cout 《”ch=”<
- example(2)=”c”;
- cout《”ch=”<
- }
輸出結(jié)果:
ch=ABCD
ch=ABcD
在實(shí)際編程過(guò)程中,可以靈活地引用或指針,盡量提高程序的可讀性和執(zhí)行效率。
三、小結(jié):
指針是學(xué)習(xí)c/c++的重點(diǎn)難點(diǎn),主要原因是指針較為抽象,不容易理解。使用指針千萬(wàn)要明白讓指針指向什么地方,如何讓指針指向正確的地方。在深入系統(tǒng)底層之中需要應(yīng)用到大量的指針,因此需要理解好指針的基本概念,例如:指針類(lèi)型和指針?biāo)赶虻念?lèi)型。平時(shí)應(yīng)該對(duì)留心觀察,了解程序的工作過(guò)程,必要時(shí)候可以對(duì)程序進(jìn)行反匯編,加深對(duì)指針的理解,這種方法同樣適合學(xué)別的編程方面的知識(shí)。
指針的應(yīng)用是很廣泛的,利用指針可以做很多事情,要成為一個(gè)好的程序員,必須對(duì)指針有比較深刻的了解。希望通過(guò)本文讓大家對(duì)指針有更深一層的了解,提高指針的應(yīng)用能力,相信能給大家一定的幫助。
新聞名稱(chēng):C/C++中的指針的應(yīng)用及注意問(wèn)題
分享路徑:http://www.dlmjj.cn/article/dpgjdoc.html


咨詢
建站咨詢
