問題的來源是
typedef char UU[3];
是什麼東西?
當宣告成
UU *pUU;
又是代表什麼東西呢?
typedef 的基礎定義就是 rename. 所以 typedef int AA;
就表示 AA 就是 int 這個名稱.
所以可以得到上面問題的答案是:
typedef char UU[3];
解釋為 : UU 是一個 3個char的矩陣.
UU *pUU;
解釋為 : *pUU 是一個宣告成 3個char矩陣的指標
等同於寫成 --> char (*pUU)[3];
要注意的是,它不同於如下宣告:
char *pUU[3];
解釋為: 有3個宣告為char pointer的矩陣.
----------------------(所以直接寫code去證明他,你可以看到以下的結果)-----------------------------------------------
(1) 當 pUU pointer +1 時, 位址是shift了 3個 char
e.g.
pUU+0 = 0x80004E94 //初始位址
pUU+1 = 0x80004E97 //shit 1後的位址
(2)當你在前面加"*",並不是印出value,而是所記錄的位址.
e.g.
*(pUU+1) = 0x80004E97 //printf an address not a value
(有點像 pointer to pointer.但又不太像)
(p.s. 有人解釋為 pointer to array. http://stackoverflow.com/questions/4523497/typedef-fixed-length-array)
(3)所以要用如下的寫法, 才會得到實際的值
e.g.
(*pUU)[0] = 0x1
(*pUU)[1] = 0x2
-----------------------------------------------------------------------------------------------------------------------------------------------------
=====================================================
= 這裡先做一個 基礎知識的練習, 基礎好的人,可以跳到 下面的進階練習
===================================================
char *pAA; //實驗 指向矩陣的pointer
char **ppAA; //實驗 指標的指標會如何
char (*paArr)[3]; //實驗 我們直接宣告成一個指向array[3]型別的pointer
char AA[3] = {0x11,0x22,0x33};
pAA = AA;
//ppAA = AA; *ppAA will has AA's value
ppAA = pAA;
paArr = AA;
printf("AA = 0x%x \n",AA);
printf("&AA = 0x%x \n",&AA);
printf("pAA = 0x%x \n",pAA);
printf("*pAA = 0x%x \n",*pAA);
printf("pAA[0] = 0x%x \n",pAA[0]);
printf("pAA[1] = 0x%x \n\n",pAA[1]);
//printf("(*pAA)[0]) = 0x%x \n",(*pAA)[0])); //[compile error]subscripted value is neither array nor pointer
printf("ppAA = 0x%x \n",ppAA);
printf("*ppAA = 0x%x \n",*ppAA);
printf("ppAA[0] = 0x%x \n",ppAA[0]);
printf("paArr = 0x%x \n",paArr);
printf("&paArr = 0x%x \n",&paArr);
printf("*paArr = 0x%x \n",*paArr); //get the address
printf("paArr[0] = 0x%x \n",paArr[0]);
printf("paArr[1] = 0x%x \n",paArr[1]);
printf("(*paArr)[0] = 0x%x \n",(*paArr)[0]); //get the value
printf("(*paArr)[1] = 0x%x \n",(*paArr)[1]);
-------------------------------------------------------------------
Result
-------------------------------------------------------------------
AA = 0x807FEB40
&AA = 0x807FEB40 //用這樣的寫法,也是可以得到array address
pAA = 0x807FEB40
*pAA = 0x11 //get the value of AA[0]
pAA[0] = 0x11 //get the value of AA[0]
pAA[1] = 0x22 //get the vlaue of AA[1]
ppAA = 0x807FEB40
*ppAA = 0x332211 //pointer to pointer 加 * 得到的是 value
ppAA[0] = 0x332211 //still is a value
paArr = 0x807FEB40
&paArr = 0x807FEB48 //現在這個 pointer的所在地
*paArr = 0x807FEB40 //得到的是所記錄的位址
paArr[0] = 0x807FEB40
paArr[1] = 0x807FEB43
(*paArr)[0] = 0x11 //得到值
(*paArr)[1] = 0x22
=====================================================
= 進階練習
===================================================
typedef char UU[3];
UU gUU = {0x01,0x02,0x03};
void titan_test(void)
{
UU *pUU;
UU *pUU2;
pUU = gUU;
pUU2 = &gUU; //跟(pUU = gUU)是一樣的,都是指向array的pointer
printf("gUU = 0x%x \n",gUU);
printf("&gUU = 0x%x \n",&gUU); //得到 array address
printf("gUU[0] = 0x%x \n",gUU[0]);
printf("gUU[1] = 0x%x \n",gUU[1]);
printf("gUU[2] = 0x%x \n",gUU[2]);
printf("sizeof(gUU) = %d \n",sizeof(gUU)); //char[3] 的size大小
printf("pUU = 0x%x \n",pUU);
printf("&pUU = 0x%x \n",&pUU); //得到 array address
printf("*pUU = 0x%x \n",*pUU); //得到 pointer address
printf("pUU[0] = 0x%x \n",pUU[0]); //get address
printf("pUU[1] = 0x%x \n",pUU[1]);
printf("pUU[2] = 0x%x \n",pUU[2]);
printf("pUU+0 = 0x%x \n",pUU+0); //get address
printf("pUU+1 = 0x%x \n",pUU+1);
printf("pUU+2 = 0x%x \n",pUU+2);
printf("*(pUU+0) = 0x%x \n",*(pUU+0)); //get address
printf("*(pUU+1) = 0x%x \n",*(pUU+1));
printf("*(pUU+2) = 0x%x \n",*(pUU+2));
printf("*(*(pUU+0)) = 0x%x \n",*(*(pUU+0))); //get th value
printf("*(*(pUU+1)) = 0x%x \n",*(*(pUU+1)));
printf("*(*(pUU+2)) = 0x%x \n",*(*(pUU+2)));
printf("(*pUU)[0] = 0x%x \n",(*pUU)[0]); //get th value
printf("(*pUU)[1] = 0x%x \n",(*pUU)[1]);
//printf("*(*pUU)[0] = 0x%x \n",*(*pUU)[0]); //invalid type argument of `unary *'
//printf("*(*pUU)[1] = 0x%x \n",*(*pUU)[1]);
printf("sizeof(pUU) = %d \n",sizeof(pUU));//指標int的size. 不是char[3]的size
printf("pUU2 = 0x%x \n",pUU2);
printf("&pUU2 = 0x%x \n",&pUU2);
printf("*pUU2 = 0x%x \n",*pUU2);
printf("pUU2[0] = 0x%x \n",pUU2[0]);
printf("pUU2[1] = 0x%x \n",pUU2[1]);
printf("pUU2[2] = 0x%x \n",pUU2[2]);
printf("pUU2+1 = 0x%x \n",pUU2+1);
printf("*(pUU2+1) = 0x%x \n",*(pUU2+1));
}
-------------------------------------------------------------------
Result
-------------------------------------------------------------------
UU *pUU;
UU *pUU2;
pUU = gUU;
pUU2 = &gUU;
gUU = 0x80004E94
&gUU = 0x80004E94 //得到 array address
gUU[0] = 0x1
gUU[1] = 0x2
gUU[2] = 0x3
sizeof(gUU) = 3 //char[3] 的size大小
pUU = 0x80004E94
&pUU = 0x807FEB4C //得到 pointer address
*pUU = 0x80004E94 //得到 pUU所記錄的內容 (e.g. address)
pUU[0] = 0x80004E94
pUU[1] = 0x80004E97 //be shifted 3 char
pUU[2] = 0x80004E9A
pUU+0 = 0x80004E94
pUU+1 = 0x80004E97 //be shifted 3 char
pUU+2 = 0x80004E9A
*(pUU+0) = 0x80004E94 //still get the array address
*(pUU+1) = 0x80004E97
*(pUU+2) = 0x80004E9A
*(*(pUU+0)) = 0x1 //get the value
*(*(pUU+1)) = 0x0 //can't get the correct value, because address has been shift 3 char.
*(*(pUU+2)) = 0x0
(*pUU)[0] = 0x1 //get th value
(*pUU)[1] = 0x2
sizeof(pUU) = 4 //this is the sizoe of a pointer (e.g. 4bytes)
pUU2 = 0x80004E94
&pUU2 = 0x807FEB50 //得到 pointer address
*pUU2 = 0x80004E94
pUU2[0] = 0x80004E94
pUU2[1] = 0x80004E97
pUU2[2] = 0x80004E9A
pUU2+1 = 0x80004E97
*(pUU2+1) = 0x80004E97
留言列表