問題的來源是

    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

arrow
arrow

    titan2ya 發表在 痞客邦 留言(0) 人氣()