#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
struct name{
char array[8];
};
struct name na;
memset(&na.array,0,8);
}
memset(&amp; na.array,0,8); memset(na.array,0,8); ?
&amp; na.array [0] na.array 是一样的吗?
答案 0 :(得分:1)
它是相同的memset(&amp; na.array,0,8); memset(na.array,0,8); ?
是
但是,这仅表示两种变体的行为相同。 &na.array
和na.array
的类型非常不同。
na.array
的类型为char[8]
,是一个包含八个char
的数组。 &na.array
类型为char(*)[8]
,指针为八个char
的数组。
与na.array [0]相同的na.array?
严格来说,没有。 na.array
实际上是char[8]
类型,而&na.array[0]
类型为char *
。但是,存在从char[8]
到char *
的隐式转换规则,称为 decay 。因此,na.array
可以衰减到char *
,这正是&na.array[0]
的类型。
答案 1 :(得分:1)
它是相同的memset(&amp; na.array,0,8); memset(na.array,0,8); ?
同样的事情,您应该使用sizeof
而不是硬编码数组大小。
memset(&na.array,0,sizeof(na.array));
就个人而言,我更希望使用&
使数组的地址显式化。
答案 2 :(得分:1)
当您作为参数传递给采用void*
的函数时,您提到的三个表达式会产生相同的结果。它之所以如此是不同的:
&na.array
是数组的地址。它匹配其初始元素的地址,但它具有不同的类型。但是,您将其传递给函数void*
,因此类型无关紧要。na.array
是数组本身。它&#34;衰变&#34;传递给void*
参数时指向数组的初始元素。&na.array[0]
是数组初始元素的地址,直接采用。当您将其作为参数传递给void*
时,它会转换为memset
。