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

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>
            欧美天堂亚洲电影院在线播放| 性高湖久久久久久久久| 免费成人黄色| 亚洲国产精品久久久久秋霞影院| 美女久久网站| 欧美成人免费网| 一区二区三区蜜桃网| 亚洲无玛一区| 国产午夜精品全部视频播放| 久久婷婷av| 男同欧美伦乱| 午夜精品久久久久久久蜜桃app | 欧美黄色大片网站| 欧美精品一区二区久久婷婷 | 国产精品永久免费观看| 久久久久久婷| 欧美激情精品久久久久久| 亚洲男人的天堂在线| 久久精品一区二区三区不卡牛牛| 亚洲七七久久综合桃花剧情介绍| 日韩视频中文字幕| 国内精品视频在线播放| 亚洲激情网站| 国产精品美腿一区在线看| 久久―日本道色综合久久| 欧美精品国产精品| 久久阴道视频| 欧美日韩在线视频一区二区| 久久久亚洲欧洲日产国码αv | 欧美韩日一区二区三区| 欧美在线播放视频| 欧美精品免费在线观看| 久久成人精品| 欧美日韩亚洲一区二区三区在线| 欧美制服第一页| 欧美日韩一区二区在线 | 久久精品国产99国产精品| 欧美风情在线| 免费欧美电影| 国产一区二区三区高清播放| 日韩网站在线看片你懂的| 136国产福利精品导航| 国产亚洲精久久久久久| 亚洲狼人综合| 亚洲激情在线观看| 久久动漫亚洲| 欧美在线亚洲一区| 欧美日韩在线播放| 亚洲欧洲日韩在线| 亚洲高清免费视频| 久久黄色网页| 久久久久www| 国产精品免费在线| 亚洲午夜黄色| 亚洲欧美综合网| 欧美激情性爽国产精品17p| 国产热re99久久6国产精品| 亚洲精品在线观看免费| 亚洲美女黄色片| 欧美电影在线免费观看网站| 亚洲高清免费视频| 曰本成人黄色| 美日韩免费视频| 欧美激情在线| 亚洲伦理在线| 欧美日韩国产综合久久| 最新亚洲视频| 亚洲视频在线看| 国产毛片精品视频| 欧美在线国产| 男人的天堂亚洲| 亚洲国产高清高潮精品美女| 欧美va亚洲va香蕉在线| 亚洲国产精品成人va在线观看| 亚洲人成毛片在线播放女女| 欧美国产日韩一区二区在线观看 | 欧美一区二区三区四区在线观看地址 | 亚洲午夜视频在线| 欧美中文字幕精品| 国产一区二区三区免费不卡| 久久国产视频网| 亚洲国产精品va| 亚洲天天影视| 国产无一区二区| 玖玖玖国产精品| 亚洲精品在线三区| 欧美亚洲在线播放| 在线播放中文一区| 欧美精品二区三区四区免费看视频| 日韩亚洲国产精品| 久久国产精品99精品国产| 亚洲成人在线免费| 欧美日韩一区二区视频在线| 国产精品入口尤物| 久久国产99| 亚洲国产日韩欧美| 欧美亚洲成人精品| 久久九九全国免费精品观看| 亚洲国产高清一区| 欧美在线视频播放| 日韩午夜中文字幕| 国产一区香蕉久久| 欧美日韩免费观看一区二区三区 | 一本久道久久综合中文字幕| 欧美一区二区免费视频| 91久久久在线| 国产精品揄拍500视频| 另类春色校园亚洲| 亚洲欧美一区二区激情| 亚洲国产欧美久久| 久久久久久综合| 亚洲欧美精品在线| 亚洲精品午夜精品| 好吊妞**欧美| 国产精品日韩专区| 欧美顶级大胆免费视频| 久久精品国产一区二区三区| 99国产一区二区三精品乱码| 久久综合婷婷| 久久国产精品一区二区三区四区 | 亚洲激情第一区| 国内免费精品永久在线视频| 欧美日韩中文字幕在线| 免费亚洲一区二区| 久久精品在线免费观看| 亚洲永久精品大片| 99视频有精品| 亚洲免费大片| 最新日韩av| 亚洲国产欧美久久| 亚洲电影av| 欧美激情一区二区三区蜜桃视频| 久久爱www.| 久久国产精品一区二区三区四区| 亚洲女女女同性video| 亚洲在线播放| 亚洲一区二区三区四区五区午夜 | 久久精品论坛| 久久gogo国模裸体人体| 久久国产精品99久久久久久老狼 | 欧美中文字幕视频| 欧美一二三视频| 性欧美长视频| 久久精品成人欧美大片古装| 欧美一区二区在线观看| 久久国产加勒比精品无码| 久久精品成人一区二区三区| 久久久国产成人精品| 久久人人爽人人| 免费欧美在线视频| 欧美成人综合一区| 亚洲激情成人在线| 中文久久精品| 欧美在线首页| 久久一区二区三区av| 欧美激情国产日韩| 欧美色精品在线视频| 国产精品久久一区二区三区| 国产欧美69| 精品成人国产| 日韩亚洲欧美一区| 先锋影音久久| 久久超碰97中文字幕| 欧美xxx在线观看| 亚洲精品久久久久久久久久久| 日韩午夜激情av| 午夜精品一区二区三区四区 | 欧美日韩国产美| 国产精品免费网站| 在线观看欧美一区| 亚洲天堂av在线免费| 久久久精品国产免大香伊| 欧美激情第三页| 一区二区三区成人| 久久美女艺术照精彩视频福利播放| 老司机精品视频网站| 国产精品v欧美精品v日本精品动漫| 国产亚洲制服色| 一本色道久久综合亚洲精品不卡| 欧美在线不卡| 亚洲精品永久免费精品| 久久精品国产第一区二区三区最新章节 | 欧美激情精品久久久久久变态| 国产精品视频导航| 亚洲人成人一区二区三区| 亚洲欧美一区二区激情| 欧美高清hd18日本| 亚洲一区二区伦理| 欧美激情亚洲自拍| 影音先锋另类| 欧美一区二区三区婷婷月色 | 欧美一级一区| 日韩视频免费观看| 久久福利资源站| 国产精品video| 一本色道久久综合亚洲精品小说 | 久久免费观看视频| 亚洲性图久久| 欧美视频免费在线| 99av国产精品欲麻豆|