user-0 提问: 指针 求二维数组的最大值

回复:
user: user-1
content: 引用 2 楼 lz20120808 的回复:[quote=引用 1 楼 qq423399099 的回复:] 代码如下，6个位置我做了标注  # include <stdio.h>  int main() { 	int a[5][5]; 	int *pa, i, n, m; 	int max, c, row, col; 	pa = &a[0][0]; //@#1 	scanf("%d%d", &n, &m); 	for(i = 0; i < n * m; pa = (i % m == m -1 ? &a[(i + 1) / m][0] : pa + 1), i++) //@#2 		scanf("%d", pa); 	pa = &a[0][0]; //@#3 	max = a[0][0]; //@#4 	c = 0; 	for(i = 0; i < n * m; i++) 	{ 		if(max < *(pa + i + (i / m) * (5 - m))) //@#5 		{ 			max =  *(pa + i + (i / m) * (5 - m)); //@#6 			c = i; 		} 	} 	printf("%d\n",  max); 	printf("%d %d\n", c/m, c%m); 	return 0; }  下面是运行结果：   2处，直接pa=pa+1 5处和6处 max < *(pa+i) 这样不更简单吗？ [/quote] 不能直接+1，如果你输入n=2,m=3,输入3个元素以后他要从a[0][2]变到a[1][0],你直接+1会从a[0][2]变到a[0][3], 这种没有初始化过的数组你使用这种元素的值结果是不确定的

user: user-1
content: 引用 4 楼 lz20120808 的回复:[quote=引用 3 楼 qq423399099 的回复:] [quote=引用 2 楼 lz20120808 的回复:] [quote=引用 1 楼 qq423399099 的回复:] 代码如下，6个位置我做了标注  # include <stdio.h>  int main() { 	int a[5][5]; 	int *pa, i, n, m; 	int max, c, row, col; 	pa = &a[0][0]; //@#1 	scanf("%d%d", &n, &m); 	for(i = 0; i < n * m; pa = (i % m == m -1 ? &a[(i + 1) / m][0] : pa + 1), i++) //@#2 		scanf("%d", pa); 	pa = &a[0][0]; //@#3 	max = a[0][0]; //@#4 	c = 0; 	for(i = 0; i < n * m; i++) 	{ 		if(max < *(pa + i + (i / m) * (5 - m))) //@#5 		{ 			max =  *(pa + i + (i / m) * (5 - m)); //@#6 			c = i; 		} 	} 	printf("%d\n",  max); 	printf("%d %d\n", c/m, c%m); 	return 0; }  下面是运行结果：   2处，直接pa=pa+1 5处和6处 max < *(pa+i) 这样不更简单吗？ [/quote] 不能直接+1，如果你输入n=2,m=3,输入3个元素以后他要从a[0][2]变到a[1][0],你直接+1会从a[0][2]变到a[0][3], 这种没有初始化过的数组你使用这种元素的值结果是不确定的[/quote] 2行三列，不会有a[0][3]啊，其实我认为*p把二维数组变成了一位数组，只是地址在加1，不是值[/quote] 它不管你输入的n,m是多少，它直接就是int a[5][5];不是根据你输入的n和m来动态创建数组大小的

user: user-2
content: 引用 3 楼 qq423399099 的回复:[quote=引用 2 楼 lz20120808 的回复:] [quote=引用 1 楼 qq423399099 的回复:] 代码如下，6个位置我做了标注  # include <stdio.h>  int main() { 	int a[5][5]; 	int *pa, i, n, m; 	int max, c, row, col; 	pa = &a[0][0]; //@#1 	scanf("%d%d", &n, &m); 	for(i = 0; i < n * m; pa = (i % m == m -1 ? &a[(i + 1) / m][0] : pa + 1), i++) //@#2 		scanf("%d", pa); 	pa = &a[0][0]; //@#3 	max = a[0][0]; //@#4 	c = 0; 	for(i = 0; i < n * m; i++) 	{ 		if(max < *(pa + i + (i / m) * (5 - m))) //@#5 		{ 			max =  *(pa + i + (i / m) * (5 - m)); //@#6 			c = i; 		} 	} 	printf("%d\n",  max); 	printf("%d %d\n", c/m, c%m); 	return 0; }  下面是运行结果：   2处，直接pa=pa+1 5处和6处 max < *(pa+i) 这样不更简单吗？ [/quote] 不能直接+1，如果你输入n=2,m=3,输入3个元素以后他要从a[0][2]变到a[1][0],你直接+1会从a[0][2]变到a[0][3], 这种没有初始化过的数组你使用这种元素的值结果是不确定的[/quote] 2行三列，不会有a[0][3]啊，其实我认为*p把二维数组变成了一位数组，只是地址在加1，不是值

user: user-2
content: 引用 1 楼 qq423399099 的回复:代码如下，6个位置我做了标注  # include <stdio.h>  int main() { 	int a[5][5]; 	int *pa, i, n, m; 	int max, c, row, col; 	pa = &a[0][0]; //@#1 	scanf("%d%d", &n, &m); 	for(i = 0; i < n * m; pa = (i % m == m -1 ? &a[(i + 1) / m][0] : pa + 1), i++) //@#2 		scanf("%d", pa); 	pa = &a[0][0]; //@#3 	max = a[0][0]; //@#4 	c = 0; 	for(i = 0; i < n * m; i++) 	{ 		if(max < *(pa + i + (i / m) * (5 - m))) //@#5 		{ 			max =  *(pa + i + (i / m) * (5 - m)); //@#6 			c = i; 		} 	} 	printf("%d\n",  max); 	printf("%d %d\n", c/m, c%m); 	return 0; }  下面是运行结果：   2处，直接pa=pa+1 5处和6处 max < *(pa+i) 这样不更简单吗？

user: user-1
content: 代码如下，6个位置我做了标注  # include <stdio.h>  int main() { 	int a[5][5]; 	int *pa, i, n, m; 	int max, c, row, col; 	pa = &a[0][0]; //@#1 	scanf("%d%d", &n, &m); 	for(i = 0; i < n * m; pa = (i % m == m -1 ? &a[(i + 1) / m][0] : pa + 1), i++) //@#2 		scanf("%d", pa); 	pa = &a[0][0]; //@#3 	max = a[0][0]; //@#4 	c = 0; 	for(i = 0; i < n * m; i++) 	{ 		if(max < *(pa + i + (i / m) * (5 - m))) //@#5 		{ 			max =  *(pa + i + (i / m) * (5 - m)); //@#6 			c = i; 		} 	} 	printf("%d\n",  max); 	printf("%d %d\n", c/m, c%m); 	return 0; }  下面是运行结果：