C語言聲明的神器解碼環
今天看到有位童鞋在TopLanguage上面提了個問題:
int a[][3]={1,2,3,4,5,6};
int (*b)[3]=a;
不用編譯器,說說b里是什么?
其實這種問題在《C專家編程》的P65中的神器解碼環中有很詳盡的解釋。
在這里首先考察等式左邊的int (*b)[3]
而把a的值賦給b,表明是將b指向a。
之后sagasw給出一個demo,可以更清楚的了解指針相關各種。
int a[][3]={1,2,3,4,5,6};
int (*b)[3]=a;
不用編譯器,說說b里是什么?
其實這種問題在《C專家編程》的P65中的神器解碼環中有很詳盡的解釋。
在這里首先考察等式左邊的int (*b)[3]
1.最左邊的標識符是b | 表示b是... |
2.b的左邊是* |
表明b是指向...的指針 |
3.*的左邊是左括號 |
左括號把已經處理的部分聲明組合在一起,知道遇見相應的右括號 |
4.(*b)左邊是方括號 |
表示大小為3的數組 |
5.剩下的符號形成基本類型int |
表明b是一個指針,它指向一個大小為3的int型數組。 |
而把a的值賦給b,表明是將b指向a。
之后sagasw給出一個demo,可以更清楚的了解指針相關各種。
int main(int argc, char* argv[])
{
int a[][3]={1,2,3,4,5,6};
int (*b)[3]=a;
printf("a %p b %p \n", a, b);
++b;
printf("a1 %p a10 %p a11 %p b %p \n", a[1], &a[1][0], &a[1][1], b);
++b;
printf("a %p b %p \n", a[2], b);
return 0;
}
{
int a[][3]={1,2,3,4,5,6};
int (*b)[3]=a;
printf("a %p b %p \n", a, b);
++b;
printf("a1 %p a10 %p a11 %p b %p \n", a[1], &a[1][0], &a[1][1], b);
++b;
printf("a %p b %p \n", a[2], b);
return 0;
}
posted on 2010-06-09 23:09 meglory 閱讀(202) 評論(0) 編輯 收藏 引用 所屬分類: C/C++