传递数组的大小

传递数组的大小

据我所知,在编译时计算和替换了一个常量的运算符。既然如此,一个函数在程序中的不同点被传递给不同的数组,它的大小如何计算?我可以将它作为参数传递给函数,但是如果我没有必要添加另一个参数的话,我宁愿不必添加另一个参数。

这里有一个例子来说明我要问的问题:

#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;}


墨色风雨
浏览 410回答 3
3回答

素胚勾勒不出你

没有神奇的解决办法。C不是一种反思性语言。对象并不自动知道它们是什么。但你有很多选择:显然,添加一个参数将调用包装在宏中并自动添加参数使用更复杂的对象。定义一个包含动态数组以及数组大小的结构。然后,传递结构的地址。

慕尼黑8549860

函数参数实际上从来没有数组类型。当编译器看到void&nbsp;printarray(&nbsp;double&nbsp;p[],&nbsp;int&nbsp;s&nbsp;)甚至void&nbsp;printarray(&nbsp;double&nbsp;p[100],&nbsp;int&nbsp;s&nbsp;)它将任何一个转换为void&nbsp;printarray(&nbsp;double*&nbsp;p,&nbsp;int&nbsp;s&nbsp;)所以sizeof(p)是sizeof(double*)..是的,您必须将大小作为参数传递。

手掌心

问题是您的函数没有接收数组值,而是接收指针值。的操作数除外。sizeof或一元&运算符,或者它是一个字符串文字,用于初始化声明中的另一个数组,一个类型为“数组”的表达式。T“将被转换为”类型“指针T“它的值将是数组的第一个元素的地址。因此,当你打电话给printarray,类型array1的“100元素数组”隐式转换。double“指向”指针double“因此,参数的类型p是double *,不是double [100].在函数参数声明的上下文中,T a[]是相同的T *a.这就是为什么必须单独传递数组大小的原因;
打开App,查看更多内容
随时随地看视频慕课网APP