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

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 郭龍 閱讀(5620) 評論(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>
            欧美日韩一区二区三区高清| 欧美激情区在线播放| 国产精品爽黄69| 亚洲天天影视| 亚洲欧美日韩爽爽影院| 国产一区二区黄色| 欧美不卡在线| 欧美色图一区二区三区| 性欧美暴力猛交另类hd| 久久蜜臀精品av| 日韩一区二区精品视频| 一二美女精品欧洲| 黄色一区二区三区| 亚洲三级免费| 国产日产欧美精品| 欧美国产视频在线观看| 欧美日韩在线精品| 久久在线免费| 欧美亚洲不卡| 欧美成人综合| 国产精品私人影院| 欧美电影在线| 国产目拍亚洲精品99久久精品| 久久这里只有| 国产精品高潮呻吟| 欧美激情精品久久久久| 国产精品福利影院| 欧美黄色大片网站| 国产欧亚日韩视频| 99天天综合性| 亚洲精品1234| 国产真实久久| 中文国产成人精品| 最新日韩中文字幕| 久久国产精品久久精品国产| 在线性视频日韩欧美| 久久九九电影| 欧美尤物一区| 欧美性事在线| 99国产精品私拍| 亚洲破处大片| 久久久久久有精品国产| 欧美一级大片在线观看| 欧美精品电影| 亚洲国产精品黑人久久久 | 99精品免费网| 亚洲国产日韩在线一区模特| 欧美在线999| 欧美有码在线视频| 国产精品多人| 一区二区三区免费在线观看| 亚洲精品日韩欧美| 麻豆91精品| 欧美成人免费在线观看| 国内精品久久久久久久影视蜜臀| 亚洲影视在线| 午夜视频精品| 欧美性理论片在线观看片免费| 亚洲人精品午夜在线观看| 亚洲国产欧美一区二区三区同亚洲| 久久精品日韩欧美| 久久一区激情| 亚洲承认在线| 欧美a级一区二区| 亚洲国产精品电影| 夜夜夜久久久| 国产精品theporn88| 一道本一区二区| 午夜免费日韩视频| 国产视频一区欧美| 久久精品免费看| 免费看黄裸体一级大秀欧美| 亚洲高清av在线| 欧美精品三级| 日韩视频一区二区三区| 亚洲欧美日韩一区在线| 国产日韩亚洲欧美精品| 久久精品国产77777蜜臀| 久久夜色精品国产| 亚洲国产一区二区a毛片| 欧美精品久久久久久久免费观看 | 99re这里只有精品6| 亚洲视频在线观看三级| 国产女人水真多18毛片18精品视频| 亚洲在线日韩| 欧美xart系列高清| 亚洲一区二区三区乱码aⅴ| 国产麻豆精品theporn| 久久精品电影| 日韩手机在线导航| 欧美影院午夜播放| 亚洲精品护士| 国产乱子伦一区二区三区国色天香| 久久九九精品| 在线视频一区观看| 久久深夜福利免费观看| 久久av一区二区三区亚洲| 久久婷婷亚洲| 亚洲少妇自拍| 欲色影视综合吧| 欧美色网一区二区| 久久婷婷蜜乳一本欲蜜臀| 99精品视频免费| 久久影视三级福利片| 亚洲影视在线| 91久久亚洲| 国产综合久久久久久| 欧美精品在线看| 久久久久国产成人精品亚洲午夜| 亚洲激情图片小说视频| 久久精品色图| 亚洲综合色视频| 亚洲精选一区二区| 精品电影在线观看| 国产精品私人影院| 欧美日韩国产精品 | 小嫩嫩精品导航| 一本久久综合| 亚洲福利专区| 欧美jizz19hd性欧美| 欧美在线观看视频| 亚洲一区在线播放| 夜夜夜久久久| 亚洲精品美女91| 亚洲国产一区二区三区a毛片| 国产色综合久久| 国产日韩av高清| 国产精品一区二区在线观看不卡| 欧美精品一区在线| 欧美a级片网| 欧美多人爱爱视频网站| 久久先锋影音av| 久久精品国产免费观看| 午夜精品久久久久久99热软件| av成人天堂| 99re66热这里只有精品3直播| 最新成人av网站| 亚洲国产欧美不卡在线观看| 嫩草成人www欧美| 麻豆国产精品va在线观看不卡| 久久免费99精品久久久久久| 欧美一区精品| 久久精品中文字幕免费mv| 久久精品免费观看| 久久久亚洲高清| 欧美成人综合| 亚洲精品视频一区| 一区二区三区四区国产| 一区二区91| 亚洲欧美日韩精品综合在线观看| 亚洲欧美综合精品久久成人| 午夜精品久久久久久久99水蜜桃| 午夜精品视频在线| 久久精品国产亚洲5555| 麻豆精品一区二区av白丝在线| 欧美v亚洲v综合ⅴ国产v| 欧美精品久久久久a| 国产精品福利av| 国产在线精品二区| 亚洲日本黄色| 亚洲欧美国产日韩中文字幕| 欧美一级精品大片| 美国十次了思思久久精品导航| 亚洲电影中文字幕| 一区二区三区国产盗摄| 久久av一区二区三区| 欧美不卡在线视频| 国产精品久久久久久久久久久久| 国产亚洲精品福利| 亚洲美女精品成人在线视频| 亚洲影院免费观看| 久久久久久久尹人综合网亚洲| 亚洲福利在线观看| 性久久久久久久| 欧美日韩a区| 黄色一区二区三区| 你懂的视频一区二区| 欧美午夜免费| 亚洲韩国青草视频| 亚洲女人av| 欧美激情综合| 亚洲欧美日韩精品一区二区| 欧美成人嫩草网站| 国产日韩欧美在线播放| 日韩亚洲国产欧美| 久久综合一区二区三区| 亚洲视频欧美在线| 欧美第一黄色网| 狠狠久久婷婷| 午夜精品美女自拍福到在线| 欧美高清视频一区| 久久国产精品99国产精| 欧美午夜精品久久久| 亚洲精品一区二区三区四区高清 | 亚洲人线精品午夜| 久久香蕉精品| 午夜精品久久久久影视| 欧美日韩一区二区视频在线观看| 在线日本欧美| 久久夜色精品亚洲噜噜国产mv|