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

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

二维数组的地址与一维数组的地址的不同点是:它除了有元素地址外,还有标识各行起始位置的行首地址(称为行的首地址)。
行的首地址和行的首元素的地址具有相同的地址值,但是它们是两种不同的地址:若有定义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是二维数组指针。

时间: 2024-10-29 19:05:44

关于返回二维数组指针问题的相关文章

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

&lt;24&gt;【掌握】二维数组指针定义、初始化+

[掌握]二维数组指针定义.初始化 数组指针: 定义一个指针变量,让这个指针变量指向一维数组的元素 二维数组指针 行指针,用来指向二维数组的每一行,存放的是行的首地址 定义格式: 数据类型 (*行指针变量名)[数组第二维的长度]; 二维数组指针的初始化 int a[2][3]; int b[2][2]; float f1[4][4]; //假设我要定义一个指向数组a的一个行指针 // a = &a[0] = &a[0][0] = a[0] int (*p)[3] = a; 二维数组指针的使用

二维数组指针

关于一维数组的指针 例子: int a[3]={1,2,3}; int *p=a; printf("%d",*p); 输出为1 一维数组指针就是该一维数组第一元素的地址,取值运算*结果是第一个元素存储值. 再看二元数组 例子: int v[2][5]={{1,2,3,4,5},{6,7,8,9,10}}; int (*a)[5]=v; printf("%p,%p\n",a,a+1); printf("%p,%p\n",*a,*(a+1)); 输出

二维数组指针及二维动态数组的分配问题

在我以前的文章中都有讲过关于数组指针及指针数组的相关问题,但是讲得不够深入,我后来后了别人写的博客后觉得人家的确实写得好, 也学到了不少东西,对以前的问题有深的领悟了,于是准备结合这些博客和文章再稍微深入一点讲讲这些问题.这些指针的问题是C语言中的基础与关键 而且一旦出现这些问题,不太好找bug的来源,有时候不得不借助反汇编. 参考文章: http://c.biancheng.net/cpp/html/476.html       C语言指针数组和数组指针 http://blog.csdn.ne

例看二维数组,指针,二维数组指针

例程: /****************************************************** * * 文件名:例程 * * 文件描述:例看二维数组,指针,二维数组指针 * * 创建人:Jesse * * 版本号: * * 修改记录: * ******************************************************/ #include <stdio.h> #define ROW 3 #define LINE 3 void main(voi

关于 二维数组指针

概括的说,指针其实就是可变数组的首地址,说是可变数组,是 指其包含内容的数量的可变的,并且是可动态申请和释放的,从而充 分节约宝贵的内存资源.我一向喜欢一维数组,除非万不得已,我一 般是不用二维数组的,多维的则更是很少涉足了.因为一维简单,容 易理解,而用指针指向的多维数组就具有相当的复杂性了,也因此更 具有讨论的必要.     闲话少说,这里我就以三个二维数组的比较来展开讨论:     (1).int **Ptr;     (2).int *Ptr[ 5 ];     (3).int ( *P

指针数组和二维数组指针变量

指针数组 概念: 一个数组的元素值为指针则是指针数组. 指针数组是一组有序的指针的集合. 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量. 指针数组说明的一般形式为: 类型说明符 *数组名[数组长度] 其中类型说明符为指针值所指向的变量的类型. 例如: int *pa[3] 表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量. 1.用一个指针数组来指向一个二维数组. 指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数

c语言中数组,指针数组,数组指针,二维数组指针

1.数组和指针 int array[5] = {1,2,3,4,5};// 定义数组 // 1. 指针和数组的关系 int * pa = array; pa = array; // p[0] == *(p+0) == array[0] == *(array+0) printf("%p\n", pa); printf("%p\n", array); /* 访问数组两种方式 1. 下标法访问 数组名[下标] 指针[下标] 下标:偏移量 2. 指针法访问 *(p+1) *

C语言数组篇(五)多级指针和二维数组指针的区别

多级指针 以二级指针为例 二级指针的由来是 指针数组 的指针形式. int *p[10] 读取的顺序是 p[10] --> 10个空间的数组 * p[10] --> 这10个空间的数组里面存放的数据都是 指针型的数据 int *p[10] --> 数组里面每个指针指向的空间存放的是int型的数据 int *p[10] --> int **p; p: 指针数组的数组名,也是数组的首地址. *p 数组里面存放的指针 **p 数组里面存放的指针 指向的空间 的内容 二维数组指针: 二维数