在论坛上看到一个关于二维数组讨论的帖子,觉得很有价值就整理了一下转帖了过来
1)二维数组 参数传递 和二维数组的定义是一个道理。
二维数组声明时要求给定第二维下标。(同样,多维数组声明时要求给定除第一维外其他所有维的下标)
这是因为不管几维数组在内存中的存储和一维数组没有本质区别,都是线性存储的,长度是各个维下标之积。
程序运行时访问二维数组的某元素时要靠各维下标作偏移指标,比如a[10][3],只有给定第二维下标“3”,
当你写a[10]时,程序才知道要从a这个位置向后移动10个“3”。
参数的道理相同,也是局部变量的一种,和你在函数中声明的变量没有太大区别(栈中的位置不同)。
所以必须这样写:void trans(int a[][3], int b[]);
#include <stdio.h>
#include <stdlib.h>
void trans(int a[][3], int b[]);
int main(void)
{
int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
int b[9];
int i;
trans(a, b);
for (i = 0; i < 9; i++)
printf("%d/t", b[i]);
printf("/n");
exit(0);
}
void trans (int a[][3], int b[]) { //形参
int i, j, k;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
b[k++] = a[i][j];
}
}
}
二维数组做参数
#include <iostream>
using namespace std;
void pb(char** a)
{
cout<<a[1][1];//只是测试调用成功不
}
int main()
{
char a[2][2];
for(int k=0;k<2;k++) {
for(int w=0;w<2;w++)
cin>>a[k][w];
}
pb((char **)a);
//二维数组做参数强制转换也有错!
return 0;
}
有什么好办法传递参数,吗,最好能有完整程序!谢谢
提问者: yjc_5252 - 试用期 一级 最佳答案
#include <iostream>
using namespace std;
void pb(char a[][2])
//一楼的稍改下,100改为2,即 a[][2]
{
cout<<a[1][1];
}
int main()
{
char a[2][2];
for(int k=0;k<2;k++){
for(int w=0;w<2;w++)
cin>>a[k][w];
}
pb(a);
return 0;
}
参考资料:一楼
0回答者: 江玉菡 - 试用期 一级 2009-5-25 20:56
其他回答 共 1 条
#include <iostream>
using namespace std;
void pb(char a[][100])
{
cout<<a[1][1];
}
int main()
{
char a[2][2];
for(int k=0;k<2;k++)
for(int w=0;w<2;w++)
cin>>a[k][w];
pb(a);
return 0;
}
搞人的二维数组指针,求助!
事情是这样的,我们老师说对于声明如下的
int a[4][5];
a这个二维数组,它的类型实际上是int**,
但是我在编程的时候试,写了下面的代码:
int a[4][5];
int** p = a;
VC中说不能将int [4][5]转化成int**,
BCB和Dev-C++中说
不能将int (*)[5]转化成int**,
所以我想应该是老师弄错了,
实际上一个二维数组的类型是int (*)[n](其中n是第二维的维数),
用
int (*p)[5] = a;
就行了。
我跟我们老师说,她坚持说int**是对的。
大家怎么看啊?我都有点晕了。
2 楼goodboy1881
如果要如此写,你写
int** p =(int**)a;
尝试一下。
要不然你说这个a怎么解释,是二维数组第一行的首指针?还是二维数组的首指针?
3 楼
她说二维数组是int**型的,但是赋值指针的时候和类型又是不一样的,两者是有区别的。
所以我感到很奇怪,为什么赋值的时候不一样的,还要说二位数组是int**,
要不然为什么不能用一个int**的指针指向它呢?这不是明显的赋值不相容吗?
5 楼SaiRose(Learning......)
指针!=数组名
int a[4][5]它的类型绝对不是int**
只是函数在传参数的时候会将数组转化为指针
具体的查书了,c专家编程上有详细讲解
6 楼qingyuan18(zealot_tang)
二维数组名不能简单理解成二维的指针,
int a[4][5];
a是二维数组的首地址,但它不是一个int **型的指针。
int** p = a;
这样赋值是错误的,用指针对二维数组的操作应该参考用指针数组(int * p[4])
或者或者行指针((int *)p[4])的方式
7 楼anyy0929()
同意上面的,a是二维数组的首地址,
而P是指向指针的指针,不能这样赋值~~~
8 楼ywhs()
我想问的是