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

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>
            亚洲精品老司机| 亚洲精品欧洲| 久久综合伊人| 你懂的网址国产 欧美| 久热re这里精品视频在线6| 久久中文字幕一区二区三区| 奶水喷射视频一区| 欧美激情性爽国产精品17p| 欧美日韩人人澡狠狠躁视频| 国产精品成人一区二区网站软件| 欧美午夜在线视频| 国产亚洲精品一区二区| 影音欧美亚洲| 在线一区二区视频| 久久成人一区二区| 欧美大胆a视频| 99精品欧美| 久久av一区二区三区| 女女同性精品视频| 国产农村妇女毛片精品久久莱园子| 今天的高清视频免费播放成人| 亚洲国产精品欧美一二99| 一区二区欧美日韩| 久久婷婷成人综合色| 亚洲精品久久久久久下一站| 亚洲永久精品国产| 欧美激情第六页| 国产欧美日韩一级| 日韩亚洲国产欧美| 蜜桃久久精品乱码一区二区| 一区二区三区免费在线观看| 免费观看欧美在线视频的网站| 国产精品豆花视频| 亚洲人成人99网站| 久久久久久久久综合| 亚洲美女淫视频| 久久噜噜噜精品国产亚洲综合| 国产精品久久久久久久久久直播| 亚洲国产毛片完整版| 欧美影院一区| 中文一区二区在线观看| 欧美激情视频网站| 91久久久久久久久| 久久免费视频在线观看| 亚洲一级黄色| 国产精品福利网站| 亚洲婷婷在线| 亚洲欧洲在线看| 欧美成人tv| 亚洲欧洲综合| 亚洲精品一区二区在线观看| 久久久7777| 国产伦一区二区三区色一情| 亚洲视频 欧洲视频| 亚洲黄色免费电影| 久久人体大胆视频| 在线观看欧美亚洲| 久久影视三级福利片| 欧美一区二区网站| 黑人巨大精品欧美黑白配亚洲| 欧美在线观看你懂的| 亚洲一区二区不卡免费| 国产精品成人免费精品自在线观看| 一本久久a久久免费精品不卡 | 亚洲欧美国内爽妇网| 亚洲免费观看在线视频| 欧美人妖在线观看| 亚洲图片欧美日产| 亚洲一级影院| 国产一区二区福利| 老牛影视一区二区三区| 久久久久国产免费免费| 永久免费精品影视网站| 欧美va天堂va视频va在线| 蜜桃av一区二区在线观看| 亚洲精品女av网站| 一区二区冒白浆视频| 国产精品人人做人人爽| 久久久久久久久久久久久9999 | 欧美另类综合| 亚洲欧美一级二级三级| 欧美一级网站| 亚洲国产导航| 一本色道久久综合狠狠躁篇怎么玩 | 欧美区一区二| 欧美一区二视频| 久久人人97超碰精品888| 亚洲免费成人av电影| 一本久道久久久| 黄色成人91| 亚洲毛片一区| 一区二区在线观看视频| 91久久线看在观草草青青| 国产精品主播| 亚洲二区在线观看| 国产日韩三区| 亚洲人成毛片在线播放女女| 国产精品婷婷午夜在线观看| 欧美成人综合| 国产精品一区视频网站| 欧美激情欧美狂野欧美精品| 国产精品国产三级国产专播精品人| 久久一日本道色综合久久| 欧美特黄a级高清免费大片a级| 欧美精品自拍| 亚洲国产三级| 美女日韩在线中文字幕| 欧美日韩另类视频| 美女视频黄a大片欧美| 国产精品户外野外| 亚洲国产精品毛片| 国产一区二区三区在线播放免费观看| 91久久国产综合久久91精品网站| 国产精品亚洲综合一区在线观看 | 国产在线播精品第三| 亚洲欧洲日韩综合二区| 激情综合网激情| 欧美亚洲视频在线看网址| 一本大道久久精品懂色aⅴ| 久久久久久综合| 久久久久国产一区二区三区| 国产精品免费一区豆花| 99这里只有精品| 一级日韩一区在线观看| 免费人成网站在线观看欧美高清 | 亚洲视频一二| 欧美激情一区二区三区在线 | 亚洲人屁股眼子交8| 狠狠色狠狠色综合系列| 性欧美1819sex性高清| 性做久久久久久久免费看| 欧美性猛交99久久久久99按摩| 亚洲日本中文| 亚洲无线视频| 国产精品视频yy9099| 一区二区三区回区在观看免费视频| 亚洲欧洲偷拍精品| 欧美成人午夜77777| 91久久精品视频| 99re国产精品| 欧美性理论片在线观看片免费| 在线视频你懂得一区二区三区| 亚洲特黄一级片| 国产九九精品视频| 欧美影院一区| 欧美 日韩 国产在线| 亚洲精品久久久久久一区二区 | 欧美在线视频不卡| 欧美中文日韩| 经典三级久久| 欧美精品激情| 一区二区三区精品在线| 午夜在线精品| 国产一区二区三区网站 | 欧美大学生性色视频| 亚洲伦伦在线| 久久久精品国产99久久精品芒果| 国产综合在线视频| 欧美韩日一区二区| 中文网丁香综合网| 久久九九精品99国产精品| 在线观看日韩专区| 欧美日韩在线直播| 久久五月激情| 亚洲国产午夜| 国产精品久久99| 久久久久久久综合日本| 亚洲三级影院| 久久久久综合| 一区二区三欧美| 狠狠干综合网| 欧美日韩综合久久| 久久久天天操| 中国成人黄色视屏| 免费日本视频一区| 亚洲视频在线看| 亚洲高清资源| 国产日韩精品综合网站| 欧美大片一区二区| 午夜国产精品影院在线观看 | 亚洲一区二区黄| 激情久久久久久久| 欧美日韩岛国| 久久在线91| 欧美有码视频| 中国女人久久久| 亚洲欧洲一区二区三区| 久久亚洲私人国产精品va| 亚洲视频国产视频| 亚洲电影视频在线| 国产日韩欧美日韩大片| 欧美日韩一卡| 欧美a级片网站| 久久国产日韩| 亚洲综合第一| 夜久久久久久| aaa亚洲精品一二三区| 亚洲高清自拍| 欧美国产精品v| 欧美高清视频在线播放|