自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C/C++中的指針的應用及注意問題

開發(fā) 后端
c語言之所以強大,以及其自由性,很大部分體現(xiàn)在其靈活的指針運用上。因此,說指針是C/C++的靈魂一點也不為過。下面讓我們一起來揭開C/C++中指針的神秘面紗。

指針c/c++學習一個比較讓人頭痛的問題,在程序設計過程中,指針也往往是產(chǎn)生隱含bug的原因。下面就來談談指針的應用以及需要注意的一些問題,里面也許就有你平時沒有注意到的問題,希望能幫助各位讀者理解好指針。

一、我們先來回憶一下指針的概念吧,方便下面的介紹

指針是存放地址值的變量或者常量。例如:int a=1;&a就表示指針常量(“&”表示取地址運算符,也即引用)。int *b,b表示的是指針變量(注意,是b表示指針變量而不是*b),*表示要說明的是指針變量。大家注意int *b[2]和int(*b)[2]是不同的,int *b表示一個指針數(shù)組,而int (*b)[2]表示含有兩個元素的int指針,這里要注意運算優(yōu)先級問題,有助于理解指針問題。在這里大概介紹基本概念就夠了,至于具體使用方法,如賦值等,很多書都有介紹,我就不多說了。

二、應用以及注意的問題

1、 理解指針的關(guān)鍵所在——對指針類型和指針所指向的類型的理解

①、 指針類型:可以把指針名字去掉,剩下的就是這個指針

例如:int *a;//指針類型為int *

int **a;//指針類型為int **

int *(*a)[8];//指針類型為 int *(*)[8]

②、 指針所指向的類型:是指編譯器將把那一片內(nèi)存所看待成的類型。這里只要把指針聲明語句中的指針名字和名字右邊的“*”號去掉就可以了,剩下的就是指針所指向的類型。我之所以把他們放在***位,是因為弄清楚他們是學c/c++指針的重點,正確理解他們才能使你打好c/c++的編程基礎。

2、 指針的應用——傳遞參數(shù)。

其實它可以相當于隱式的返回值,這就比return的方法更加靈活了,可以返回更多的值,看看下面的例子自然就明白了:

 

  1. #include "iostream.h"  
  2. void example(int *a1,int &b1,int c1)  
  3. {  
  4. *a1*=3;  
  5. ++b1;  
  6. ++c1;  
  7. }  
  8. void main()  
  9. {  
  10. int *a;  
  11. int b,c;  
  12. *a=6;  
  13. b=7;c=10;  
  14. example(a,b,c);  
  15. cout 《"*a="《*a<  
  16. cout 《"b="<  
  17. cout 《"c="<  

 輸出:*a=18

b=8

c=10

注意到?jīng)]有,*a和b的值都改變了,而c沒有變。這是由于a1是指向*a(=6)的指針,也即與a是指向同一個地址,所以當a1指向的值改變了,*a的值也就改變了。在函數(shù)中的參數(shù)使用了引用(int &b1),b1是b的別名,也可以把它當作特殊的指針來理解,所以b的值會改變。函數(shù)中的參數(shù)int c1只是在函數(shù)中起作用,當函數(shù)結(jié)束時候便消失了,所以在main()中不起作用。

3、 關(guān)于全局變量和局部變量的一個問題

先看看程序:

 

  1. #include “iostream.h”  
  2. int a=5;  
  3. int *example1(int b)  
  4. {  
  5. a+=b;  
  6. return &a;  
  7. }  
  8. int *example2(int b)  
  9. {  
  10. int c=5;  
  11. b+=c;  
  12. return &b;  
  13. }  
  14. void main()  
  15. {  
  16. int *a1=example1(10);  
  17. int *b1=example2(10);  
  18. cout 《”a1=”《*a1<  
  19. cout 《”b1=”《*b1<  

 輸出結(jié)果:

a1=15

b1=4135

*b1怎么會是4135,而不是15呢?是程序的問題?沒錯吧?由于a是全局變量,存放在全局變量的內(nèi)存區(qū),它一直是存在的;而局部變量則是存在于函數(shù)的棧區(qū),當函數(shù)example2調(diào)用結(jié)束后便消失,是b指向了一個不確定的區(qū)域,產(chǎn)生指針懸掛。

下面是對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;恢復棧,出棧

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];問題就出在這里

mov sp,bp

pop bp;恢復棧,出棧

ret;退出函數(shù)

對比之后看出來了吧?ax應該是存儲的是結(jié)果的地址。而在example2中,返回的卻是[bp+04]的內(nèi)容,因此指針指向了一個不確定的地方,由此產(chǎn)生的指針懸掛。example1中,ax返回了正確的結(jié)果的地址。

4、 內(nèi)存問題:使用指針注意內(nèi)存的分配和邊界

使用指針過程中應該給變量一個適當?shù)目臻g,以免產(chǎn)生不可見的錯誤。

請看以下代碼:

 

  1. #include “iostream.h”  
  2. void main()  
  3. {  
  4. char *a1;  
  5. char *a2;  
  6. cin 》a1;  
  7. cin 》a2;  
  8. cout 《”a1=”<  
  9. cout 《”a2=”<  
  10. }  

 輸入:abc

123

輸出:

a1=123

a2=

Null pointer assignment

指針指向了“空”。解決辦法就是分配適當?shù)膬?nèi)存給這兩個字符串。修正后的代碼

如下:

 

  1. #include “iostream.h”  
  2. void main()  
  3. {  
  4. char *a1;  
  5. char *a2;  
  6. a1=new char [10];  
  7. a2=new char [10];  
  8. cin 》a1;  
  9. cin 》a2;  
  10. cout 《”a1=”<  
  11. cout 《”a2=”<  
  12. delete(a1);//注意,別忘了要釋放內(nèi)存空間  
  13. delete(a2);  
  14. }  

 到此就能輸出正確的結(jié)果了。分配了適當?shù)膬?nèi)存之后要注意釋放內(nèi)參空間,同時還應該注意不要超出所分配的內(nèi)存的大小,否則會有溢出現(xiàn)象產(chǎn)生,導致不可預料的結(jié)果。

5、 關(guān)于特殊的指針——引用

引用有時候應用起來要比指針要靈活,用它做返回的時候是不產(chǎn)生任何變量的副本的這樣減小了內(nèi)存的占用,提高執(zhí)行的速度。引用使用起來要比指針好理解,比較直觀。當引用作為參數(shù)時,不會改變參數(shù)的地址,因此可以作為左值。

下面請看一個例子:

 

  1. #include “iostream.h”  
  2. char ch[5]=”ABCD”;  
  3. char &example(int b)  
  4. {  
  5. return ch;  
  6. }  
  7. void main()  
  8. {  
  9. cout 《”ch=”<  
  10. example(2)=”c”;  
  11. cout《”ch=”<  

 輸出結(jié)果:

ch=ABCD

ch=ABcD

在實際編程過程中,可以靈活地引用或指針,盡量提高程序的可讀性和執(zhí)行效率。

三、小結(jié):

指針是學習c/c++的重點難點,主要原因是指針較為抽象,不容易理解。使用指針千萬要明白讓指針指向什么地方,如何讓指針指向正確的地方。在深入系統(tǒng)底層之中需要應用到大量的指針,因此需要理解好指針的基本概念,例如:指針類型和指針所指向的類型。平時應該對留心觀察,了解程序的工作過程,必要時候可以對程序進行反匯編,加深對指針的理解,這種方法同樣適合學別的編程方面的知識。

指針的應用是很廣泛的,利用指針可以做很多事情,要成為一個好的程序員,必須對指針有比較深刻的了解。希望通過本文讓大家對指針有更深一層的了解,提高指針的應用能力,相信能給大家一定的幫助。

【編輯推薦】

  1. 22.8 函數(shù)類型和函數(shù)指針類型
  2. 9.8.1 理解指向指針的指針
  3. 9.4.3 用指針操作數(shù)組元素
  4. C++函數(shù)對象與函數(shù)指針不同之處
責任編輯:于鐵 來源: 中國IT實驗室
相關(guān)推薦

2011-04-11 11:09:50

this指針

2011-04-19 16:38:00

對象指針指針C++

2011-04-19 09:19:09

C++指針

2024-01-09 09:23:12

指針C++

2023-12-20 12:40:51

C++RAII編程

2011-07-12 13:01:00

CC++

2024-05-15 16:01:04

C++編程開發(fā)

2014-01-24 09:49:01

C++指針

2010-02-04 09:33:08

C++指針重載

2015-05-13 10:37:58

C++指針與引用

2010-12-17 10:07:59

2023-09-13 14:42:08

typedefC++

2021-12-21 15:31:10

C++語言指針

2023-12-26 12:13:31

野指針C++編程

2024-01-25 11:42:00

C++編程指針常量

2011-07-15 01:38:56

C++this指針

2010-01-21 09:34:57

C++語法

2010-01-27 16:05:06

C++堆棧

2010-01-21 14:07:14

CC++聲明

2010-02-05 14:36:20

C++智能指針
點贊
收藏

51CTO技術(shù)棧公眾號