二维数组的变量名是一维指针的指针,指针的步长是已知的,一维指针的长度需要在传递引用的过程中显式标出,void transpose(int mat[][3], int row) 不可简化为void transpose(int mat[][], int row)
#include <stdio.h>
void transpose(int mat[][3], int row)
{
for(int i=0; i<row; i++)
{
for(int j=i; j<row; j++)
{
int temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
}
int main(void)
{
int mat[3][3];
int row=3;
for(int i=0; i<row; i++)
{
for(int j=0; j<row; j++)
{
scanf("%d", &mat[i][j]);
}
}
transpose(mat, row);
for(int i=0; i<row; i++)
{
for(int j=0; j<row; j++)
{
printf("%d", mat[i][j]);
if(j==2) printf(" \n");
else printf(" ");
}
}
return 0;
}
有的时候我们希望子函数可以接受任意长宽的二维数组,此时上述方法因为必须标出第二维的宽度,便有局限性,可以采用以下方法:
#include <stdio.h>
void transpose(int** mat, int row)
{
for(int i=0; i<row; i++)
{
for(int j=i; j<row; j++)
{
int temp = *((int*)mat+i*row+j);
*((int*)mat+i*row+j) = *((int*)mat+j*row+i);
*((int*)mat+j*row+i) = temp;
}
}
}
int main(void)
{
int mat[3][3];
int row=3;
for(int i=0; i<row; i++)
{
for(int j=0; j<row; j++)
{
scanf("%d", &mat[i][j]);
}
}
transpose(mat, row);
for(int i=0; i<row; i++)
{
for(int j=0; j<row; j++)
{
printf("%d", mat[i][j] );
if(j==2) printf(" \n");
else printf(" ");
}
}
return 0;
}
初始化可采用以下方法
float **mat=new float *[3];//开辟行空间
for(int i=0;i<3;i++)
mat[i]=new float[i];//开辟列空间
本文探讨了C语言中二维数组在函数参数传递时的特性,指出二维数组的变量名实质上是一维指针的指针,而其步长是固定的。在传递引用时,如果要使用void transpose(int mat[][3], int row)这样的函数定义,不能简化为void transpose(int mat[][], int row),因为需要明确第二维的宽度。对于接受任意大小二维数组的场景,文章提出了相应的解决方案。"
119869789,5736932,Android TextToSpeech 深入理解与应用,"['Android开发', '语音技术', 'TextToSpeech', 'Android语音合成']
7万+

被折叠的 条评论
为什么被折叠?



