關於C/C++ int (*t5)[3] 指標型別說明

gaopengtttt發表於2016-04-28
程式如下: 

8 #include<iostream>
  9 #include <unistd.h>
 10 using namespace std;
 11 
 12 
 13 int main(void)
 14 {
 15     unsigned int *t1 = new unsigned int[10];
 16     unsigned int t2[3]={1,2,3};
 17     unsigned int *t3;
 18     short       *t4 = new short;
 19     
 20     t3=t2;
 21     cout<< "dymic array szie is p t1:"<<sizeof(t1)<<endl;//不能對動態素組進行他返回是指標的大小
 22     cout<< "dymic short szie is p t4:"<<sizeof(t4)<<endl;//不能對動態分配short進行sizeof 他返回是指標的大小
 23     cout<< "static array size if p t2"<<sizeof(t2)<<endl;
 24     cout<< "static array pointer to t2 is p3 "<<sizeof(t3)<<endl;//不能對指向靜態指向的素組使用sizeof他返回是指標的大小
 25 
 26     delete t4;
 27     delete [] t1;
 28 
 29     unsigned int (*t5)[3];                                                                                                                                          
 30     t5 = &t2;
 31     t2+1;  //step is 4
 32     t5+1;  //step is 4*3=12 
 33 
 34     sleep(10);
 35 
 36 
 37 }

我們知道C/C++中陣列的名字是指向陣列第一個元素的指標,確實如此,我們可以*(p+1)來獲取下一個元素
考慮這裡的
 29     unsigned int (*t5)[3];                                                                                                                                          
 30     t5 = &t2;
 31     t2+1;  //step is 4
 32     t5+1;  //step is 4*3=12 

 
unsigned int t2[3]={1,2,3}; 是一個素組,那麼t2是陣列的名稱也是他的首地址
t5 = &t2;如果解釋呢其實如果我們這裡將t2作為素組的名稱,那麼&t2就是素組
的起始位置,他和t2視乎有相同的地址,但是
t2+1 
t5+1
他們的步長不同前者是4 後者這是這個素組的長度4*3
那麼我們如何宣告t5這種型別的指標,起始就是 int (*t5)[3];
他表明t5是一個指向3個int元素陣列的首地址的指標。
可以用GDB進行除錯

(gdb) p t2+1
$1 = (unsigned int *) 0x7fffffffea14
(gdb) p &t2
$2 = (unsigned int (*)[3]) 0x7fffffffea10
(gdb) p t5+1
$3 = (unsigned int (*)[3]) 0x7fffffffea1c
(gdb) 
是不是看得很清楚
 &t2為0x7fffffffea10 t2+1為0x7fffffffea14 t5+1為0x7fffffffea1c

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2090211/,如需轉載,請註明出處,否則將追究法律責任。

相關文章