亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺析c/c++中的指針

2019-11-17 05:07:26
字體:
來源:轉載
供稿:網友

  在學習c/c+過程中,指針是一個比較讓人頭痛的問題,稍微不注重將會是程序編譯無法通過,甚至造成死機。在程序設計過程中,指針也往往是產生隱含bug的原因。下面就來談談指針的應用以及需要注重的一些問題,里面也許就有你平時沒有注重到的問題,希望能幫助各位讀者理解好指針。


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

  指針是存放地址值的變量或者常量。例如:int a=1;&a就表示指針常量(“&”表示取地址運算符,也即引用)。int *b,b表示的是指針變量(注重,是b表示指針變量而不是*b),*表示要說明的是指針變量。大家注重int *b[2]和int(*b)[2]是不同的,int *b表示一個指針數組,而int (*b)[2]表示含有兩個元素的int指針,這里要注重運算優先級問題,有助于理解指針問題。

  在這里大概介紹基本概念就夠了,至于具體使用方法,如賦值等,很多書都有介紹,我就不多說了。

  二、應用以及注重的問題

  1、 理解指針的要害所在——對指針類型和指針所指向的類型的理解

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

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

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

int *(*a)[8];//指針類型為 int *(*)[8]
 ?、?、 指針所指向的類型:是指編譯器將把那一片內存所看待成的類型。這里只要把指針聲明語句中的指針名字和名字右邊的“*”號去掉就可以了,剩下的就是指針所指向的類型。

  我之所以把他們放在第一位,是因為弄清楚他們是學c/c++指針的重點,正確理解他們才能使你打好c/c++的編程基礎。

  2、 指針的應用——傳遞參數。

  其實它可以相當于隱式的返回值,這就比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
  注重到沒有,*a和b的值都改變了,而c沒有變。這是由于a1是指向*a(=6)的指針,也即與a是指向同一個地址,所以當a1指向的值改變了,*a的值也就改變了。在函數中的參數使用了引用(int &b1),b1是b的別名,也可以把它當作非凡的指針來理解,所以b的值會改變。函數中的參數int c1只是在函數中起作用,當函數結束時候便消失了,所以在main()中不起作用。

  3、 關于全局變量和局部變量的一個問題

  先不廢話了,先看看程序:

#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<
}

輸出結果:

a1=15

b1=4135
  *b1怎么會是4135,而不是15呢?是程序的問題?沒錯吧?

  由于a是全局變量,存放在全局變量的內存區,它一直是存在的;而局部變量則是存在于函數的棧區,當函數example2()調用結束后便消失,是b指向了一個不確定的區域,產生指針懸掛。

  下面是對example1()和example2()的反匯編(用TC++ 3.0編譯):

example1():

push bp;入棧

mov bp,sp

mov ax,[bp+04];傳遞參數

add [00AA],ax;相加

mov ax,00AA ;返回了結果所在的地址

.


.

.

pop bp;恢復棧,出棧

ret;退出函數


example2():

push bp;入棧

mov bp,sp

sub sp,02

mov Word ptr [bp-02],0005

mov ax,[bp-02];傳遞參數

add [bp+04],ax;相加

lea ax,[bp+04];問題就出在這里

.

.

.

mov sp,bp

pop bp;恢復棧,出棧

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

  4、 內存問題:使用指針注重內存的分配和邊界。

  使用指針過程中應該給變量一個適當的空間,以免產生不可見的錯誤。

  請看以下代碼:

#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
  指針指向了“空”。解決辦法就是分配適當的內存給這兩個字符串。修正后的代碼如下:

#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);注重,別忘了要釋放內存空間

delete(a2);

}
  到此就能輸出正確的結果了。

  分配了適當的內存之后要注重釋放內參空間,同時還應該注重不要超出所分配的內存的大小,否則會有溢出現象產生,導致不可預料的結果。

   5、 關于非凡的指針——引用

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

  下面請看一個例子:

#include “iostream.h”

char ch[5]=”ABCD”;

char &example(int b)

{

return ch;

}

void main()

{

cout <<”ch=”<
example(2)=”c”;

cout<<”ch=”<
}

輸出結果:

ch=ABCD

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

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

  四、結束:

  指針的應用是很廣泛的,利用指針可以做很多事情,要成為一個好的程序員,必須對指針有比較深刻的了解。寫本文的目的在于讓大家對指針有更深一層的了解,提高指針的應用能力,內容大都是我在實際編程中碰到的問題。相信能給大家一定的幫助。




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美另类自拍| 亚洲在线视频福利| 国产精品成人va在线观看| 中文字幕亚洲国产| 日韩在线免费视频观看| 亚洲精品久久在线| 欧美日韩亚洲天堂| 成人h视频在线观看播放| 欧美日韩国产精品一区二区不卡中文| 91精品久久久久久久久久久久久久| 一区二区欧美在线| 亚洲视频在线视频| 91精品免费视频| 久久久久久噜噜噜久久久精品| 亚洲视频电影图片偷拍一区| 久热精品视频在线观看一区| 久久福利视频导航| 日韩精品中文字幕在线观看| 国产精品综合不卡av| 久久精品国产清自在天天线| 亚洲一级黄色av| 久久精品久久久久| 久久亚洲精品小早川怜子66| 日韩在线资源网| 欧美日韩国产一区中文午夜| 久久久成人av| 国产精品丝袜久久久久久高清| 欧美国产日韩xxxxx| 久久久久久亚洲精品中文字幕| 亚洲美女又黄又爽在线观看| 精品国产999| 久久久99久久精品女同性| 欧美性视频精品| 精品久久久久久中文字幕| 欧美日韩国产va另类| 日本精品va在线观看| 亚洲人成免费电影| 国产美女91呻吟求| 欧美日韩免费在线| 97不卡在线视频| 欧美激情xxxx性bbbb| 国产精品免费看久久久香蕉| 国产黑人绿帽在线第一区| 亚洲女人天堂成人av在线| 免费99精品国产自在在线| 国产精品入口日韩视频大尺度| 日韩精品www| 日韩电影免费观看在线| 中文字幕日韩欧美在线视频| 日韩欧美在线中文字幕| 日韩欧美黄色动漫| 中日韩午夜理伦电影免费| 亚洲一区二区国产| 97精品国产97久久久久久| 精品久久久久久中文字幕大豆网| 日韩精品视频在线播放| 国模吧一区二区| 成人性生交大片免费看视频直播| 国产精品国产福利国产秒拍| 成人www视频在线观看| 欧美亚洲国产视频小说| 深夜福利日韩在线看| 欧美视频在线免费| 国产91精品高潮白浆喷水| 欧美理论在线观看| 国外色69视频在线观看| 欧美视频专区一二在线观看| 日韩av最新在线观看| 国产精品久久电影观看| 久久人人爽人人爽人人片av高请| 最好看的2019年中文视频| 亚洲综合色av| 亚洲欧美在线免费观看| 国产精品久久9| 一夜七次郎国产精品亚洲| 欧美黄色免费网站| 狠狠操狠狠色综合网| 亚洲午夜色婷婷在线| 国产在线播放不卡| 国产成人91久久精品| 久久天天躁狠狠躁夜夜躁| 亚洲午夜国产成人av电影男同| 亚洲天堂av高清| 欧美精品在线网站| 欧美大胆a视频| 亚洲人成电影网站色www| 97在线观看视频国产| 91精品国产综合久久男男| 91av在线国产| 亚洲一区二区久久久| 久久国产精品电影| 亚洲国产私拍精品国模在线观看| 久久亚洲精品视频| 欧美大片欧美激情性色a∨久久| 成人黄色在线播放| 日韩av综合网| 亚洲福利影片在线| 欧美成人h版在线观看| 欧美午夜丰满在线18影院| 欧美日韩亚洲网| 亚洲国产精品热久久| 亚洲国产精品美女| zzijzzij亚洲日本成熟少妇| 久久免费视频这里只有精品| 日韩精品在线免费观看| 成人性生交大片免费看视频直播| 亚洲精品电影久久久| 国产成人高潮免费观看精品| 91免费综合在线| 深夜福利91大全| 亚洲福利视频免费观看| 日韩精品亚洲精品| 在线精品91av| www国产精品com| 国产精品久久久久久久久影视| 久久久精品国产网站| 日韩免费在线电影| 欧美一区二区三区精品电影| 狠狠躁夜夜躁人人爽超碰91| 91av在线国产| 成人美女免费网站视频| 国产精品mp4| 亚洲精品免费在线视频| 欧美乱妇高清无乱码| 中文亚洲视频在线| 国产精品电影网站| 亚洲男子天堂网| 成人免费在线网址| 亚洲图片在线综合| 亚洲国产欧美一区二区丝袜黑人| 欧美性猛交xxxx乱大交3| 亚洲人精选亚洲人成在线| 亚洲国产精品免费| 成人做爽爽免费视频| 久久精品国产久精国产一老狼| 久久久精品电影| 国产网站欧美日韩免费精品在线观看| 久久亚洲国产成人| 国产精品一区电影| 日韩视频在线免费观看| 亚洲国产精品久久久久秋霞蜜臀| 亚洲黄页视频免费观看| 成人欧美一区二区三区黑人孕妇| 色琪琪综合男人的天堂aⅴ视频| 亚洲精品成人久久电影| 情事1991在线| 91a在线视频| 久久久精品国产亚洲| 国产精品青草久久久久福利99| 亚洲综合av影视| 成人av番号网| 午夜精品美女自拍福到在线| 久久好看免费视频| 午夜精品久久久99热福利| 国产ts一区二区| 中文字幕欧美精品在线| 亚洲人成电影网站色xx| 成人黄色av网| 亚洲第一av网| 欧美亚洲第一区| 久久视频在线免费观看| 91免费精品国偷自产在线| 日韩av在线网站| 国产成人一区二区|