簡體   English   中英

C編程中的Arrays

[英]Arrays in C programming

我正在研究 output 的以下二維數組程序,結果如圖所示:

我似乎無法獲得結果的最小值並將其以數組形式顯示。 代碼如下:

#include<stdio.h>
#define NUMROWS 2
#define NUMCOLS 3

//accessing elements of 2D array using pointers
int main(void){

    const int table[NUMROWS][NUMCOLS]={{1,2,3},{5,6,7}};
    int minvals[NUMROWS];
    int i, j;
    int *ptr = &table;

    //accessing the elements of 2D array using ptr
    printf("table values:  min value\n");

    for(int i=0;i<NUMROWS;i++){
        for(int j=0;j<NUMCOLS;j++)
            printf("%d ",*((ptr+i*NUMCOLS)+j)); 
        printf("\n");
    }
    
    for(int i=0;i<NUMROWS;i++){
        for(int j=0;j<NUMCOLS;j++)
            printf("%d ",*((ptr+i*NUMCOLS)+j)<minvals[i]); 
    }
    return 0;
}

minvals的存在意味着您應該在繼續打印之前計算table的每個“行”的最小值。 就目前而言,如果您的程序正確計算了每個數組的最小值,您的打印將相當混亂。

無需進行任何棘手的手動指針操作。 簡單的數組訂閱更清晰。

讓我們從簡單開始,回到基礎,看看我們如何在一維數組中找到最小值,因為它是這個問題的核心。

要找到數組中的最小值,我們需要做一些事情:

  • 數組
  • 數組的長度
  • 要比較的初始值

數組本身顯然是table的每個子數組,在這種情況下,長度已知為NUMCOLS 我們的初始值應該是INT_MAX (或找到的另一個適合類型的最大常量<limits.h> ),這樣數組中的每個元素都等於或小於我們的初始值,或者是數組本身的值。

通常我們在這里選擇第二個選項,選擇數組中的第一個元素作為我們的初始值,並將其與第二個和以后的元素進行比較。

因此,在單個“行”中找到最小值看起來像這樣

const int row[NUMCOLS] = { 9, 2, 5 };
int min = row[0];

for (int i = 1; i < NUMCOLS; i++)
    if (row[i] < min)
        min = row[i];

但是由於我們想找到並記錄table中每個“行”的最小值,我們將使用嵌套循環。 我們將每個值存儲在minvals數組的關聯索引中,而不是之前的min變量。

for (i = 0; i < NUMROWS; i++) {
    minvals[i] = table[i][0];

    for (j = 1; j < NUMCOLS; j++)
        if (table[i][j] < minvals[i])
            minvals[i] = table[i][j];
}

當需要打印時,我們將重復我們的嵌套循環。 我們的內部循環打印table的每個“行”的每個元素,並且我們通過打印在minvals中找到的值與我們的“行”的相同索引來結束外部循環的每次迭代。

for (i = 0; i < NUMROWS; i++) {
    for (j = 0; j < NUMCOLS; j++)
        printf("%6d", table[i][j]);

    printf(":%6d\n", minvals[i]);
}

這是一個工作示例。

#include <stdio.h>
#define NUMROWS 2
#define NUMCOLS 3

int main(void) {
    const int table[NUMROWS][NUMCOLS] = {
        { 9, 2, 5 },
        { 3, -4, -12 }
    };
    int minvals[NUMROWS];
    int i, j;

    for (i = 0; i < NUMROWS; i++) {
        minvals[i] = table[i][0];

        for (j = 1; j < NUMCOLS; j++)
            if (table[i][j] < minvals[i])
                minvals[i] = table[i][j];
    }

    puts("Table value: minimum values");

    for (i = 0; i < NUMROWS; i++) {
        for (j = 0; j < NUMCOLS; j++)
            printf("%6d", table[i][j]);

        printf(":%6d\n", minvals[i]);
    }
}

一個很好的進一步練習是將用於查找最小值的內部循環的邏輯組合到更通用的 function 中。 它的 function 簽名看起來像

int min(int *array, size_t length);

允許它在不同大小的 arrays 上工作。 那么我們的外循環可以很簡單:

for (i = 0; i < NUMROWS; i++)
    minvals[i] = min(table[i], NUMCOLS);

int *ptr = &table;

是錯誤的,因為&tableint (*)[2][3]類型(即指向整個表的指針),而ptr是指向單個元素的指針。 此外,您的指針是非const ,因此不能指向const數組。

如果您希望ptr指向單個int值,則應按以下方式聲明它:

const int *ptr = &table[0][0];

此外,您正在讀取數組minvals的內容,盡管該數組包含未初始化的數據。 這沒有意義並導致未定義的行為。

而不是用表達式做復雜的指針算術

*((ptr+i*NUMCOLS)+j))

您可以簡單地編寫以下內容:

table[i][j]

這樣,您就不需要指針ptr並且您的代碼更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM