二维数组与一维数组在应用中的区别

我们在将一个整型的一维数组名作为函数形参时常常使用 int arr[]或int *arr[],但在将一个整型的二维数组名作为函数形参时使用int brr[][]却错误,这是为什么呢?

下面我们将一维和二维数组将以区分:



由此我们知道

一维数组中arr它是一个指向整型元素的指针,而brr它是一个指向整型的一维数组的指针(数组指针),而不是指向整型元素元素地址的指针,因此我们在使用二维数组作为函数形参时应注明,所以应使用 int (*brr)[4];  注意:()不能少

若定义成int *brr[4]则表示有一个一维数组brr[4],该数组中的所有元素都是(int *)类型的元素(指针数组)。

实例:

#include<stdio.h>

void testBrr(int (*brr)[4], int m)  
{  
    for(int i = 0; i < m; ++i)  
        for(int j = 0; j < 4; ++j)  
        {  
            printf("a[%d][%d] = %d\n", i, j, brr[i][j]);  //也可以使用*(*(brr+i)+j);
        }  
}  
  
int main()  
{  
    int brr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8},{9,10,11,12}};  
    testBrr(brr, 3);  
} 

结果:


但是此时因为它标注了这个数组的大小,若其他长度不相等的数组调用此函数时会出现问题,所以应继续修改。

在上面我们知道brr[0]是指向二维数组首元素的地址,所以我们可以在函数形参时使用 int *brr或int brr[],在实参部分使用brr[0]

实例:

#include<stdio.h>

void testBrray(int *brr, int m, int n)  
{  
    for(int i = 0; i < m; ++i)  
        for(int j = 0; j < n; ++j)  
        { 
            printf("brr[%d][%d] = %d\n", i, j, *(brr + i * n +j));//必须使用*(brr + i * n +j)而不能使用brr[i][j]
  
        }  
}  
  
int main()  
{  
	int brr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8},{9,10,11,12}};  
    testBrray(brr[0], 3, 4);  
} 

结果:

由此我们知道此方法可行

当然有人会问为什么输出时必须使用*(brr + i * n +j) 而不能使用brr[i][j]这是因为二维数组它虽然看起来是一行一行进行排列,但实际是所有元素在同一行,即第二行的第一个元素brr[1][0]在第一行的最后一个元素brr[0][3]后面

证明:

#include<stdio.h>

int main()  
{  
	int brr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8},{9,10,11,12}};  
	printf("brr[%d][%d]的地址=%d\nbrr[%d][%d]的地址=%d\n",0,3,&brr[0][3],1,0,&brr[1][0]);
   
} 

结果:


由结果看出brr[1][0]与brr[0][3]的地址相差4个字节(1个int长度),验证了二维数组是在一行进行排列的。

当然我们也可以在传递实参时将brr这个数组指针强转为整形指针,在调用时传递实参(int *)brr

实例:

#include<stdio.h>

void Show(int *arr,int m,int n)
{
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
		  printf("%3d",*(arr+n*i+j));  //必须使用*(brr + i * n +j)而不能使用brr[i][j]
 
		}
		printf("\n");
	}
}


int main()
{
	int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
   Show((int *)arr,3,4);
   return 0;
}

结果:



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值