指向二维数组的指针测试
生活随笔
收集整理的這篇文章主要介紹了
指向二维数组的指针测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
定義a為二維數組后,有三種成份:數組本身、3個一維數組(a的每一行對應一個一維數組)、12個數組元素,
由此就有三種指針及對應的指針變量,
由于指針類型匹配是完全匹配,所以初始化形式必須嚴謹。
上面有人寫出
int (*p)[4]=&a;
則是類型不匹配,指向一維數組的指針變量指向了二維數組,盡管有些編譯器只給warning、盡管有人認為指針值(二維數組a和一維數組a[0]的地址值)是相同的,事實是類型不匹配、錯誤
還有人寫出
int *p = &a[0][0];/*或者int *p = a[0];*/
這個指針變量是指向數組元素的,沒有了數組結構信息,因此用該指針變量訪問數組元素時,只能再提供列數信息進行地址計算: *(p+i*列數+j)
結論是?
int (*p)[4]=a;/*或者int (*p)[4]=&a[0]*/
是嚴格指針類型匹配的,且p具有數組結構信息(列數),可以直接訪問數組元素
*(*(p+i)+j)等價于a[i][j]
提供一個小“伎倆”供分析用:指針(變量)左邊一個*可等效替換為右邊一個[],兩個*可等效替換為。。。
上面為引用自CSDN的討論
?
寫個程序測試一下
1: #include <stdio.h> 2: ? 3: int main() 4: { 5: int s[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}}; 6: int i, j; 7: int (*p)[5] = s;//=&s[0]; 8: int *q = &s[0][0]; 9: ? 10: printf("%d ",s[0][0]); 11: printf("%d ",*s[0]); 12: printf("%d ",**s); 13: 14: printf("%d ",*(*(p+2)+2) ); 15: printf("%d ",*(q+12)); 16: }轉載于:https://www.cnblogs.com/ppazhang/archive/2013/05/23/3094180.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的指向二维数组的指针测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为内部面试题库---(6)
- 下一篇: 单机最大tcp连接数