C語言strlen和sizeof在數組中的使用詳解

一、前言

前面我們詳細講瞭sizeof和strlen中的使用,基本涉及瞭所有一維數組可以和常見的題目類型

那麼現在我們就將一維數組告一段落瞭,現在我們來開始講解在二維數組的使用瞭,本篇是

sizeof和strlen的最後一篇瞭。

二、sizeof在二維數組的試題

#include<stdio.h>
 
int main()
{
	int a[3][4] = { 0 };
 
	printf("%d\n", sizeof(a));
 
	printf("%d\n", sizeof(a[0]));
 
	printf("%d\n", sizeof(a[0][0]));
 
	printf("%d\n", sizeof(a[0]+1));
 
	printf("%d\n", sizeof(*(a[0]+1)));
 
	printf("%d\n", sizeof(a+1));
 
	printf("%d\n", sizeof(*(a+1)));
 
	printf("%d\n", sizeof(&a[0]+1));
 
	printf("%d\n", sizeof(*(&a[0] + 1)));
 
	printf("%d\n", sizeof(*a));
 
	printf("%d\n", sizeof(a[3]));
 
	return 0;
}

解讀:

對於二維數組來說,其實可以看成個一維數組,以行為單位,第一行可以看成以為首元素,

以此類推,這樣我們就得到瞭一個一維數組,但是要記得這裡的每個元素都是一個數組名。

比如對於上面的二維數組來說a[3][4]完全等價於a{a[0],a[1],a[2]},其中每個元素都是一個一

維數組,單獨的每個元素如a[0]是數組名,表示的是a[0]這個一維數組的首元素地址。

題解:

第一題:sizeof(a),a是數組名,單獨放在sizeof裡表示的是整個數組,所以大小是12*4=48

字節。

第二題:sizeof(a[0]),前面我們說道,這個就相當於一個一維數組,a[0]表示的是數組名,數

組名單獨放在sizeof中計算的整個數組的大小,也就是a[0]那行的大小,因為前面說過瞭把二

數組看成一維數組,每一行看成其中的每一個元素,然後每個元素就是一個一維數組

sizeof(a[0])就是求出第一行的大小,故大小是4*4=16字節。

第三題:sizeof(a[0][0]),a[0][0]表示的是第一行第一個元素,所以大小是4字節。

第四題:sizeof(a[0]+1),a[0]不是單獨放在sizeof中的,所以他表示的是首元素地址,因為

我們說過對於二維數組來說,每一個行都可以表示一個一維數,所以a[0]+1,表示的是第二個

元素的地址,既然是地址那就是4或8字節

第五題:sizeof(*(a[0]+1)),上一題我們說到,a[0]+1表示的是第一行第二個元素的地址

*(a[0]+1)表示的是拿到第一行第二個元素的值,所以大小是4字節。

第六題:sizeof(a+1),其中a沒有單獨放在sizeof裡,因為是二維數組,所以表示的是第一行

的地址,a+1,第一行的地址加1表示的是第二行的地址,既然是地址那大小就是4或8字節。

第七題:sizeof(*(a+1)),上面那題已經解釋過瞭a+1表示的是第二行的地址,那麼*(a+1)

表示的是拿到第二行的所有元素,所以大小是4*4=16字節。

第八題:sizeof(&a[0]+1),&a[0]+1表示拿到第二行的地址,既然是地址那就是4或8字節。

第九題:sizeof(*(&a[0] + 1)),&a[0]+1表示的是第二行的地址,*(&a[0] + 1)表示的是拿到

第二行的所有元素,,所以大小是4*4=16字節 。

第十題:sizeof(*a),*a表示拿到第一行所有元素,所以大小是4*4=16字節。

第十一題:sizeof(a[3]),a[3]雖然表面上越界瞭,但是sizeof是不會去運算的,故還是和

前面的一維數組一樣的大小為16字節。

答案驗證:

64位平臺下:

32位平臺下:

此類篇幅完結瞭,歡迎大佬們指正

那咱們下期見

到此這篇關於C語言strlen和sizeof在數組中的使用詳解的文章就介紹到這瞭,更多相關C語言 strlen內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: