[英]equivalent expressions memset and array
#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(&na.array,0,8); memset(na.array,0,8) ; ?
並且它是相同na.array那&na.array [0]?
它是相同的memset(&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 *
的隱式轉換規則,稱為衰減 。 所以, na.array
可以衰變為char *
,這正是&na.array[0]
的類型。
它是相同的memset(&na.array,0,8); memset(na.array,0,8); ?
同樣的事情,你應該使用sizeof
而不是硬編碼數組大小。
memset(&na.array,0,sizeof(na.array));
我個人更喜歡使用&
來使數組的地址顯式。
當您作為參數傳遞給采用void*
的函數時,您提到的三個表達式會產生相同的結果。 它之所以如此不同:
&na.array
是數組的地址。 它匹配其初始元素的地址,但它具有不同的類型。 但是,您將它傳遞給一個取void*
的函數,因此類型無關緊要。 na.array
是陣列本身。 當傳遞給void*
參數時,它“衰減”到指向數組初始元素的指針。 &na.array[0]
是數組初始元素的地址,直接取得。 當您將其作為參數傳遞給memset
時,它會轉換為void*
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.