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

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 郭龍 閱讀(5621) 評論(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>
            亚洲乱码国产乱码精品精| 一本久久a久久免费精品不卡| 国产精品天美传媒入口| 亚洲国产一区二区三区在线播 | 国产亚洲精品久久飘花| 亚洲视频1区2区| 亚洲视频电影在线| 国产精品sm| 欧美韩国日本综合| 亚洲精品字幕| 亚洲视频综合| 在线观看亚洲精品视频| 欧美福利在线| 国产精品爱啪在线线免费观看| 先锋a资源在线看亚洲| 午夜精品免费在线| …久久精品99久久香蕉国产| 亚洲精品小视频| 国内在线观看一区二区三区| 欧美激情国产日韩精品一区18| 欧美午夜性色大片在线观看| 久久婷婷丁香| 国产精品香蕉在线观看| 亚洲精品日产精品乱码不卡| 亚洲国产成人porn| 亚洲欧美日韩一区二区三区在线| 亚洲欧洲精品一区二区三区不卡 | 亚洲一区二区三区四区视频| 狠狠综合久久av一区二区老牛| 国产精品99久久久久久有的能看| 亚洲精品欧美日韩专区| 久久福利电影| 欧美金8天国| 亚洲国产第一| 国内精品久久久久久| 亚洲欧美www| 欧美在线播放高清精品| 久久成人免费| 国产欧美日韩综合一区在线观看 | 亚洲人成亚洲人成在线观看图片| 国产亚洲一级高清| 久久久99爱| 欧美激情一区二区三区四区| 亚洲高清二区| 国产精品久久久久aaaa九色| 中日韩男男gay无套| 久久国产精品久久久久久电车| 国产精品进线69影院| 亚洲欧美另类国产| 麻豆精品视频在线| 一区二区三区国产在线观看| 国产精品日韩欧美一区| 久久综合九色综合欧美狠狠| 亚洲国产精品久久| 久久国产精彩视频| 亚洲天堂网在线观看| 国产一区二区三区奇米久涩 | 亚洲视频国产视频| 国产一区高清视频| 欧美日韩国产二区| 欧美在线免费观看亚洲| 亚洲精选大片| 老司机午夜免费精品视频| 一区二区三区导航| 亚洲精品婷婷| 亚洲第一在线视频| 伊人婷婷欧美激情| 国产亚洲欧美另类中文| 欧美午夜电影在线观看| 欧美激情视频一区二区三区不卡| 久久精品视频一| 亚洲欧美国产高清| 亚洲视频国产视频| 日韩视频精品| 伊人久久久大香线蕉综合直播| 国产精品a久久久久| 欧美日韩蜜桃| 欧美大香线蕉线伊人久久国产精品| 久久精品2019中文字幕| 性娇小13――14欧美| 性欧美精品高清| 欧美在线不卡视频| 久久久亚洲精品一区二区三区 | 久久久久久夜| 久久九九国产精品| 欧美成人第一页| 亚洲精品国产精品国产自| 亚洲精品少妇| 午夜精品久久久久久久男人的天堂 | 欧美国产一区二区三区激情无套| 美女视频一区免费观看| 欧美福利一区二区| 国产精品成人一区二区三区夜夜夜 | 亚洲午夜在线观看| 久久美女艺术照精彩视频福利播放| 性欧美超级视频| 麻豆av一区二区三区久久| 亚洲欧美国产高清| 欧美在线综合| 欧美肥婆在线| 亚洲欧美国产日韩天堂区| 欧美在线啊v| 欧美日韩精选| 国产自产2019最新不卡| 欧美一区深夜视频| 欧美大片免费观看| 在线观看欧美日韩| 亚洲专区在线视频| 99在线热播精品免费99热| 欧美极品一区| 亚洲美女精品久久| 欧美成人在线免费观看| 欧美一级专区| 国产模特精品视频久久久久 | 亚洲三级毛片| 女同一区二区| 亚洲精品一区二区三区蜜桃久| 欧美mv日韩mv国产网站| 久久精品国产欧美亚洲人人爽| 国产精品视频网| 久久国产免费| 性色av一区二区三区| 亚洲电影自拍| 久久精品91| 一区二区三区成人| 另类亚洲自拍| 老色鬼精品视频在线观看播放| 久久精品系列| 亚洲综合欧美| 久久综合九色欧美综合狠狠| 一本色道久久综合亚洲精品不 | 欧美成人精精品一区二区频| 欧美激情久久久| 久久精品欧洲| 欧美高清自拍一区| 久久精品一二三| 国产精品进线69影院| 亚洲国产欧美一区| 亚洲国产精品久久久久秋霞蜜臀| 9色porny自拍视频一区二区| 国产一区久久| 午夜视频在线观看一区| a91a精品视频在线观看| 久久国产视频网| 欧美一区高清| 欧美日韩国产成人在线| 国产精品一二一区| 一本大道久久a久久精二百| 亚洲国产精品一区二区第一页| 亚洲一区二区在线视频| 在线午夜精品| 欧美日韩一区二区视频在线| 亚洲国产精品久久久久秋霞蜜臀| 国产欧美成人| 亚洲欧美亚洲| 欧美在线啊v一区| 激情亚洲网站| 欧美激情一二三区| 正在播放日韩| 久久久999精品视频| 亚洲电影激情视频网站| 欧美精品久久久久久久免费观看| 日韩视频一区二区在线观看| 午夜日韩av| 亚洲国产精品久久| 久久亚洲私人国产精品va媚药| 一区二区三区久久精品| 欧美成年人视频网站欧美| 久久9热精品视频| 国模套图日韩精品一区二区| 中日韩高清电影网| 在线看欧美日韩| 看欧美日韩国产| 欧美电影在线免费观看网站 | 国产一区二区三区电影在线观看| 欧美一级久久| 最新高清无码专区| 99视频精品全部免费在线| 欧美日韩精品一区二区在线播放| 亚洲人永久免费| 久久国产精品99精品国产| 尤物网精品视频| 欧美午夜免费电影| 久久亚洲图片| 欧美在线欧美在线| 亚洲精品资源美女情侣酒店| 久久精品夜色噜噜亚洲a∨| 亚洲国产精品免费| 国产亚洲欧美日韩日本| 免费中文日韩| 裸体女人亚洲精品一区| 亚洲欧美日韩中文视频| 一区二区精品国产| 亚洲国产精品久久久久婷婷884 | 国产免费观看久久| 欧美精品色网| 欧美伦理a级免费电影| 久久夜色精品亚洲噜噜国产mv | 免费观看久久久4p| 久久国产66|