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

glxhyt

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  15 隨筆 :: 0 文章 :: 4 評論 :: 0 Trackbacks
    入職一年了,這一年自己學到許多,但是忘記也很多,于是決定定下心來整理以前學到的,并且繼續學習
    
    二維數組和二級指針,這真是頭疼的問題,困擾了我好幾次,
   
    先轉一下wanpengcoder的二維數組和二級指針

前兩天寫個程序,傳參數的時候想傳個二維數組進去,結果悲劇了,函數寫成Fun (int **p){},原來沒有這么寫過,

以為這么寫也是對的,結果錯了,查了些資料,做個總結。

Fun (int **p){}這里面的int **p //這里的p不是二維數組的指針,而是指向指針的指針,即二級指針。

正確的二維數組的指針應該是:Int a[2][2];Int (*p)[2];//定義時無論數組維數,只可忽略第一維

例如:int a[2][2]={0,1,2,3};

int **p=(int**)a;//強制將二維數組指針轉為指向指針的指針

則此時p[0]=0;p[1]=1;p[2]=2;p[3]=3;

而p[0][0]=*(*(p+0)+0)=**p;

p[0][1]=*(*(p+0)+1);

對于p[0][0]:由于*p=0; ====> **p=*(0);引用地址為零的內存,必然是錯誤的。

對于p[0][1]=*(*p+1)====>*(4),引用了非法內存同樣,

對于p[1][0]=*(1),p[1][1]=*(5),均引用了非法內存所以說,二位數組并不能簡單的轉換成指向指針的指針。

二維數組其實只是一個指針,而二級指針是指向指針的指針,所以二者并不等價。如上例所示:int a[2][2];

a是指向整個數組的首地址,并不是int **;所以不要指望向函數fun里面傳實參 p=a;

 

感謝sld666666,我覺得那個應該是和下面的情況類似把,中間有個強制轉換的過程:

 

#include <iostream>

 

void fun(char ** p)

{

char (*p1)[10] = (char(*)[10])p;

std::cout<<p1[0][0]<<std::endl;

}

 

int main(int argc, char* argv[])

{

char data[][10] = {"abc","def"};

fun((char **)data);

return 0;

}

----------------------------------------------------------------華麗的分割線---------------------------------------------------------------------------------------------------------------------------

 

<c程序設計語言>中的關于這個的解釋:

Newcomers to C are sometimes confused about the difference between a two-dimensional array and an array of pointers, such as name in the example above. Given the definitions

int a[10][20];

int *b[10];

then a[3][4] and b[3][4] are both syntactically legal references to a single int. But a is a true two-dimensional array: 200 int-sized locations have been set aside, and the conventional rectangular subscript calculation 20 * row +col is used to find the element a[row,col]. For b, however, the definition only allocates 10 pointers and does not initialize them; initialization must be done explicitly, either statically or with code. Assuming that each element of b does point to a twenty-element array, then there will be 200 ints set aside, plus ten cells for the pointers. The important advantage of the pointer array is that the rows of the array may be of different lengths. That is, each element of b need not point to a twenty-element vector; some may point to two elements, some to fifty, and some to none at all.

Although we have phrased this discussion in terms of integers, by far the most frequent use of arrays of pointers is to store character strings of diverse lengths, as in the function month_name. Compare the declaration and picture for an array of pointers:

char *name[] = { "Illegal month", "Jan", "Feb", "Mar" };?

with those for a two-dimensional array:

char aname[][15] = { "Illegal month", "Jan", "Feb", "Mar" };


//我的理解是,當是指針數組的時候,可以直接傳,如果是普通的二維數組的話應該就進行上面的轉換。

    一下是自己遇到問題:

    問題1:

 1#include "stdafx.h"
 2
 3#include <iostream>
 4using namespace std;
 5
 6
 7typedef struct tagNode_st
 8{
 9 char m_acData[10];
10 int m_iNo;
11}
Node_st;
12
13Node_st Root;
14
15int Fun(Node_st ** pst)
16{
17//Error
18#if 0
19 Node_st astNodeA[2= {{"xiaowang"1}{"xiaoming"2}};
20#else
21 static Node_st astNodeA[2= {{"xiaowang1"1}{"xiaoming1"1}}
22#endif
23 //static Node_st astNodeB[2] = {{"xiaowang2", 2}, {"xiaoming2", 2}}; 
24//static Node_st astNodeC[2] = {{"xiaowang3", 3}, {"xiaoming3", 3}}; 
25*pst = astNodeA;
26
27 return 0;
28}

29
30int _tmain(int argc, _TCHAR* argv[])
31{
32 Node_st st[2][2];
33
34 //TypeA
35 Fun((Node_st**)st);
36   //1.error
37 cout<<st[0][0].m_acData<<endl;
38 cout<<st[0][0].m_iNo<<endl<<endl;
39
40 //2.error
41 cout<<(*st)->m_acData<<endl;
42 cout<<(*st)->m_iNo<<endl<<endl;
43
44 //3.right
45 cout<<(*(Node_st**)st)->m_acData<<endl;
46 cout<<(*(Node_st**)st)->m_iNo<<endl<<endl;
47
48 //Typde B
49 Node_st *pstTemp[2= {&st[0][0], &st[1][0]};
50 Fun(&pstTemp[0]);
51 //Right
52 cout<<(pstTemp[0])->m_acData<<endl;
53 cout<<(pstTemp[0])->m_iNo<<endl<<endl;
54
55 //Error
56 cout<<(st[0][0]).m_acData<<endl;
57 cout<<(st[0][0]).m_iNo<<endl<<endl;
58
59 //Right
60 cout<<(*(Node_st**)st)->m_acData<<endl;
61 cout<<(*(Node_st**)st)->m_iNo<<endl<<endl;
62
63 //Typde C
64
65 Node_st *pstTemp2[2= {NULL, NULL};
66 Fun(&pstTemp2[0]);
67 //Right
68 cout<<(pstTemp2[0])->m_acData<<endl;
69 cout<<(pstTemp2[0])->m_iNo<<endl<<endl;
70
71 return 0;
72}

73

最終通過上面藍色部分找到了到了答案,簡單的說就是

二維數組其實只是一個指針,而

二級指針是指向指針的指針,所以二者并不等價。

 

但是可以強轉

如:

1 int iaArray[2][2= {1124};
2 
3 int **= (int**)iaArray;
4 
5 for (int i = 0; i < 4++ i)
6 {
7  cout<<"i:"<<i<<" "<<q[i]<<endl;
8 }

9

 和:
1 int iaArrayTemp[5] = {1, 2, 3, 4, 5};
2 int **p = (int**)&iaArrayTemp;
3 p++;
4 cout<<*p<<endl;

這樣就是正確的。

問題2:
下面的問題:很有意思

1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int iaArray[5] = {1, 2, 3, 4, 5};
7
8#if 0
9
10 int *p = (int*)(&iaArray+1)-1;
11 cout<<*p<<endl;
12
13 int *q = (int*)(&iaArray+1);
14 cout<<*(q-1)<<endl;
15
16 int **qq = (int**)(&iaArray+1);
17 cout<<*(qq-1)<<endl;
18
19#else
20 int iaAry[2][2] = {1, 2, 3, 4};
21
22 int *p = (int*)(&iaAry+1)-1;
23 cout<<*p<<endl;
24
25 int *q = (int*)(&iaAry+1);
26 cout<<*(q-1)<<endl;
27
28 int **qq = (int**)(&iaAry+1);
29 cout<<*(qq-1)<<endl;
30#endif
31 return 0;
32}

上面的結果都是5,下面的結果都是4
主要說明的是:
不管是二維數組,還是一維數組
數組的首地址取地址+1,增加整個數組的長度;
如上面的例子:

    3:注意函數傳遞,指針,引用

    在指針引用&*,**的時候是改變的指針,這個一般主要是里面涉及到內存分配,
    或者獲取的是靜態區域,或者是全局的區域,傳遞的時候一般都是傳,空指針。

     傳遞*,&,是改變的數組的值。一般都是傳遞的是非空的,一般要再函數中增加
      assert(NULL != p);
    
     4.const ,Enum,static const ...待續

     快0:00,笑一笑,睡覺了
posted on 2011-11-21 23:55 郭龍 閱讀(5629) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久九九热re6这里有精品| 久久久久久国产精品mv| 欧美欧美天天天天操| 亚洲人在线视频| 亚洲三级视频| 欧美日韩黄色大片| 午夜精品久久久久影视| 性色av香蕉一区二区| 一色屋精品视频免费看| 欧美电影专区| 欧美三级在线视频| 久久不射网站| 另类激情亚洲| 亚洲在线黄色| 久久黄色级2电影| 亚洲国产你懂的| 日韩一级精品视频在线观看| 国产精品欧美在线| 欧美成人综合一区| 欧美日韩影院| 久久人人爽人人爽爽久久| 免费日韩一区二区| 欧美在线短视频| 噜噜噜噜噜久久久久久91| 中文欧美在线视频| 久久成人国产| 亚洲欧美激情视频在线观看一区二区三区| 午夜精品在线视频| 亚洲人成人一区二区三区| 亚洲综合日韩在线| 亚洲欧洲综合另类| 欧美一级理论片| 99精品国产一区二区青青牛奶 | 欧美亚洲在线| 另类综合日韩欧美亚洲| 亚洲欧美春色| 欧美激情第9页| 久久先锋资源| 国产精品99一区| 欧美黄色一区二区| 国产主播一区| 亚洲视频图片小说| aa日韩免费精品视频一| 久久精品综合| 欧美制服丝袜| 欧美三级网页| 亚洲国产精品小视频| 精品999成人| 亚洲欧美成人网| 亚洲视频电影图片偷拍一区| 久久综合久久综合九色| 久久久999国产| 国产精品欧美久久| 99天天综合性| 亚洲视频在线二区| 欧美国产综合一区二区| 欧美.www| 亚洲国产成人porn| 久久婷婷激情| 欧美96在线丨欧| 国产私拍一区| 亚洲综合国产| 亚洲欧美综合v| 国产精品日韩一区| 中文一区二区在线观看| 亚洲一区二区少妇| 欧美色视频一区| 99国产精品99久久久久久粉嫩| 日韩一区二区福利| 欧美人成在线视频| 99国内精品久久久久久久软件| aa日韩免费精品视频一| 欧美日韩国产一区精品一区| 91久久香蕉国产日韩欧美9色| 亚洲精品四区| 欧美日韩成人综合在线一区二区| 91久久精品国产91性色| 一区二区三区精品久久久| 欧美日韩在线一区二区| 亚洲图片欧美一区| 香蕉久久精品日日躁夜夜躁| 国产日韩欧美一二三区| 久久av资源网| 亚洲激情不卡| 亚洲视频在线视频| 国产欧美精品| 久久免费国产精品| 亚洲国产精品一区二区尤物区 | 国产精品久久久久久久久果冻传媒 | 亚洲一二三四久久| 国产精品香蕉在线观看| 欧美一区二区在线视频| 你懂的网址国产 欧美| 夜夜嗨av一区二区三区四季av| 欧美日韩美女一区二区| 亚洲欧美国产三级| 麻豆精品精华液| 一区二区三区高清不卡| 国产精品一区二区久久久久| 久久久久国产成人精品亚洲午夜| 亚洲日韩视频| 久久久国产91| 一本大道久久a久久精二百| 国产日韩一区二区三区在线| 玖玖国产精品视频| 亚洲女人av| 亚洲经典一区| 久久久久国产免费免费| 亚洲精品小视频| 国产一区二区三区四区在线观看| 牛夜精品久久久久久久99黑人 | 久久九九热免费视频| 91久久精品网| 国产一区二区三区免费不卡 | 蜜桃av综合| 亚洲综合色网站| 亚洲人成在线观看网站高清| 欧美一区二区三区婷婷月色 | 亚洲欧美中日韩| 亚洲日本中文字幕免费在线不卡| 国产精品五月天| 欧美日韩中文字幕精品| 久久久五月婷婷| 午夜国产欧美理论在线播放| 亚洲精品久久久久久一区二区| 久久综合伊人77777尤物| 性久久久久久久久久久久| 日韩午夜精品| 亚洲国产精品久久精品怡红院| 国产精品一区二区欧美| 国产精品福利在线观看| 欧美精品99| 免费在线观看日韩欧美| 欧美专区18| 欧美在线播放视频| 亚洲男女自偷自拍图片另类| 在线视频精品| 日韩午夜一区| 99视频有精品| 9人人澡人人爽人人精品| 91久久精品国产91性色| 亚洲黄色成人| 欧美激情欧美狂野欧美精品| 欧美成人精品1314www| 久久久另类综合| 久久亚洲影音av资源网| 久久av二区| 久久精品亚洲一区二区| 久久久av网站| 免费黄网站欧美| 欧美福利小视频| 亚洲国产综合在线看不卡| 亚洲国产成人高清精品| 欧美高清自拍一区| 亚洲国产综合91精品麻豆| 亚洲日本一区二区| 一本综合久久| 亚洲免费视频一区二区| 欧美中文字幕视频在线观看| 久久国产99| 欧美不卡三区| 欧美日韩和欧美的一区二区| 国产精品久久7| 国产亚洲人成网站在线观看| 好看的日韩av电影| 亚洲国产老妈| 亚洲视频日本| 久久久999精品| 亚洲国产日韩在线一区模特| 一本色道久久综合亚洲精品小说 | 亚洲激情视频在线| 99这里只有精品| 午夜精品一区二区三区四区| 久久黄色级2电影| 欧美另类变人与禽xxxxx| 国产精品福利片| 激情懂色av一区av二区av| 亚洲精品麻豆| 亚洲欧美在线免费| 欧美激情一区二区三级高清视频 | 久久久国产精品一区二区三区| 欧美va天堂| 亚洲视频欧美视频| 麻豆精品视频在线观看视频| 欧美亚洲成人免费| 亚洲国产精品久久久久婷婷老年| 亚洲视频一二三| 久久亚洲影院| 亚洲一区亚洲二区| 欧美激情综合色| 国产亚洲女人久久久久毛片| 9l国产精品久久久久麻豆| 久久夜色精品| 亚洲一区二区三区高清不卡| 麻豆av福利av久久av| 国产欧美日韩视频一区二区三区 | 国产亚洲毛片| 亚洲一区二区在线免费观看视频| 欧美成人官网二区| 久久高清福利视频|