以下代碼容易產(chǎn)生混亂:
int a[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[5] = &a; for(auto i = p; i != p + 3; i++) { for(auto j = *i; j != *i + 5; j++) { cout<<*j<<" "; } cout<<i<<endl; }分析:
int (*p)[5];
p不解指針是指向數(shù)組的指針,解指針后是指向元素的指針,都是指針,當(dāng)對(duì)p進(jìn)行賦值后,p 和 *p值是一樣的,只不過(guò)類型不一樣,類型不一樣,就會(huì)導(dǎo)致加上一個(gè)數(shù)后,實(shí)際的值變化是不一樣的:p + n得到的值是p + n * 5 * sizeof(int);而*p + n 得到的值是 *p + n * sizeof(int);
這和指向基本類型的指針的道理是一樣的:
int a = 5;
int *p = &a;
char *p1 = (char *)p;
p + n得到的值是 p + n * sizeof(int); p1 + n 得到的是 p + n * sizeof(char);
對(duì)p的賦值:
從概念上講,p是指向數(shù)組的指針,如果有int a[3][4], p = a[0]是不對(duì)的,因?yàn)閍是指向數(shù)組的數(shù)組類型,a[0]是數(shù)組類型,應(yīng)該把數(shù)組的地址賦值給指向數(shù)組的指針;所以正確的賦值應(yīng)該是:p = &a[0]
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注