題目:聲明一個二維 int 型數組 a,再聲明另一個一維數組指針數組 b,使該數組 b 的每一個指針分別指向二維數組 a 中的每一個元素(即每一個一維數組),然后利用數組 b 計算數組 a 的和。
圖解:畫圖幫助理解
????????我們要清楚什么是指針數組和數組指針,我們先要有知識儲備才能完美的做好這道題目.
//定義一個指針數組
int *p[3];
????????指針數組:數組的元素是一個個指針,[]的元素優先級高于*;指針數組跟其他的普通數組的區別在于數組的元素不一樣。
//定義一個數組指針
int (*p)[3];
????????一維數組指針:指一個指針指向int [3]型的數組,跟普通指針沒有區別。就是指向類型不一樣.
一維數組指針數組 b是什么呢?
在之前的筆記中,我們知道這是一個數組。那么數組的元素類型和變量類型的確定(之前的筆記),比如數組的元素就是把數組名+[]拿走,剩下的就是數組的元素類型。
那么該數組b的元素類型是數組指針,我們知道數組指針是指向數組的指針,所以這種復雜的類型就是:一個數組中存放著數組指針,數組的元素是數組指針。數據里面的指針指向一維數組。
代碼:
#include <stdio.h>
// 數組指針數組
int main(void)
{int a[2][3] = {1, 2, 3, 4, 5, 6}, sum = 0; // 定義一個二維數組 該二維數組有兩個元素// 數組指針數組b int (*)[] 數組指針類型int(*b[2])[3];b[0] = a;b[1] = a + 1; // 直接b[1]當作指針來用 a+1表示二維數組的第二個元素printf("%d\n", *(*(b[0] + 0))); // 數組指針類型的指向 1printf("%d\n", *(*(b[0] + 0) + 1)); // 數組指針類型的指向 2 b[0][0][1]printf("%d\n", b[0][0][1]);printf("%p\n", b[0] + 1); // +1是以類型的字節為單位進行偏移printf("%p\n", b[1]);// 第一種方式:for (int i = 0; i < 6; i++){sum += (*(*(b[0] + 0) + i)); // 等價于sum += b[0][0][i];}printf("第一種方式:%d\n", sum);// 第二種方式for (int i = 0; i < 2; i++){for (int n = 0; n < 3; n++){sum += b[i][0][n]; //等價于 *(*(b[i]+0)+i)}}printf("第二種方式:%d\n", sum);return 0;
}