2017-04-13 84 views
-1

您好我正在聲明具有N行和M列,並與利用常規的數組元素的訪問方法連續的數字負荷會需要兩個維整數數組的C程序。 N和M是等於10我需要使用此功能顯示特定行技術

void showRow(int *arrayName, int rowNumber, int nColsInRow) 

然後我需要使用該功能,以顯示整個陣列顯示陣列的特定行。 我必須在下面的代碼中使用showCol函數做同樣的事情。 我的代碼中有兩個函數,但我對如何實現它們感到困惑。我感謝你們可以給予的幫助。

int main(void){ 

int array[10][10]; 
int i,j; 
int *row0, *row1, *row2, *row3, *row4, *row5, *temp; 


int add = 0; 

for(i = 0; i < 10; i++) 
{ 
    for(j = 0; j < 10; j++) 
    { 
     array[i][j]= add; 
     add++; 

    } 

} 


for(i = 0; i < 10; i++) 
{ 
    for(j = 0; j < 10; j++) 
    { 
     printf("%d ", array[i][j]); 


    } 
    printf(" \n"); 

} 

void showRow(int *array, int rowNumber, int nColsInRow) 
{ 
    row0 = &(array[0][0]); 
    row1 = &(array[1][0]); 
    row2 = &(array[2][0]); 
    row3 = &(array[3][0]); 
    row4 = &(array[4][0]); 
    row5 = &(array[5][0]); 
    row6 = &(array[6][0]); 
    row7 = &(array[7][0]); 
    row8 = &(array[8][0]); 
    row9 = &(array[9][0]); 
    row10 = &(array[10][0]); 
    for(j = 0; j < 10; j++) 
    { 
     printf(" %d", *(rowNumber + j); 

    } 

//} 

void showCol(int *array, int colNumber, int nRowsInCol) 
{ 
    col0 = &(array[0][0]); 
    col1 = &(array[0][1]); 
    col2 = &(array[0][2]); 
    col3 = &(array[0][3]); 
    col4 = &(array[0][4]); 
    col5 = &(array[0][5]); 
    col6 = &(array[0][6]); 
    col7 = &(array[0][7]); 
    col8 = &(array[0][8]); 
    col9 = &(array[0][9]); 
    col10 = &(array[0][10]); 
    for(j = 0; j < 10; j++) 
    { 
     printf(" %d", *(col + j); 

    } 

} 

} 
+0

那些不能編譯。 – BLUEPIXY

+0

nColsInRow代表什麼? –

+0

我知道,但我不知道如何使它工作 –

回答

0

在不改變的功能的簽名,試試這個代碼:

#include <stdio.h> 
#include <stdlib.h> 

void showRow(int *array, int rowNumber, int nColsInRow); 
void showCol(int *array, int colNumber, int nRowsInCol); 


int 
main(void) 
{ 

    int array[10][10]; 
    int i,j; 
    int *p; 
    int add = 0; 

    p = (int *)array; //Set a pointer point to this array. 

    for(i = 0; i < 10; i++) 
    { 
     for(j = 0; j < 10; j++) 
     { 
      array[i][j]= add; 
      add++; 
     } 
    } 


    for(i = 0; i < 10; i++) 
    { 
     for(j = 0; j < 10; j++) 
     { 
     printf("%d ", array[i][j]); 
     } 
     printf(" \n"); 
    } 
    showRow(p, 2, 3); 
    showCol(p, 2, 3); 
} 

void showRow(int *array, int rowNumber, int nColsInRow) 
{ 
    int *row = &array[rowNumber*10];//row points at the particular row. 
    int j; 

    for(j = 0; j < 10; j++) 
    { 
     printf(" %d", row[j]); 

    } 

    printf("\n%d\n", row[nColsInRow]); 

} 

void showCol(int *array, int colNumber, int nRowsInCol) 
{ 
    int *col = &array[colNumber]; //col points at the particular col of first row. 
    int j, n; 

    for(j = 0; j < 100; j = j + 10) //Increment 10 since row size is 10. 
    { 
    printf(" %d", col[j]); 
    } 

    n = 10 * nRowsInCol; 
    printf("\n%d\n", col[n]); 

} 

說明:一個整數數組存儲在一個連續的存儲器。 在這種情況下,雖然這是一個2維陣列,它 存儲在4個字節100連續單元。 (假設 大小爲int是4在你的計算機。)

隨着INT指針,它可以指向任何索引。

例如int * p = & array [58]; p點在這個陣列的第58個單位。 使用這個概念,現在你可以做數學得到 特定的行或列。

+0

在我不知道爲什麼數量,但對於showRow功能nColsRow做任何改變的代碼,對於showCol函數,colNumber不會更改任何內容。我可能看錯了,但我打開了數字,看它是否會打印正確的東西,這是正確的,但每個參數的其中一個參數做了一些奇怪的事情。 –

+0

修改此行:int * col =&array [colNumber]; // col指向第一行的特定列。 嘗試它,如果它的工作。 –

+0

謝謝你現在的作品 –

1

我做了一個改變的showRow函數接受一個空指針。然後在showRow函數中,我把它轉換回2個dim數組。在那之後,你可以像對其他2個暗淡陣列一樣對待它。

void showRow(void *array, int rowNumber, int nColsInRow) 
{ 
    int (*a)[10] = (int (*)[10]) array; 
    int i; 
    for (i=0; i < nColsInRow; i++) { 
     printf("%d\n", a[rowNumber][i]); 
    } 

} 

int main() 
{ 
    int array[10][10]; 
    int i,j; 


    int add = 0; 

    for(i = 0; i < 10; i++) 
    { 
     for(j = 0; j < 10; j++) 
     { 
      array[i][j]= add; 
      add++; 

     } 

    } 

    showRow (&array, 1, 10); 

    return 0; 
} 
+0

這是一個很好的解決方案。我從不知道這個解決方案存在。這是void *的一個很好的用法。但類型轉換可能非常棘手。 int(* a)[10]類型的語法看起來像返回int的數組10的函數指針。但它不是因爲它沒有(void)int(* a)[10](void)。所以在這種情況下,變量a是int的10的數組的指針。謝謝。 –

+0

是的,C中的類型轉換很棘手。但是,公平地說,C中很多事情都是棘手的。:)只要我得到足夠的代表,我就會爲你的答案投票。 – SharpSol