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

指標與陣列(二):二維陣列指標、函數參數傳遞與冒泡排序

     編輯:C 語言基礎

二維陣列指標表示

二維陣列在記憶體按行存放。指向二維陣列的指標:

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指標傳指標

範例 1:尋找一維陣列最大值(形參為陣列)

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;
}

範例 2:形參為指標,陣列元素用下標法

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;
}

範例 3:形參為指標,陣列元素用指標運算

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++;。

範例 4:返回最大值元素指標(含索引)


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;
}

範例 5:指標實現冒泡排序


#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");
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved