为了账号安全,请及时绑定邮箱和手机立即绑定

传递数组的大小

传递数组的大小

C
墨色风雨 2019-06-25 15:33:36
传递数组的大小据我所知,在编译时计算和替换了一个常量的运算符。既然如此,一个函数在程序中的不同点被传递给不同的数组,它的大小如何计算?我可以将它作为参数传递给函数,但是如果我没有必要添加另一个参数的话,我宁愿不必添加另一个参数。这里有一个例子来说明我要问的问题:#include <stdio.h>#include <stdlib.h>#define SIZEOF(a) ( sizeof a / sizeof a[0] )void printarray( double x[], int );int main(){         double array1[ 100 ];         printf( "The size of array1 = %ld.\n", SIZEOF( array1 ));         printf( "The size of array1 = %ld.\n", sizeof array1 );         printf( "The size of array1[0] = %ld.\n\n", sizeof array1[0] );         printarray( array1, SIZEOF( array1 ) );         return EXIT_SUCCESS;}void printarray( double p[], int s ){         int i;         // THIS IS WHAT DOESN"T WORK, SO AS A CONSEQUENCE, I PASS THE          // SIZE IN AS A SECOND PARAMETER, WHICH I'D RATHER NOT DO.         printf( "The size of p calculated = %ld.\n", SIZEOF( p ));         printf( "The size of p = %ld.\n", sizeof p );         printf( "The size of p[0] = %ld.\n", sizeof p[0] );         for( i = 0; i < s; i++ )                 printf( "Eelement %d = %lf.\n", i, p[i] );         return;}
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

没有神奇的解决办法。C不是一种反思性语言。对象并不自动知道它们是什么。

但你有很多选择:

  1. 显然,添加一个参数
  2. 将调用包装在宏中并自动添加参数
  3. 使用更复杂的对象。定义一个包含动态数组以及数组大小的结构。然后,传递结构的地址。


查看完整回答
反对 回复 2019-06-25
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

函数参数实际上从来没有数组类型。当编译器看到

void printarray( double p[], int s )

甚至

void printarray( double p[100], int s )

它将任何一个转换为

void printarray( double* p, int s )

所以sizeof(p)sizeof(double*)..是的,您必须将大小作为参数传递。


查看完整回答
反对 回复 2019-06-25
?
手掌心

TA贡献1942条经验 获得超3个赞

问题是您的函数没有接收数组值,而是接收指针值。

的操作数除外。sizeof或一元&运算符,或者它是一个字符串文字,用于初始化声明中的另一个数组,一个类型为“数组”的表达式。T“将被转换为”类型“指针T“它的值将是数组的第一个元素的地址。

因此,当你打电话给printarray,类型array1的“100元素数组”隐式转换。double“指向”指针double“因此,参数的类型pdouble *,不是double [100].

在函数参数声明的上下文中,T a[]是相同的T *a.

这就是为什么必须单独传递数组大小的原因;


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 409 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信