数组名到底是不是指针?
数组名在某些使用场合的时候的确可以看做指针处理,之前用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需要声明时,标注出数组具体长度。