关于返回二维数组指针问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于返回二维数组指针问题相关的知识,希望对你有一定的参考价值。

   所谓的二维数组指针,是指针的指针,指的就是二维数组在内存中的存储地址。

二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址)。
行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义int a[5][5];则a[0][0]是a数组

首行首列元素(代表该元素的值)。而&a[0][0]是首行首元素的地址。&&a[0][0]则是首行的首地址。从这个意义上讲,可以
说行的首地址是一种二重地址,即指针的指针。

    废话不多说,先贴代码:

技术分享
 1     > Created Time: 2016年09月29日 星期四 18时23分12秒
 2  ************************************************************************/
 3 
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6 #define n 5
 7 
 8 int **multi(int x[n][n],int y[n][n])
 9 {
10     int **t;
11     t=(int **)malloc(sizeof(int*)*n);
12     int i;
13     for(i=0;i<n;i++)
14     {
15         t[i]=(int*)malloc(sizeof(int)*n);
16     }
17 
18     int a=0,b=0;
19     for(a=0;a<n;a++)
20     {
21         for(b=0;b<n;b++)
22         {
23             int k=0;
24             for(k=0;k<n;k++)
25             {
26                 t[a][b]+=x[a][k]*y[k][b];
27             }
28         }
29     }
30 
31     return t;
32 }
33 int main()
34 {
35     int a[n][n];
36     int b[n][n];
37 
38     int i=0,j=0;
39     for(i=0;i<n;i++)
40     {
41         for(j=0;j<n;j++)
42         {
43             a[i][j]=1;
44             b[i][j]=2;
45         }
46     }
47 
48     int **ans;
49     ans=multi(a,b);
50 
51     int c=0,d=0;
52     for(c=0;c<n;c++)
53     {
54         for(d=0;d<n;d++)
55         {
56             printf("%d ",ans[c][d]);
57         }
58 
59         printf("\\n");
60     }
61 
62     return 0;
63 }
View Code

这是用c写的两简单矩阵相乘的代码。主要看int **multi(int x[n][n],int y[n][n]),这个函数,它返回一个二维数组指针。

   在函数末尾return t;  t就是一个二维数组指针,即指针的指针。

技术分享

 

错误代码

技术分享
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define n 5
 4 
 5 int **multi(int **x,int **y)
 6 {
 7     int **t;
 8     t=(int **)malloc(sizeof(int*)*n);
 9     int i;
10     for(i=0;i<n;i++)
11     {
12         t[i]=(int*)malloc(sizeof(int)*n);
13     }
14 
15     int a=0,b=0;
16     for(a=0;a<n;a++)
17     {
18         for(b=0;b<n;b++)
19         {
20             int k=0;
21             for(k=0;k<n;k++)
22             {
23                 t[a][b]+=x[a][k]*y[k][b];
24             }
25         }
26     }
27 
28     return t;
29 }
30 int main()
31 {
32     int a[n][n];
33     int b[n][n];
34 
35     int i=0,j=0;
36     for(i=0;i<n;i++)
37     {
38         for(j=0;j<n;j++)
39         {
40             a[i][j]=1;
41             b[i][j]=2;
42         }
43     }
44 
45     int **ans;
46     ans=multi(a,b);
47 
48     int c=0,d=0;
49     for(c=0;c<n;c++)
50     {
51         for(d=0;d<n;d++)
52         {
53             printf("%d ",ans[c][d]);
54         }
55 
56         printf("\\n");
57     }
58 
59     return 0;
60 }
View Code

我把函数里的形参改为int **x,int **y;

技术分享

报错,这说明int a[n][n],a是int  (*)[5],即a代表的地址是指二维数组某列的首地址,即是一个一维数组指针(二维数组本质上是以数组作为数组元素的数组,即“数组的数组”),而int **x,x是二维数组指针。



 

 

以上是关于关于返回二维数组指针问题的主要内容,如果未能解决你的问题,请参考以下文章

知识分享:C/C++函数返回二维数组指针

C语言中关于二维数据指针的问题?

分配并返回一个二维数组指针,其中行和列是运行时参数

关于c语言二维数组列指针初始化

C 语言二级指针案例 ( 字符串切割 | 返回 二维数组 作为结果 )

二维数组赋值给一维数组,子函数返回获取临时变量的指针导致问题