青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  C++博客 :: 首頁(yè) :: 聯(lián)系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用鏈接

留言簿(48)

我參與的團(tuán)隊(duì)

搜索

  •  

積分與排名

  • 積分 - 401642
  • 排名 - 59

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

一、 數(shù)組的指針、指針數(shù)組以及指向指針的指針

  考慮數(shù)組的指針的時(shí)候我們要同時(shí)考慮類型和維數(shù)這兩個(gè)屬性。換一句話,就是說(shuō)一個(gè)數(shù)組排除在其中存儲(chǔ)的數(shù)值,那么可以用類型和維數(shù)來(lái)位置表示他的種類。

A)一維數(shù)組
  在c和c++中數(shù)組的指針就是數(shù)組的起始地址(也就第一個(gè)元素的地址),而且標(biāo)準(zhǔn)文檔規(guī)定數(shù)組名代表數(shù)組的地址(這是地址數(shù)值層面的數(shù)組表示)。例如:

1int a[10];
2int *p;

p=&a[0]//和p=a是等價(jià)的:

因?yàn)閍是數(shù)組名,所以他是該數(shù)組的地址,同時(shí)因?yàn)榈谝粋€(gè)元素為a[0],那么&a[0]也代表了該數(shù)組的地址。但是我們是不是就說(shuō)一個(gè)數(shù)組名和 該數(shù)組的第一個(gè)元素的&運(yùn)算是一回事呢?在一維的時(shí)候當(dāng)時(shí)是的,但是在高維的時(shí)候,我們要考慮到維數(shù)給數(shù)組帶來(lái)的影響。
  a[10]是 一個(gè)數(shù)組,a是數(shù)組名,它是一個(gè)包含10個(gè)int類型的數(shù)組類型,不是一般的指針變量噢!(雖然標(biāo)準(zhǔn)文檔規(guī)定在c++中從int[]到int*直接轉(zhuǎn)換是 可以的,在使用的時(shí)候似乎在函數(shù)的參數(shù)為指針的時(shí)候,我們將該數(shù)組名賦值沒(méi)有任何異樣),a代表數(shù)組的首地址,在數(shù)字層面和a[10]的地址一樣。這樣我 們就可以使用指針變量以及a來(lái)操作這個(gè)數(shù)組了。
所以我們要注意以下問(wèn)題:

(1) p[i]和a[i]都是代表該數(shù)組的第i+1個(gè)元素;
(2) p+i和a+i代表了第i+1個(gè)元素的地址,所以我們也可以使用 *(p+I)和*(a+I)來(lái)引用對(duì)象元素;
(3)p+1不是對(duì)于指針數(shù)量上加一,而是表示從當(dāng)前的位置跳過(guò)當(dāng)前指針指向類型長(zhǎng)度的空間,對(duì)于win32的int為4byte;

B)多維數(shù)組
對(duì)于二維數(shù)組a[4][6];由于數(shù)組名代表數(shù)組的起始地址,所以a(第一層)和第一個(gè)元素a[0][0]地址的數(shù)字是相同的,但是意義卻是不同的。對(duì) 于該數(shù)組我們可以理解為:a的一維數(shù)組(第一層),它有四個(gè)元素a[0]、a[1]、a[2]、a[3](第二層),而每個(gè)元素又含有6個(gè)元素a[0] [0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5](第三層),…到此我們終于訪問(wèn)到了每個(gè)元素了,這個(gè)過(guò)程我們 經(jīng)歷了:a->a[0]->a[0][0];
  整體來(lái)講:a是一個(gè)4行5列的二維數(shù)組,a表示它指向的數(shù)組的首地址(第一個(gè)元素地 址&a[0]),同時(shí)a[0]指向一行,它是這個(gè)行的名字(和該行的第一個(gè)元素的首地址相同(第一個(gè)元素為地址&a[0][0]))。所 以從數(shù)字角度說(shuō):a、a[0]、&a[0][0]是相同的,但是他們所處的層次是不同的。
  既然a代表二維數(shù)組,那么a+i就表示它的第i+1個(gè)元素*(a+i)的地址,而在二維數(shù)組中
*(a+i)又指向一個(gè)數(shù)組,*(a+i)+j表示這個(gè)數(shù)組的第j+1個(gè)元素的地址,所以要訪問(wèn)這個(gè)元素可以使用 *(*(a+i)+j)(也就是a[i][j])。
他們的示意圖為(虛線代表不是實(shí)際存在的):

對(duì)照這個(gè)圖,如下的一些說(shuō)法都是正確的(對(duì)于a[4][6]):

  • a是一個(gè)數(shù)組類型,*a指向一個(gè)數(shù)組;
  • a+i指向一個(gè)數(shù)組;
  • a、*a和&a[0][0]數(shù)值相同;
  • a[i]+j和*(a+i)+j是同一個(gè)概念;

  總結(jié)一下就是:我們對(duì)于二維指針a,他指向數(shù)組a[0,1,2,3],使用*,可以使他降級(jí)到第二層次,這樣*a就指向了第一個(gè)真正的數(shù)組。對(duì)于其他的情況我們也可以采用相同的方式,對(duì)于其他維數(shù)和類型的數(shù)組我們可以采用相類似的思想。

說(shuō)到指向數(shù)組的指針,我們還可以聲明一個(gè)指針變量讓它指向一個(gè)數(shù)組。例如:

1int (*p)[5];

這時(shí)p就是一個(gè)指針,要指向一個(gè)含有5個(gè)int類型元素的數(shù)組,指向其他的就會(huì)出現(xiàn)問(wèn)題。
這個(gè)時(shí)候我們可以使用上面的什么東西來(lái)初始化呢?
我們可以使用*a,*(a+1),a[2]等。
原因很簡(jiǎn)單:我們?cè)谝粋€(gè)二維的數(shù)組中,那么表達(dá)方式有上面的相互類似的意義呢?只有 *a,*(a+1),a[2]等,

C)指針數(shù)組
  一個(gè)指針數(shù)組是指一個(gè)數(shù)組中的每個(gè)元素都是一個(gè)指針,例如:

int *p[10];//而不能是int (*p)[10]
or

char *p[10];

此時(shí)p是一個(gè)指針(數(shù)值上和&p[0]一樣);
在前面有int t[10];

int * pt=t;//使用pt指向t

那么這里我們用什么指向int *t[10]中的t呢?我們要使用一個(gè)指針的指針:

int **pt=t;

  這是因?yàn)椋涸趇nt *t[10]中,每個(gè)元素是指針,那么同時(shí)t又指向這個(gè)數(shù)組,數(shù)組上和&t[0]相同,也就是指向t[0],指向一個(gè)指針變量,可以說(shuō)是一個(gè)指針的指針了,所以自然要用

int **pt;


D)指針的指針
一個(gè)指針變量?jī)?nèi)部可以存儲(chǔ)一個(gè)值,這個(gè)值是另外一個(gè)對(duì)象的地址,所以我們說(shuō)一個(gè)指針變量可以指向一個(gè)普通變量,同樣這個(gè)指針變量也有一個(gè)地址,也就是說(shuō) 有一個(gè)東西可以指向這個(gè)指針變量,然后再通過(guò)這個(gè)指針變量指向這個(gè)對(duì)象。那么如何來(lái)指向這個(gè)指針變量呢?由于指針變量本身已經(jīng)是一個(gè)指針了(右值),那么 我們這里就不能用一般的指針了,需要在指針上體現(xiàn)出來(lái)這些特點(diǎn),我們需要定義指針的指針(二重指針)。

int *p1=&i;
int**p2=&p1;

綜合以上的所有點(diǎn),下面是我們常??吹揭恍┢ヅ洌ㄒ彩墙?jīng)常出錯(cuò)的地方):

int a[3],b[2][3],c,*d[3];
void fun1(int *p);
void fun2(int (*p)[3]);
void fun3(int **p);
void fun4(int p[3]); 
void fun5(int p[]);
void fun6(int p[2][3]);
void fun7(int (&p)[3]);

函數(shù) 不會(huì)產(chǎn)生編譯時(shí)刻的可能值(但邏輯上不一定都對(duì))

函數(shù)

不會(huì)產(chǎn)生編譯時(shí)刻的可能值(但邏輯上不一定都對(duì))

fun1

a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]

fun2

b,b+i,

fun3

d

fun4

a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]

fun5

a, &a[i], *b ,b[i],&b[i][j] ,&c ,d[i]

fun6

  b

fun7

a

為什么可以有這樣的搭配,原因如下:

  • 對(duì) 于fun1 fun4 fun 5: 在編譯器看來(lái)fun1,fun4,fun5的聲明是一樣,在編譯時(shí)候,編譯器把數(shù)組的大小舍去不考慮,只考慮它是一個(gè)指針,也就是說(shuō)有沒(méi)有大小說(shuō)明是一樣 的,所以三者的形式都是fun1的形式(其實(shí)只要提供了int*指針就可以了);
  • 對(duì)于fun7 :以上的解釋對(duì)于引用是不適用的,如果變量被聲明為數(shù)組的引用,那么編譯器就要考慮數(shù)組的大小了,那么必須和聲明一模一樣(所以fun7就只有a合適);
  • 對(duì)于fun2:p是一個(gè)指向一個(gè)含有3個(gè)元素的數(shù)組,這樣b和b+i正好合適,而a卻不是(它是指向a[0]的,不是指向這個(gè)數(shù)組的);
  • 對(duì)于fun3:p是一個(gè)指針的指針,而d指向d[0],同時(shí)d[0]又是一個(gè)指針,所以d就是一個(gè)指針的指針。但是b卻不是(它是一個(gè)2*3的矩陣也就是年int [2][3]類型);
  • 對(duì)于fun6,p是一個(gè)2*3的數(shù)組類型,和b恰好完全匹配;

二、函數(shù)指針、函數(shù)的指針參數(shù)以及返回指針的函數(shù)

A) 函數(shù)指針
C++規(guī)定,一個(gè)函數(shù)的地址就是這個(gè)函數(shù)的名字。我們需要指出的就是一個(gè)指針需要指定類型是為了后來(lái)的指針解析時(shí)候使用,通過(guò)指針有效快速訪問(wèn)對(duì)象。那 么對(duì)于函數(shù)的指針,它要表示出該函數(shù)的那些特性才能滿足解析的唯一性呢?答案就是一個(gè)函數(shù)的特性有它的參數(shù)列表和返回類型。

下面是一個(gè)函數(shù)指針的例子:

int (*p)(int I,int j);

不能是

int *p(int I,int j),

這樣就變成了返回指針的函數(shù)聲明了。

在C++中處于對(duì)安全性的考慮,指針和它指向的對(duì)象要類型一致,也就說(shuō)上面的指針?biāo)赶虻暮瘮?shù)的特性要和它一模一樣:例如指向int min(int I,int j);是可以的。但是指向int min(double I ,double j);是不可以。函數(shù)指針也和其他的指針一樣,在使用的時(shí)候很怕發(fā)生"懸空",所以在使用的時(shí)候同樣要判斷有效性,或者在定義的時(shí)候就初始化。

int (*p)(int I,int j)=min;
int (*p)(int I,int j)=&min;
int (*p)(int I,int j)=0;

B) 函數(shù)的指針參數(shù)
  函數(shù)指針可以作函數(shù)的參數(shù):例如我們有一個(gè)積分的算法,對(duì)于不同的數(shù)學(xué)函數(shù)可以進(jìn)行積分(我們這里假設(shè)函數(shù)都是一元的);
那么我們的算法接口可以定義為:

template<class T>
T integrate( T lower, T upper , T (*)(T)=0 )throw(integrated_exp);
這里的最后的參數(shù)是一個(gè)函數(shù)的指針,并且被設(shè)定缺省值為0。這個(gè)函數(shù)返回一個(gè)值,同時(shí)需要一個(gè)參數(shù)。假如加入我們有這樣的一個(gè)函數(shù):
double line(double x){ return a*x+b;}

那么我就可以使用了。

函數(shù)指針還可以作為返回類型(注意不是函數(shù)?。。硞€(gè)特定的函數(shù)是不可以作為返回類型的。)假設(shè):

typedef int (*PF)(int );
PF getProcessMethod( );//true

C) 返回指針的函數(shù)
一個(gè)函數(shù)的返回是函數(shù)的重要接口之一,c++的一個(gè)重要的強(qiáng)大的功能就是能夠設(shè)計(jì)足夠復(fù)雜和好用的用戶自定義類型。而同時(shí)處理和傳遞這些類型也是很麻煩 的一件事情,我們不想把我們的時(shí)間都花在這些對(duì)于我們的實(shí)際工作沒(méi)有很實(shí)質(zhì)幫助的拷貝上,解決這個(gè)問(wèn)題就要依賴我們的接口設(shè)計(jì):c和c++都提供了相應(yīng)的 解決方案,在c++中我們可是使用引用,講他們作為函數(shù)的實(shí)際參數(shù),或者我們?cè)诤瘮?shù)的實(shí)際參數(shù)中使用一個(gè)指針等。同樣我們還可以使用一個(gè)函數(shù)返回一個(gè)指 針:但是這是一個(gè)很不好解決的問(wèn)題!
我們首先容易出錯(cuò)的是:將一個(gè)局部變量的地址傳出來(lái)!例如:

UserType * Process( )
{
  UserType ut(param-list);
  //process ut;
  return &ut;//
}

  這個(gè)變量在我們的函數(shù)結(jié)束的時(shí)候就被銷毀了,盡管地址可以傳出去,但是這個(gè)地址已經(jīng)不存在了,已經(jīng)不能使用的東西,在這個(gè)函數(shù)之外卻不知道,難免要出錯(cuò)!
同時(shí)我還會(huì)有一個(gè)比較麻煩的問(wèn)題:使用new,又容易造成內(nèi)存泄露

UserType * Process ( )
{
  UserTpye *put=new UserType(param-list );
  //process put;
  return put;
}

我們?cè)诤瘮?shù)內(nèi)部使用了一個(gè)new,分配了一個(gè)空間,這樣傳出來(lái)也是可以!
  就是說(shuō)不會(huì)發(fā)生上面的問(wèn)題了。但是用戶通常都會(huì)忘記在程序的外面在把這個(gè)借來(lái)的空間還回去!內(nèi)存空間就這樣泄露了!
可能也是這些另人無(wú)奈的問(wèn)題,所以很多程序員把函數(shù)的參數(shù)設(shè)定為指針或者引用,以此來(lái)代替這種向外傳輸吧!總之,使用這種返回指針的函數(shù)要小心!

三、類成員的指針

類成員和一般的外部變量相互比較,不同就是它所在的域不同,這個(gè)域很重要,它決定了該變量可以使用的范圍。那么一個(gè)指針如果要指向類的成員函數(shù)或者成員 變量,那么除了要表達(dá)它的返回類型、參數(shù)列表或者類型之外,那么還要說(shuō)明它所指向的變量(或者函數(shù))的域,為了說(shuō)明該域我們要使用類域限定:

class NJUPT
{
  static double money=20000000;
  int num;
  public:
  NJUPT():num(10){};
  int get(){return num;};
  double getMoney(){reuturn money;}
}

我們定義成員的指針為

int NJUPT:: *p;//指向int型成員變量
int (NJUPt::*)p()//指向int f()型成員函數(shù)。

為了使用這些指針,我們需要使用該類型的變量或者指針。

NJUPT s,*ps;

那么調(diào)用的方式為:

cout<<s.*p;
cout<<(s->*p)();

  這個(gè)看起來(lái)似乎很奇怪!但是只要你想到我們定義的指針被限定在了類域中了(我們?cè)陂_(kāi)始定義的使用使用了NJUPT:: ),這么使用也是很自然的。
  如果一個(gè)類還有一些靜態(tài)成員變量和靜態(tài)成員函數(shù),那么我是否也想這樣使用呢?
答案是不用,靜態(tài)成員我們就可以象使用外部的普通成員一樣定義一個(gè)指針或者函數(shù)指針來(lái)訪問(wèn)就可以了,究其原因主要是這個(gè)成員的類型性質(zhì)決定的。

double *p=&NJUPT::money;
double (*p)()=&NJUPT::getMoney(): 
 

posted on 2008-01-06 15:59 sdfasdf 閱讀(261) 評(píng)論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品三级日韩久久| 午夜激情综合网| 欧美福利在线| 99精品热6080yy久久 | 在线国产欧美| 欧美大片在线观看一区二区| 久久乐国产精品| 亚洲日韩第九十九页| 亚洲激情视频在线观看| 欧美激情中文不卡| 亚洲女女做受ⅹxx高潮| 亚洲免费影院| 精品999成人| 亚洲欧洲一区二区在线观看| 欧美视频在线一区| 久久久久久久999精品视频| 玖玖在线精品| 亚洲一区日韩| 欧美大片一区| 欧美激情女人20p| 亚洲手机成人高清视频| 欧美在线观看网址综合| 亚洲综合社区| 国产在线麻豆精品观看| 另类av导航| 欧美丝袜一区二区三区| 久久精品亚洲一区二区| 久久中文欧美| 欧美一区二区三区四区高清| 免费不卡在线观看av| 亚洲欧美日韩人成在线播放| 久久久青草婷婷精品综合日韩| 一区二区三区视频在线看| 欧美一级成年大片在线观看| 日韩视频免费| 久久全国免费视频| 欧美在线视频免费| 欧美日韩视频一区二区| 欧美高清视频www夜色资源网| 国产精品国产三级国产aⅴ9色| 欧美v亚洲v综合ⅴ国产v| 国产精品久久久久久影视| 女人香蕉久久**毛片精品| 国产精品丝袜xxxxxxx| 亚洲人在线视频| 黑人一区二区| 欧美一区二区三区视频免费| 亚洲影院免费| 欧美天天在线| 亚洲欧洲一区二区三区在线观看 | 亚洲欧美亚洲| 亚洲自拍偷拍麻豆| 欧美视频在线观看一区| 亚洲人成亚洲人成在线观看| 亚洲成色最大综合在线| 久久激情视频免费观看| 欧美一级二区| 国产精品自拍网站| 亚洲一区欧美| 欧美一区二区三区免费大片| 欧美日精品一区视频| 亚洲老板91色精品久久| 亚洲精品免费一二三区| 欧美韩日亚洲| 亚洲美女毛片| 亚洲一区二区免费| 国产精品多人| 亚洲欧美日韩国产| 久久精品一区二区三区不卡牛牛| 国产精品日韩在线| 欧美亚洲一区| 免费在线看一区| 亚洲激情网站| 欧美日韩午夜剧场| 亚洲婷婷在线| 老司机亚洲精品| 亚洲欧洲在线视频| 欧美日韩少妇| 欧美一区二区三区四区高清| 久久精品亚洲国产奇米99| 黄色国产精品一区二区三区| 美日韩免费视频| 亚洲精品日本| 欧美一区二区三区婷婷月色| 9色国产精品| 国产精品理论片在线观看| 日韩视频在线一区二区三区| 亚洲网在线观看| 国产欧美一区二区精品秋霞影院| 欧美一区在线看| 91久久午夜| 午夜精品一区二区三区在线视| 国产一区二区精品丝袜| 免费一级欧美片在线播放| 日韩写真视频在线观看| 久久福利电影| 99ri日韩精品视频| 国产日产欧产精品推荐色| 欧美本精品男人aⅴ天堂| 亚洲午夜精品久久| 亚洲第一精品在线| 亚洲一区欧美| 亚洲精品女av网站| 国产日韩欧美a| 欧美激情精品久久久久久黑人| 亚洲一区二区精品视频| 亚洲电影一级黄| 久久爱www.| 一本色道久久99精品综合| 国产一区二区三区在线观看网站| 欧美极品在线视频| 久久米奇亚洲| 欧美一级视频免费在线观看| 亚洲人成在线观看网站高清| 久久久久久久高潮| 亚洲欧美精品suv| 在线视频你懂得一区二区三区| 国语自产精品视频在线看| 国产精品白丝jk黑袜喷水| 免费观看成人www动漫视频| 先锋影音久久久| 一二三区精品福利视频| 亚洲高清免费| 欧美成人高清视频| 久久久五月天| 久久国产成人| 欧美一区二区成人6969| 亚洲一区在线视频| 一区二区三区欧美视频| 亚洲人体影院| 亚洲三级网站| 日韩视频免费观看高清在线视频| 尤物九九久久国产精品的特点 | 欧美成人午夜激情在线| 久久久久网站| 久久视频在线视频| 久久综合网hezyo| 免费一级欧美片在线观看| 久久久久久综合网天天| 久久免费视频在线| 久久综合电影| 欧美激情精品久久久久| 欧美黑人在线观看| 欧美日韩亚洲另类| 欧美无乱码久久久免费午夜一区| 欧美日韩中文字幕| 国产精品激情偷乱一区二区∴| 欧美午夜免费电影| 国产乱码精品一区二区三区av| 国产精品男人爽免费视频1| 国产精品羞羞答答| 国产综合久久久久久鬼色| 精品二区久久| 99国产精品久久久久久久成人热 | 亚洲资源在线观看| 久久精品视频99| 另类激情亚洲| 一本久久知道综合久久| 亚洲一区二区三区国产| 欧美肥婆bbw| 欧美日韩国产a| 欧美看片网站| 国产精品久久久爽爽爽麻豆色哟哟| 国产精品毛片大码女人| 国产一区二区在线观看免费播放| 亚洲国产成人tv| 亚洲性夜色噜噜噜7777| 久久国产精品亚洲va麻豆| 美女主播精品视频一二三四| 亚洲激情亚洲| 亚洲欧美日韩网| 欧美不卡视频| 国产精品爽黄69| 亚洲欧洲综合另类在线| 亚洲欧美日韩一区二区| 久久视频在线免费观看| 亚洲精品之草原avav久久| 亚洲欧美成人在线| 免费日韩视频| 国产日韩欧美成人| 亚洲久久视频| 久久午夜羞羞影院免费观看| 亚洲国产成人tv| 欧美在线二区| 欧美巨乳波霸| 亚洲电影网站| 性欧美xxxx大乳国产app| 亚洲高清123| 欧美有码在线观看视频| 欧美色视频日本高清在线观看| 精久久久久久久久久久| 午夜精品亚洲一区二区三区嫩草| 久久综合激情| 亚洲综合色婷婷| 欧美日韩一卡| 亚洲精品亚洲人成人网| 免费在线观看精品| 欧美一区二区三区四区高清| 欧美少妇一区| 这里只有视频精品|