Unt*_*med 19 c arrays function sizeof
可能重复:
如何查找sizeof(指向数组的指针)
我知道sizeof运算符在编译时被评估并替换为常量.鉴于此,如何在程序的不同点传递不同数组的函数是否可以计算它的大小?我可以将它作为参数传递给函数,但如果我不是必须的话,我宁愿不必添加另一个参数.
这是一个例子来说明我的要求:
#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;
}
Run Code Online (Sandbox Code Playgroud)
Dig*_*oss 16
没有神奇的解决方案.C不是反思语言.对象不会自动知道它们是什么.
但是你有很多选择:
函数参数实际上从不具有数组类型.当编译器看到
void printarray( double p[], int s )
Run Code Online (Sandbox Code Playgroud)
甚至
void printarray( double p[100], int s )
Run Code Online (Sandbox Code Playgroud)
它将任何一个转换为
void printarray( double* p, int s )
Run Code Online (Sandbox Code Playgroud)
所以sizeof(p)是sizeof(double*).是的,您必须将大小作为参数传递.
问题是你的函数没有收到数组值; 它接收指针值.
除非它是sizeof或一元运算&符的操作数,或者它是用于初始化声明中的另一个数组的字符串文字,"array of T" 类型的表达式将转换为"指向T"的类型,其值将为数组的第一个元素的地址.
因此,当您调用时printarray,类型array1将从"100元素数组double" 隐式转换为"指向double".因此,参数的类型p是double *,不double [100].
在函数参数声明的上下文中,T a[]与...相同T *a.
这就是你必须分别传递数组大小的原因;
| 归档时间: |
|
| 查看次数: |
33078 次 |
| 最近记录: |