sizeof数组名

数组名到底是不是指针?

数组名在某些使用场合的时候的确可以看做指针处理,之前用c52开发的时候碰到一个问题,大概的意思就是sizeof函数指针数组名)/ sizeof数组首元素[0]),结果有些函数运行不到,用中间值打印出来后可以看到该值为1,但是我的数组不止一个元素,以至于除了第一个函数能运行到,后面的几个函数都执行不到。于是我以为sizeof数组名,实际就是sizeof一个指针,然后我用sizeof函数指针数组名)/ sizeof数组类型),(也有可能是编译器的问题,当时用的Keil C52)结果运行结果正常了。。。

但是数组名又不单单是指针,它还包含了数组长度信息,转到32位的MCU平台后,代码也是用sizeof函数指针数组名)/ sizeof数组首元素[0])或者sizeof函数指针数组名)/ sizeof数组类型)来确定数组长度和元素个数。而且正常工作于是测试如下:

/*********************************************************************************
*Copyright(C),1996-2021, Company
*FileName:  main.c
*Author:  wyp
*Version:  V1.0
*Date:
*Description:


*History:
  1.Date:
    Author:
    Modification:
  2.
**********************************************************************************/

/***************************************Includes***********************************/
#include <stdio.h>
#include "test.h"

/***************************************Macros***********************************/
typedef void (*fun)(void);

/***************************************Variables***********************************/
fun fun_pointer_buf[10]; //函数指针数组
int int_buf[3];          //int型数组
int *int_point_buf[2];   //int指针数组

/***************************************Functions***********************************/

void test_arry_len(int *buf) //数组名作为形参时的sizeof
{
    printf("len of function test buf = %d\r\n", sizeof(buf));
}

int main()
{
    int *p;
    printf("len of pointer = %d\r\n", sizeof(p));                       //判断指针类型大小
    printf("len of fun_pointer_buf = %d\r\n", sizeof(fun_pointer_buf)); //查看函数指针数组大小
    printf("len of intbuf = %d\r\n", sizeof(int_buf));                  //查看整型数组大小
    printf("len of int_point_buf = %d\r\n", sizeof(int_point_buf));     //查看指针类型数组大小
    test_arry_len(int_buf);                                             //查看数组名作为形参时的sizeof大小
    printf("len of external_buf = %d\r\n", sizeof(external_buf));       //查看外部整型数组大小
    return 0;
}

/* [] END OF FILE */

根据不同平台的编译特性指针长度或有不同;以下是在网上在线c语言编译运行的结果

可以看到整型指针长度是8,整型数组长度为12,指针类型数组长度为16,把int型数组名降级为指针作为形参传入函数,那么sizeof就只判断指针的长度而丢失了长度信息。

所以sizeof数组名本质上返回的是数组的总长度,而且数组名也有指针的特性,但是在作为形参传入函数后,数组名退化成普通指针。

这里如果把传入变量定义为数组如上面的   test_arry_len(int buf[])在编译的时候,如果函数内部使用sizeof的时候编译器会报警告但是不会报错。

下面是在本地编译器的编译结果,编译器是qm自带的gcc,版本是:

同时,上述用例还测试了定义在其他源文件中的数组,使用sizeof时不会影响计算数组大小,编译结果如下所示:

编译结果可以看到指针长度为4,其余使用方式可以看出数组名的特性。

ps:其中external_buf定义在test.c中并在test.h中用extern声明,在主函数中使用sizeof需要声明时,标注出数组具体长度。

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值