代码编织梦想

C语言二维数组与二维指针

近期通过一道例题,我总结了一下二维数组、二维指针、二维数组首地址三者之间的关系,请网友多多批评指点。

例题

Alt

错误的代码

#include<stdio.h>
#include<stdlib.h>
int fun(int arr[5][5])
{
	int sum=0,i;
	for(i=0;i<=4;i++)
	{
		sum+=arr[i][i];sum+=arr[4-i][i];
	}return sum;
}
int main()
{
	int i,sum=0;
	int** arr=(int**)malloc(5*sizeof(int*));
	for(i=0;i<=4;i++)
	{
		arr[i]=(int*)malloc(5*sizeof(int));
	}
	for(i=0;i<=4;i++)
	{
		scanf("%d %d %d %d %d",&arr[i][0],&arr[i][1],&arr[i][2],&arr[i][3],&arr[i][4]);
	}
	int a=fun(arr);
	printf("sum=%d\n",a);
	for(i=0;i<=4;i++)
	{
		free(arr[i]);
	}free(arr);
} 

错误原因

没有理解形参列表中int arr[5][5]的意义,如果函数声明时形参是int fun(int arr[5][5]),那么说明调用fun函数的时候应该给一个5行5列的二维数组第一个元素的地址作为参数,这5行5列共25个数据的地址是连续分布的。
但是在上述程序中,主函数里的arr是我用malloc命令在堆区创建的。arr不能称作是某一个二维数组的首地址。严格来说arr只是一个一维数组的首地址,而这个一维数组是由5个指针类型的变量组成的,每个指针类型的变量是一个包含5个int类型数据的一维数组的首地址。因此,arr因为数据类型不同,不能传给int fun(int arr[5][5])做参数。

正确的代码

问题的根源在于形参与实参的数据类型不匹配,解决方案是统一形参与实参的数据类型。要么形参和实参都是二维数组的首地址,要么形参和实参都是二维指针。

方案一

#include<stdio.h>
#include<stdlib.h>
int fun(int arr[5][5])
{
	int sum=0,i;
	for(i=0;i<=4;i++)
	{
		sum+=arr[i][i];sum+=arr[4-i][i];
	}return sum;
}
int main()
{
	int i,sum=0;
	int arr[5][5]={{0,0,0,0,0},{1,1,1,1,1},{2,2,2,2,2},{3,3,3,3,3},{4,4,4,4,4}};
	for(i=0;i<=4;i++)
	{
		scanf("%d %d %d %d %d",&arr[i][0],&arr[i][1],&arr[i][2],&arr[i][3],&arr[i][4]);
	}
	int a=fun(arr);//二维数组的数组名即为二维数组的首地址
	printf("sum=%d\n",a);
} 

方案二

#include<stdio.h>
#include<stdlib.h>
int fun(int** arr)
{
	int sum=0,i;
	for(i=0;i<=4;i++)
	{
		sum+=arr[i][i];sum+=arr[4-i][i];
	}return sum;
}
int main()
{
	int i,sum=0;
	int** arr=(int**)malloc(5*sizeof(int*));
	for(i=0;i<=4;i++)
	{
		arr[i]=(int*)malloc(5*sizeof(int));
	}
	for(i=0;i<=4;i++)
	{
		scanf("%d %d %d %d %d",&arr[i][0],&arr[i][1],&arr[i][2],&arr[i][3],&arr[i][4]);
	}
	printf("sum=%d\n",fun(arr));
	for(i=0;i<=4;i++)
	{
		free(arr[i]);
	}free(arr);
} 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Xiyu_Tian/article/details/116716187

二维指针和二维数组的区别-爱代码爱编程

1、定义指向数组的指针,需要指定数组的列 char arr[][3]或char (*arr)[3];//二维数组本质上是一维数组 *p[3]指针数组;数组的每一个元素都是指针 **p二维指针;指向指针的指针 2、

二维数组与双重指针-爱代码爱编程

一、简介 1、二维数组     int array[10][10];     函数声明: void fun(int a[][10])     函数调用:fun(array);    访问: 一般使用a[i][j]来访问数组中的元素 2、指针数组     int *array[10];     函数声明:void fun(int *a[

c语言:定义指向二维数组的指针变量-爱代码爱编程

C语言:定义指向二维数组的指针变量 标签: C语言 二维数组 指针 by 小威威 1.引入 我们知道,要在函数中处理数组,一般要给函数传递指针。那么,对于一维int数组a[10],我们可以定义一个int *类型

c语言:使用指针操作二维数组_geek宝宝的博客-爱代码爱编程_指针指向二维数组

任务代码: (1)用指向二维数组元素的指针: #include <stdio.h> int main( ) { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0];p<a[0]+12;p++) { prin

二维数组和二维指针的关系_很黑的黑的博客-爱代码爱编程

今天在看一个关于链表的题时,看到一个                            void  RemoveNode(ListNode **pHead,int value)                                    {                                             if(p

指针与二维数组_西邮陈冠希的博客-爱代码爱编程_指针和二维数组

二维数组的本质     double matrix[3][4];  double matrix[3][4];    =>double [4] matrix[3];    令type为double [4],所以double [4] matrix[3]为type matrix[3],这说明,matrix是一个一维数组,有3个元素;每个元素是type,

二维数组与二级指针_空空空空空如也的博客-爱代码爱编程_二维数组相当于二级指针

二维数组 首先,内存是连续的,二维数组中的数据块在内存中也是一块连续的顺序的存储的空间。二维数组名相当于指针,但是它指向的是一个数组类型。 int a [4][5]={} 那么二维数组a 在内存中的分配应该是顺序分配 :----[5]--[5]--[5]--[5]----(此处[5]表示一个长度为5的一维数组)。 二维数组名 a 指向一维数组a[0

c++二维数组作参数时和二维指针的异同_傻白兔的博客-爱代码爱编程

二维数组传参 二维数组不同于一位数组,一维数组传参数时只需要传指针即可,无需指定大小。二维做参数时必须指定第二维的大小,否则编译不过。 void lalala(int a[][],int m, int n) //编译报错 void lalala(int a[][10],int m, int n) //编译通过   因为对于表达式a[i][j

c语言 字符指针数组和二维字符数组的区别-爱代码爱编程

对于下面的这段代码 #include <stdio.h> char *arr[5]; char s[5] = "11"; int main(void) { arr[0] = s; scanf("%s"

二维数组与指针(c语言)-爱代码爱编程

1.二维数组 定义及初始化: int a[2][3]={{1,2,3}, {4,5,6}}; 上面定义并初始化了二维数组,类似于2行3列的行列式,可以认为由两个数组组成,a[0]和a[1]两个数组。 2.二维数组指针类型 //数组元素的地址 int *p0=&a[1][1]; //一维数组的地址 int (*p1)

彻底理解C语言二维数组和指针-爱代码爱编程

C语言二维数组以及用指针操作相对于一组数组而言有些复杂,这里尝试通过类比的方式快速理解。 首先我们要理解一组数组以及其指针操作方法。比如定义数组:int a[10],则a为数组第0个元素的地址,即:a ==&a[0];a+1表示 a[1]的地址,即a+1 == &a[1],依次类推有:a+i == &a[i]。等式两边同时进行取值

二维数组与数组指针详解-爱代码爱编程

二维数组 深入理解二维数组 首先定义一个二维数组 int a[2][3]={{1,2,3},{4,5,6}}; #or int a[2][2]={1,2,3,4}; 新的理解:我们可以这样认为,a可以看作是一个一维数组,包含2个元素,每个元素恰好是包含3个整型的元素,a这个名字的值成了指向一个包含3个整型元素的数组的指针(你学过数组指针就该知道,他

c语言二维数组错误语法,C语言二维数组怎么写好-爱代码爱编程

C语言二维数组怎么写好 有同学在面对二维数组的时候,常常会犯浑。尤其是使用函数传参的时候,有老师讲到一维数组传参后就等价于一级指针,部分同学举一反三自学成才,想当然地认为二维数组传参后就等价于二级指针,这是错误的。 假如,有如下代码: int a[2][3]; // 一个二维数组 function(a); // 将二维数组传参给一个函数 上述

二维数组和指针之间的关系详解_二维数组与数组指针间的关系-爱代码爱编程

一、引言 说起二维数组可能首先想到的是各种嵌套的for循环,二维数组的初始化,二维数组的赋值,二维数组的输出等各种问题,当然了,数组的问题永远离不开指针,而二维数组所能联系到的就是二维指针了,此文则是着重讲解二维数组与二维指针之间的关系。 二、初始化与赋值 #define M 4 #define N 5 int arr[M][N] = {