2015-04-26 24 views
0

我想將int*數組設置爲null。有兩種方法可以做到這一點:c memset函數難題

1:

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

2:

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

他們有相同的結果,但有一些區別?

回答

3

他們完成同樣的事情。 buf的計算結果爲指向陣列的第一個元素(int*),而&buf則爲您指定一個指向-8排列的指針。 (這些類型有點不同。)這兩個指針都可以用來訪問數組的字節表示,通過強制轉換爲char*,這是memset()在概念上所做的。在內部,你只是在實踐中通過兩種情況下的相同地址。

作爲一個迂腐的筆記,不能保證NULL指針的內部表示是全零字節(儘管這在實踐中很可能)。

要直接聲明類型的變量指針到陣列的-8- int*小號,可以使用的方式如下:

int* buf[8]; 
int* (*bufp)[8] = &buf; /* Initialize a pointer-to-array-of-8-int* */ 

bufp是從一個指針到不同數組的第一個元素,你可以做例如sizeof *bufp獲取數組的大小。 (這個信息只有指向第一個元素的編譯器纔會提供,上面說明了它是固有的)

如上所示,指針和數組不是同一個東西(它們有不同的東西類型,並有專門的陣列類型)。人們經常會混淆指針和數組的原因是數組通常是評估爲指向其第一個元素的指針。 sizeof是一個沒有發生的情況。如果數組退化爲與sizeof相同的指針,那麼您將獲得該指針的大小,而不是該數組的大小,這是沒有用的。