二維陣列在記憶體按行存放。指向二維陣列的指標:
int a[3][4], *ptr = a[0]; // 指向第一行首元素
視為一維陣列處理,共 12 個元素。元素 a[i][j] 對應 *(ptr + i*4 + j)。
#include <stdio.h>
int main() {
int a[3][4], *ptr;
int i, j;
ptr = a[0];
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
scanf("%d", ptr++); // 連續輸入 12 個數
ptr = a[0];
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++)
printf("%4d", *ptr++);
printf("\n");
}
return 0;
}
利用函數處理陣列時,傳遞陣列首址(指標)實現「傳址調用」,函數內修改影響原陣列。
| 實參 | 形參 | 說明 |
|---|---|---|
| 陣列名 | 陣列聲明 int b[] | 退化為指標 |
| 陣列名 | 指標聲明 int *b | 直接接收首址 |
| 指標變數 | 陣列聲明 int b[] | 指標當陣列用 |
| 指標變數 | 指標聲明 int *b | 指標傳指標 |
int sub_max(int b[], int n) {
int temp = b[0], j;
for (j = 1; j < n; j++)
if (temp < b[j]) temp = b[j];
return temp;
}
int main() {
int a[10], *ptr = a, n, max;
for (n = 0; n < 10; n++) scanf("%d", &a[n]);
max = sub_max(ptr, 10); // 實參為指標
printf("max = %d\n", max);
return 0;
}
int sub_max(int *b, int n) {
int temp = b[0], j;
for (j = 1; j < n; j++)
if (temp < b[j]) temp = b[j];
return temp;
}
int sub_max(int *b, int n) {
int temp = *b++, j;
for (j = 1; j < n; j++)
if (temp < *b) temp = *b++;
return temp;
}
temp = *b++ 等價於 temp = *b; b++;。
int *max(int *a, int n) {
int *p, *t;
for (p = a, t = a; p - a < n; p++)
if (*p > *t) t = p;
return t; // 返回最大值元素位址
}
int main() {
int a[10], *s, i;
for (i = 0; i < 10; i++) scanf("%d", a+i);
s = max(a, 10);
printf("max = %d, index = %d\n", *s, s - a); // 索引 = 位址差
return 0;
}
#define N 10
void input(int arr[], int n) {
for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
}
void sort(int *ptr, int n) {
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-1-i; j++)
if (*(ptr+j) > *(ptr+j+1)) {
int t = *(ptr+j);
*(ptr+j) = *(ptr+j+1);
*(ptr+j+1) = t;
}
}
void output(int *ptr, int n) {
for (; ptr - ptr < n; ptr++) // 錯誤:ptr - ptr 恆為 0
printf("%4d", *ptr); // 應用另一指標或索引
printf("\n");
}
修正 output:
void output(int arr[], int n) {
int *ptr = arr;
for (; ptr - arr < n; ptr++)
printf("%4d", *ptr);
printf("\n");
}