现在的位置: 首页 > 综合 > 正文

c语言中二维数组的问题

2013年10月29日 ⁄ 综合 ⁄ 共 2452字 ⁄ 字号 评论关闭

 在论坛上看到一个关于二维数组讨论的帖子,觉得很有价值就整理了一下转帖了过来

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**  

  BCBDev-C++中说

不能将int   (*)[5]转化成int**  

   

  所以我想应该是老师弄错了,

 

实际上一个二维数组的类型是int   (*)[n](其中n是第二维的维数)  

    

   

  int   (*p)[5]   =   a;  

   

  就行了。  

   

  我跟我们老师说,她坚持说int**是对的。  

  大家怎么看啊?我都有点晕了。

 

 

2 goodboy1881

 

 如果要如此写,你写  

  int**   p   =(int**)a;  

  尝试一下。  

  要不然你说这个a怎么解释,是二维数组第一行的首指针?还是二维数组的首指针?

 

3

 她说二维数组是int**型的,但是赋值指针的时候和类型又是不一样的,两者是有区别的。  

  所以我感到很奇怪,为什么赋值的时候不一样的,还要说二位数组是int**  

  要不然为什么不能用一个int**的指针指向它呢?这不是明显的赋值不相容吗?

 

5 SaiRoseLearning......

 

指针!=数组名  

    int   a[4][5]它的类型绝对不是int**  

   只是函数在传参数的时候会将数组转化为指针  

   具体的查书了,c专家编程上有详细讲解

 

6 qingyuan18zealot_tang

 二维数组名不能简单理解成二维的指针,

int   a[4][5]

a是二维数组的首地址,但它不是一个int   **型的指针。  

 int**   p   =   a;

这样赋值是错误的,用指针对二维数组的操作应该参考用指针数组(int   *   p[4])

 

或者或者行指针((int   *)p[4])的方式

 

7 anyy0929()

 

 同意上面的,a是二维数组的首地址,

 

P是指向指针的指针,不能这样赋值~~~

 

8 ywhs()

 

 我想问的是

抱歉!评论已关闭.