在计算C中的数组元素数时,*array和array [0]之间的差异

Cli*_*chl 6 c

对于给定的数组:

int array[10];
Run Code Online (Sandbox Code Playgroud)

有什么区别

sizeof array / sizeof *array
Run Code Online (Sandbox Code Playgroud)

sizeof array / sizeof array[0]
Run Code Online (Sandbox Code Playgroud)

在计算元素数量时array

use*_*738 6

在这种情况下没有.两者最终都会产生类型,int因为在第一种情况下,当用作*(您正在解引用a int*)的操作数时,数组会衰减为指向第一个元素的指针.

注意一件事 - 你可能听说过sizeof没有数组的衰减,但是当数组用作操作数时,会发生衰减*.操作数sizeof很简单int.(讨论sizeof arr/sizeof *arr)

如果您想获得一个清晰的想法 - 试试这个

int a[10][20];
printf("%zu %zu\n",sizeof a/ sizeof *a, sizeof a/ sizeof **a);
Run Code Online (Sandbox Code Playgroud)

你的第二种情况是WYSIWYG类型的东西 - 我的意思是,它只是说数组的总大小并将其除以它包含的内容(它的大小).是的,它会返回数组的大小.这就是正在做的事情.

arr[0]只不过*(arr+0)是手段*arr.所以这是有道理的,他们是一样的.


几点可以澄清事情(如果你以后使用sizeof)

array&array[0]在这方面相同.它们的价值和类型都是一样的.但是对于指针而言,相同的值只是一件事 - 它们对指针算术的暗示是一个完全不同的故事. 这里所有具有相同的价值,但它们的类型是不同的,因为指针运算密切与它指向耦合.这很重要. int a[10][20];a&aa[0]


n. *_* m. 5

根据array[n]定义,表达式与*(array + n)

根据array + 0定义,表达式与array(除非array是操作数sizeof)相同.

所以,是的,array[0]而且*array是相同的.

这远远超过了这种情况所需要的.对于sizeof只有类型重要的参数,两个表达式肯定是相同的.