重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
正如
10年积累的网站建设、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有太仆寺免费网站建设让你可以放心的选择与我们合作。
楼下
所言
int
**p
,定义的p是一个指向int*型的
指针
int
(*p)[10]是一个指向
数组
的指针
数组长度为10
假如定义成
deal(int
**p),传
参数
时要加强制类型转换:
deal((int**)a);
并且使用p时不能用
下标
,p[2][3]是错误的,因为不知道p指向的int*型的长度,无法编译成*(p+2*10+3)
必须自己写成*(p+2*10+3)来调用
假如定义成
deal(int
(*p)[10])就不一样了,
编译器
就能知道p是一个指向长度为10的数组的指针
那么p[2][3]就能编译成*(p+2*10+3)了
总之,C语言是很灵活的,不同的定义
方式
配上不同的
用法
,都是能得到正确的结果的
不知道这么说楼主明白了没?
同样的还有
多维数组
对多维指针的问题,楼主可以自己类推一下
#include stdio.h
#include time.h
#define N 5
void print(int A[N][N])
{
int i, j;
for (i = 0; i N; i++)
{
for (j = 0; j N; j++)
printf("%4d ", A[i][j]);
printf("\n");
}
}
void find(int A[N][N])
{
int i, j;
int mini = 0, minj = 0, maxi = 0, maxj = 0;
for (i = 0; i N; i++)
for (j = 0; j N; j++)
{
if (A[i][j] A[maxi][maxj])
{
maxi = i;
maxj = j;
}
if (A[i][j] A[mini][minj])
{
mini = i;
minj = j;
}
}
printf("最大值%d, 行号 %d, 列号 %d\n", A[maxi][maxj], maxi, maxj);
printf("最小值%d, 行号 %d, 列号 %d\n", A[mini][minj], mini, minj);
}
void sort(int A[N][N])
{
int b[N * N], t;
int i, j, k = 0;
for (i = 0; i N; i++)
for (j = 0; j N; j++)
b[k++] = A[i][j];
for (i = 0; i N * N - 1; i++)
for (j = 0; j N * N - 1 - i; j++)
if (b[j] b[j + 1])
{
t = b[j];
b[j] = b[j + 1];
b[j + 1] = t;
}
k = 0;
for (i = 0; i N; i++)
for (j = 0; j N; j++)
A[i][j] = b[k++];
}
int main()
{
int A[N][N];
int i, j;
srand(time(NULL));
for (i = 0; i N; i++)
for (j = 0; j N; j++)
A[i][j] = rand() % 1000;
print(A);
find(A);
sort(A);
print(A);
return 0;
}
函数调用不能这么用,第36行。C标准里面返回值是不能直接返回一个数组的,只能返回数组的首地址。输出学生成绩和每科成绩那个函数,你可以定义一个全局变量数组,还有求平均值最好用float 或者double,用int会造成精度流失。帮你调试了一下,大概就这样吧
对的,是我的第二种方法。
1.可以用指针。
void
Func(int
**array,
int
m,
int
n);
在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:
*((int*)array
+
n*i
+
j);
2.可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:
void
Func(int
array[3][10]);
void
Func(int
array[][10]);
二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:
void
Func(int
array[][]);
因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多
少列,不能只指定一维而不指定第二维,下面写法是错误的:
void
Func(int
array[3][]);
实参数组维数可以大于形参数组,例如实参数组定义为:
void
Func(int
array[3][10]);
而形参数组定义为:
int
array[5][10];
这时形参数组只取实参数组的一部分,其余部分不起作用。