#include
#include
#include
intmain()
;printf
("%d\n"
,sizeof
(a))
;//16
printf
("%d\n"
,sizeof
(a +0)
);//4,a已經隱式轉換為指標int*
printf
("%d\n"
,sizeof
(*a));
//4,a已經隱式轉換為int*再解引用得到int
printf
("%d\n"
,sizeof
(a+1))
;//4,a已經隱式轉換為指標int*再+1還是int*
printf
("%d\n"
,sizeof
(a[1])
);//4,a[1]= *(a+1)還是指標int*
printf
("%d\n"
,sizeof
(&a));
//4,&a是乙個陣列指標int(*)[4]
printf
("%d\n"
,sizeof(*
&a))
;//16,&a是陣列指標,再次解引用從這個位址開始取int(*)[4]型別對應的的位元組
printf
("%d\n"
,sizeof
(&a+1)
);//4,陣列指標+1還是指標
printf
("%d\n"
,sizeof
(&a[0]
));//4,得到int*
printf
("%d\n"
,sizeof
(&a[0]
+1))
;//4,指標+1還是int*
return0;
}int
main()
;printf
("%d\n"
,sizeof
(arr));
//6,arr是字元陣列
printf
("%d\n"
,sizeof
(arr+0)
);//4,得到乙個char*
printf
("%d\n"
,sizeof
(*arr));
//1,得到乙個char
printf
("%d\n"
,sizeof
(arr[1]
));//1,得到乙個char
printf
("%d\n"
,sizeof
(&arr));
//4,得到乙個陣列指標char(*)[6]
printf
("%d\n"
,sizeof
(&arr+1)
);//4,陣列指標+1還是指標
printf
("%d\n"
,sizeof
(&arr[0]
+1))
;//4,&arr[0]得到乙個char*,+1還是指標
printf
("%d\n"
,strlen
(arr));
//針對乙個不是字串的字元陣列進行strlen操作,未定義行為
printf
("%d\n"
,strlen
(arr+0)
);printf
("%d\n"
,strlen
(*arr));
//*arr得到的是'a'=>97,strlen就把97當成了乙個位址,計算機上對應的97的位址,大概率無法訪問。
printf
("%d\n"
,strlen
(arr[1]
));printf
("%d\n"
,strlen
(&arr));
printf
("%d\n"
,strlen
(&arr+1)
);printf
("%d\n"
,strlen
(&arr[0]
+1))
;return0;
}int
main()
intmain()
intmain()
;//所謂二維陣列,本質是乙個一維陣列,裡面的每個元素又是乙個一維陣列
printf
("%d\n"
,sizeof
(a))
;//48,12個元素,每個元素4個位元組
printf
("%d\n"
,sizeof
(a[0][
0]))
;//4
printf
("%d\n"
,sizeof
(a[0])
);//16,a[0]=>int[4]
printf
("%d\n"
,sizeof
(a[0]+
1));
//4,a[0]=>int[4]再+1,就隱式轉換成指標int*
printf
("%d\n"
,sizeof(*
(a[0]+
1)))
;//4,int*解引用得到int,*(a[0]+1)=>a[0][1]
printf
("%d\n"
,sizeof
(&a[0]
+1))
;//4,a[0]=int[4],&a[0]=>int(*)[4],再+1還是指標
printf
("%d\n"
,sizeof(*
(&a[0]
+1))
);//16,上面解引用得到int[4]
printf
("%d\n"
,sizeof
(*a));
//16,*a=>*(a+0)=>a[0],得到int[4]
printf
("%d\n"
,sizeof
(a[3])
);//16,sizeof是乙個運算子,特點是編譯期求值
//「陣列下標越界未定義行為」前提條件是記憶體訪問越界,這是程式執行時的行為
return0;
}
關於strlen和sizeof的陷阱
一,strlen是乙個庫函式,計算指定的字串包含的字元個數,要求輸入的串必須以 0 結束,但計算的字元個數不包含 0 本身。例子 1,char sztest 100 注意這裡還沒進行初始化,裡面的資料是隨機的 strlen sztest 此時輸出的資料取決於陣列sztest裡面的 0 在什麼位置結束...
關於sizeof 和 strlen深坑全解析
大家都知道,sizeof和strlen可以用來獲取大小,但是有著不同的用法,這裡首先總結區別,最後根據sizeof 和 strlen 的具體事例來分析特別需要注意的事項。1.sizeofsizeof是操作符,strlen是函式。操作符的結果型別是size t,它在標頭檔案中typedef為unsig...
sizeof和strlen和 countof的區別
運算子,計算引數所佔記憶體 int nnum2 strlen arr 是函式,求字元的個數,不包括 0 int nnum3 countof arr windows巨集 計算陣列的元素個數 cout nnum1 cout nnum2 cout nnum3 endl int arr1 20 nnum1 ...