C语言经验分享:二维指针与二维数组的两种错误用法

本文介绍了C语言中二维数组和二维指针在作为函数参数时的两种常见错误用法,包括将二维数组的地址误解为`int **`和直接传递二维数组给函数。解释了C语言标准中关于数组名在函数参数中的转换规则,并提供了正确处理二维数组的函数参数方式。
摘要由CSDN通过智能技术生成

首先看一段代码:


void test(int *p)
{
   

}

int main()
{
   
    int arr[]= {
   30, 450,14,5};
    test(arr);
    return 0;
}

毫无疑问,上面这段代码是运行OK的。因为C语言标准中有以下规则:在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针。

第一种错误

那下面这段代码,会正确运行吗


#include <stdlib.h>

void test(int **p)
{
   

}
int main()
{
   
    int arr[]={
   30,450,14,5};
    test(&arr);
    return 0;
}

可能有的同学认为这段代码是正确的,因为数组作为函数参数时退化成一个指针,那么我对数组进行取址,这样&arr就是一个二维指针了,所以可以作为函数test的入参。

这个理由貌似有道理,但很遗憾,这段代码会报编译错误:


main.c:3:17: note: expected 'int **' but argument is of type 'int (*)[4]'
 void test(int **p)
           ~~~~~~^

这个错误是说,test函数期望的入参类型是int **。但是实际传入的参数类型是 int (*)[4],即实际传入的类型是指向数组的指针。

C语言标准中是定义了:在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针。但是你不能因为数组在函数参数中当成一个指针,你对数组名取地址&arr就认为它的类型就是指向指针的指针(int **),这样以为是错的,因为不具备这样的传递性。C语言规范中只规定了数组名作为函数的入参时会被当做一个指针,但是并没有规定对数组取地址会被当成指向指针的指针。

根据上面代码的报错信息提示,将不能编译通过的代码片段作一个小的修改,就会编译通过了:


#include <stdlib.h>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值