指針不僅能指向一維數組,更能高效操作二維數組、作為函數參數傳遞數組、實現經典排序算法。本文通過 5 個完整案例層層遞進。
int a[3][4], *ptr = a[0]; // ptr 指向首元素 a[0][0]
// 輸入
for(i=0;i<3;i++) for(j=0;j<4;j++) scanf("%d", ptr++);
// 輸出(需重置指針)
ptr = a[0];
for(i=0;i<3;i++) {
for(j=0;j<4;j++) printf("%4d", *ptr++);
printf("\n");
}
原理: 二維數組內存按行連續存放,a[0] 即首地址,ptr++ 依次訪問所有 12 個元素。
int b[]
int sub_max(int b[], int n) {
int temp = b[0];
for(int j=1; j
實參 ptr(指向 a)傳給形參 b,b 與 a 共用內存,下標法 b[j] 直接操作原數組。
int *b,下標法訪問
int sub_max(int *b, int n) {
int temp = b[0];
for(int j=1; j
b 為指針,但 b[j] 等價 *(b+j),語法直觀。
int sub_max(int *b, int n) {
int temp = *b++; // 先取值再指針後移
for(int j=1; j
*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; // 返回最大元素地址
}
main() {
int *s = max(a, 10);
printf("max=%d, index=%d", *s, s-a); // 指針相減得下標
}
精妙之處: p-a 即元素相對首地址的偏移量(下標),s-a 直接得出最大元素下標。
#define N 10
void input(int arr[], int n); // 下標法輸入
void sort(int *ptr, int n); // 指針法排序
void output(int *ptr, int n); // 指針法輸出
main() {
int a[N], *p = a;
input(a, N);
sort(p, N);
output(p, N);
}
void input(int arr[], int n) {
for(int i=0; i *(ptr+j+1)) { // 指針算術比較相鄰元素
int t = *(ptr+j);
*(ptr+j) = *(ptr+j+1);
*(ptr+j+1) = t;
}
}
void output(int *ptr, int n) {
for(; ptr-arr < n; ptr++) printf("%4d", *ptr); // ptr-arr 需外部 arr 可見,或傳入 arr
printf("\n");
}
冒泡核心: *(ptr+j) 與 *(ptr+j+1) 比較交換,n-1 趟將最大元素逐步「冒泡」到末尾。
從二維數組線性遍歷、三種函數參數傳遞風格、返回指針獲取下標、到模塊化冒泡排序,這組案例完整展示了指針與數組無縫融合的威力,是 C 語言高效編程的核心技法。