c memset功能拼图

时间:2015-04-26 15:19:18

标签: c memset

我想将int*数组设置为null。有两种方法可以做到这一点:

1:

int* buf[8]; memset(buf, 0, sizeof(buf));

2:

int* buf[8]; memset(&buf, 0, sizeof(buf));

他们有相同的结果,但是有一些区别吗?

1 个答案:

答案 0 :(得分:3)

他们完成了同样的事情。 buf计算指向数组的第一个元素(int*)的指针,而&buf获取指向数组8的指针 - {{1} }Š。 (这些类型有点模糊不同。)这两个指针都可用于通过转换为int*来访问数组的字节表示,这是char*在概念上的作用。在内部,您在实践中只是在两种情况下传递相同的地址。

作为一个迂腐的说明,它不能保证memset()指针的内部表示形式为全零字节(尽管这在实践中极有可能)。

要直接声明类型为指向数组的指针 - NULL s 的变量,您可以使用以下方法:

int*

int* buf[8]; int* (*bufp)[8] = &buf; /* Initialize a pointer-to-array-of-8-int* */ 与指向数组第一个元素的指针的不同之处在于您可以执行以下操作: bufp获取数组的大小。 (只有指向第一个元素的指针,编译器才能获得该信息。上面的内容使其成为类型中固有的。)

如上所述,指针和数组不是同一个东西(它们有不同的类型,并且有数组的专用类型)。人们经常混淆指针和数组的原因是数组通常评估指向其第一个元素的指针。 sizeof *bufp是一种不会发生这种情况的案例。如果数组降级为带有sizeof的指针,那么您将获得该指针的大小而不是数组的大小,这不会有用。