C 使用指针和寻址技术显示数组的特定行

C 使用指针和寻址技术显示数组的特定行,c,arrays,data-structures,C,Arrays,Data Structures,您好,我正在编写一个C程序,该程序声明一个包含N行和M列的二维整数数组,并使用常规数组元素访问方法以连续数字加载该数组。N和M等于10。我需要使用此函数显示数组的特定行 void showRow(int *arrayName, int rowNumber, int nColsInRow) 然后我需要使用该函数来显示整个数组。 我必须对下面代码中的showCol函数执行相同的操作。 我的代码中有这两个函数,但我对如何实现它们感到困惑。我很感激你们能给我的帮助 int main(void){ i

您好,我正在编写一个C程序,该程序声明一个包含N行和M列的二维整数数组,并使用常规数组元素访问方法以连续数字加载该数组。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);

    }

}

}
int main(无效){
整数数组[10][10];
int i,j;
整数*第0行、*第1行、*第2行、*第3行、*第4行、*第5行、*临时;
int add=0;
对于(i=0;i<10;i++)
{
对于(j=0;j<10;j++)
{   
数组[i][j]=加法;
添加++;
}
}
对于(i=0;i<10;i++)
{
对于(j=0;j<10;j++)
{
printf(“%d”,数组[i][j]);
}
printf(“\n”);
}
void showRow(int*数组、int行数、int nColsInRow)
{
行0=&(数组[0][0]);
行1=&(数组[1][0]);
行2=&(数组[2][0]);
行3=&(数组[3][0]);
行4=&(数组[4][0]);
行5=&(数组[5][0]);
行6=&(数组[6][0]);
行7=&(数组[7][0]);
行8=&(数组[8][0]);
行9=&(数组[9][0]);
行10=&(数组[10][0]);
对于(j=0;j<10;j++)
{
printf(“%d”,*(行数+j);
}
//} 
void showCol(int*数组、int colNumber、int nRowsInCol)
{
col0=&(数组[0][0]);
col1=&(数组[0][1]);
col2=&(数组[0][2]);
col3=&(数组[0][3]);
col4=&(数组[0][4]);
col5=&(数组[0][5]);
col6=&(数组[0][6]);
col7=&(数组[0][7]);
col8=&(数组[0][8]);
col9=&(数组[0][9]);
col10=&(数组[0][10]);
对于(j=0;j<10;j++)
{
printf(“%d”,*(col+j);
}
}
}

在不更改函数签名的情况下,尝试以下代码:

 #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]);

 }
#包括
#包括
void showRow(int*数组、int行数、int nColsInRow);
void showCol(int*数组、int colNumber、int nRowsInCol);
int
主(空)
{
整数数组[10][10];
int i,j;
int*p;
int add=0;
p=(int*)数组;//设置指向此数组的指针点。
对于(i=0;i<10;i++)
{
对于(j=0;j<10;j++)
{   
数组[i][j]=加法;
添加++;
}
}
对于(i=0;i<10;i++)
{
对于(j=0;j<10;j++)
{
printf(“%d”,数组[i][j]);
}
printf(“\n”);
}
showRow(p,2,3);
showCol(p,2,3);
}
void showRow(int*数组、int行数、int nColsInRow)
{
int*row=&array[rowNumber*10];//行指向特定行。
int j;
对于(j=0;j<10;j++)
{
printf(“%d”,第[j]行);
}
printf(“\n%d\n”,行[nColsInRow]);
} 
void showCol(int*数组、int colNumber、int nRowsInCol)
{
int*col=&array[colNumber];//col指向第一行的特定col。
int j,n;
对于(j=0;j<100;j=j+10)//因为行大小是10,所以增加10。
{
printf(“%d”,col[j]);
}
n=10*nRowsInCol;
printf(“\n%d\n”,列[n]);
}
说明:整数数组存储在连续内存中。 在本例中,虽然它是一个二维数组, 它以4字节的100个连续单位存储。(假设 在您的计算机中,int的大小为4。)

使用int指针,它可以指向任何索引

e、 g.int*p=&数组[58]; p点位于该数组的第58个单位。 使用这个概念,现在你可以做数学来得到
特定的行或列。

我更改了showRow函数以接受空指针。然后在showRow函数内部,我将其转换回2维数组。之后,您可以像处理任何其他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;
}
void showRow(void*数组、int rowNumber、int nColsInRow)
{
int(*a)[10]=(int(*)[10])数组;
int i;
对于(i=0;i
那些无法编译。nColsInRow代表什么?我知道,但我不知道如何制作work@Nguaial它表示行中的列数,我不知道为什么,但是对于showRow函数,nColsRow没有改变代码,对于showCol函数,colNumber没有改变任何东西。我可能正在查看它g、 但是我把数字调大,看看它是否能打印出正确的东西,它是否正确,但是每个参数上的一个参数做了一些奇怪的事情;//col指向第一行的特定col。如果可行的话,试试看。这是一个很好的解决方案。我从来都不知道这个解决方案存在。这是void*的一个很好的用法。但是类型转换可能非常棘手。语法int(*a)[10]看起来有点像数组10的函数指针,返回int。但这不是因为它没有(void)在int(*a)[10](void)中。在这种情况下,变量a是int的10数组的指针。谢谢。是的,在C中进行类型转换是很棘手的。但是,公平地说,在C中有很多事情是棘手的:)一旦我得到足够的代表,我会投票给你的答案。