11.13 下午 矩阵顺时针旋转90度、函数传参为什么不能写成in[][]

发布于 10 天前  16 次阅读


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main() {
	int in[9][9];
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			scanf("%d", &in[i][j]);
		}
	}
	int sum1 = 0, sum2 = 0;
	for (int i = 0; i < 3; i++) {
		sum1+=in[i][i];
	}
	for (int i = 0; i < 3; i++) {
		sum2 += in[i][2 - i];
	}
	printf("%d %d", sum1, sum2);
	return 0;
}

这个是最基础的,分别求主对角线和副对角线的和

sum2 += in[i][2 - i];

在循环条件是i<3,但是运算时却是2-i

所以有关矩阵,请牢记数组下标第一个是0,而不是1


再看看矩阵的转置

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void printfs(int in[999][999], int ins[999][999], int m, int n) {
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			printf("%d", in[i][j]);
		}
		printf("\n");
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			printf("%d", ins[i][j]);
		}
		printf("\n");
	}
}

int main() {
	int in[999][999], m, n;
	scanf("%d %d", &m, &n);
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			scanf("%d", &in[i][j]);
		}
	}
	int ins[999][999];
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			ins[i][j] = in[m - 1 - j][i];
		}
	}
	printfs(in, ins, m, n);
	return 0;
}

第一点,void printfs(int in[999][999], int ins[999][999], int m, int n)


为什么不能是int in[][],int ins[][]

在 C 语言中,数组在函数传参时有一些特定的规则你不能使用不定大小的数组作为函数参数,例如 int in[][]int ins[][]。这是因为 C 语言需要知道数组的大小,以便正确地计算内存地址

为什么多维数组要明确除一维外的数组大小:

数组大小在 C 语言中,数组的维度必须在编译时已知对于多维数组,除了第一维,其他维度的大小必须在函数参数中明确指定。例如,int in[][999] 是合法的,但 int in[][] 不是,因为编译器无法确定第二维的大小

//也就是说,函数传参对第一维放松了要求,但是对于进一步的维度必须要先确认它们的大小(在 C 语言中,二维数组实际上是一个一维数组的数组)

指针的使用:在函数参数中,数组实际上会被转换为指针。对于一维数组,int arr[] 可以被视为 int *arr对于二维数组,int arr[m][n] 会被视为 int (*arr)[n]

int *arr在传一维数组时,arr表示指向该一维数组的首个元素的指针,传递的是首个元素的地址

int (*arr)[n] 也可以用于指向一个包含 nint 元素的数组,但它并不是用于一维数组的标准方式,同时,这样徒增麻烦

int (*arr)[n]多用于处理二维数组arr 指向的是一个一维数组(每一行),而 n 则表示每一行有n列。通过这种方式,C 语言能够有效地处理多维数组


在处理矩阵转置时,如果是要求顺时针旋转90度,那么你需要把头逆时针90度转过去看


除了注意针对ins的任何循环中的m和n外(意义互换了),ins[i][j] = in[m - 1 - j][i];这个核心代码必须强调

这个核心代码的右边不是[n-1-j],这是因为你在针对in时,m就是行,n就是列,要对它本身进行计算,而不是针对现在的ins

届ける言葉を今は育ててる
最后更新于 2024-11-13