首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言指針與數組深度融合(二):二維數組指針遍歷、指針作函數參數、冒泡排序實戰

     編輯:關於C語言

指針與數組進階:二維遍歷、函數傳遞、排序算法

指針不僅能指向一維數組,更能高效操作二維數組、作為函數參數傳遞數組、實現經典排序算法。本文通過 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 個元素。

二、數組指針作函數參數:三種傳遞方式

案例背景:求一維數組最大元素

方式 1:形參為數組 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] 直接操作原數組。

方式 2:形參為指針 int *b,下標法訪問


int sub_max(int *b, int n) {
    int temp = b[0];
    for(int j=1; j

b 為指針,但 b[j] 等價 *(b+j),語法直觀。

方式 3:形參為指針,純指針算術訪問


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 語言高效編程的核心技法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved