我是编程的初学者,我不知道sizeof(a)和sizeof(a [0])的确切含义来计算数组中元素的数量.使用此功能的原因和位置?划分它们的目的是什么?
Vla*_*cow 10
根据C标准(6.5.3.4 sizeof和alignof运算符)
2 sizeof运算符产生其操作数的大小(以字节为单位),可以是表达式或类型的带括号的名称.大小由操作数的类型确定.结果是整数.如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量.
所以如果你有一个数组,例如
int a[N];
Run Code Online (Sandbox Code Playgroud)
其中N是某个整数值,然后是表达式
sizeof( a )
Run Code Online (Sandbox Code Playgroud)
产生数组占用的字节数.由于数组有N元素,每个元素依次占用sizeof( int )字节
sizeof( a ) == N * sizeof( int )
Run Code Online (Sandbox Code Playgroud)
或者是什么一样
sizeof( a ) == N * sizeof( a[0] )
Run Code Online (Sandbox Code Playgroud)
因此,您可以通过以下方式计算N.
N = sizeof( a ) / sizeof( a[0] )
Run Code Online (Sandbox Code Playgroud)
如果您不知道数组的确切大小(例如,因为其大小取决于初始化程序的数量),这将非常有用.
例如
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const size_t N = sizeof( a ) / sizeof( *a );
Run Code Online (Sandbox Code Playgroud)
考虑到有时初学者会犯错误.
假设您有一个函数将数组声明为参数.
例如
void f( int a[10] );
Run Code Online (Sandbox Code Playgroud)
并且可以像调用函数一样调用
int a[10];
f( a );
Run Code Online (Sandbox Code Playgroud)
初学者通常在函数体中写下面的表达式
void f( int a[10] )
{
size_t n = sizeof( a ) / sizeof( a[0] );
//...
}
Run Code Online (Sandbox Code Playgroud)
但是这是一个错误的代码.问题是声明像数组一样的参数被调整为指向数组元素类型的指针.所以函数声明实际上看起来像
void f( int *a );
Run Code Online (Sandbox Code Playgroud)
并在表达式中的函数内
size_t n = sizeof( a ) / sizeof( a[0] );
Run Code Online (Sandbox Code Playgroud)
参数a是指针.那就相当于
size_t n = sizeof( int * ) / sizeof( int );
Run Code Online (Sandbox Code Playgroud)
根据使用的系统指针,占用4或8个字节.因此,如果sizeof( int )等于4,您将获得2或1 .
您将不会获得数组中用作参数的元素数.
指针不会保留有关它们是指向单个对象还是指向某个数组的第一个对象的信息.
在这种情况下,您应该使用第二个参数声明该函数,该参数指定数组中的元素数.例如
void f( int *a, size_t n );
Run Code Online (Sandbox Code Playgroud)