关于返回二维数组指针问题
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 }
这是用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 }
我把函数里的形参改为int **x,int **y;
报错,这说明int a[n][n],a是int (*)[5],即a代表的地址是指二维数组某列的首地址,即是一个一维数组指针(二维数组本质上是以数组作为数组元素的数组,即“数组的数组”),而int **x,x是二维数组指针。
以上是关于关于返回二维数组指针问题的主要内容,如果未能解决你的问题,请参考以下文章