一、一维数组的计算
(一)int型
int a[]={1,2,3,4}
printf("%d\n",sizeof(a));\\16
原因是:数组名单独放在sizeof内部,相当于取出整个数组,因为这是一个含四个元素的数组,且都为整型,因此为16。printf("%d\n",sizeof(a+0));\\4
原因呢是:a+0表示数组的首元素的地址,而地址在sizeof内,均为4个字节
printf("%d\n",sizeof(*a));\\4
原因是:*表示解引用,在此应用,表示数组的首元素
printf("%d\n",sizeof(a+1));\\4
原因是:在这里a+1表示数组第二个元素的大小
printf("%d\n",sizeof(a[1]));\\4
原因是:在这里a[1]表示数组第二个元素
printf("%d\n",sizeof(&a));\\4
原因是:&表示取地址,在此取出数组的地址,而不论什么地址都是4个字节
printf("%d\n",sizeof(*&a));\\16
原因是:再取出数组的地址后,对其解引用,相当于取整个数组
printf("%d\n",sizeof(&a+1));\\4
原因是:在取地址之后加一,表示下一个数组,而在VC编译器上默认和上一个数组的类型类似,而地址在此情况下表示4个字节。
(二)char型
char arr[]={'a','b','c','d','e','f'} 6个
printf("%d\n",sizeof(arr))\\6
数组名单独放在sizeof内,表示整个数组的大小,而又因为是char型,因此为6个字
printf("%d\n",sizeof(arr+0))\\
a+0表示数组的首元素的地址,而地址在sizeof内,均为4个字节
printf("%d\n",sizeof(*arr))\\1
*arr表示取出数组的首元素,所以他的大小为1个字
printf("%d\n",sizeof(arr[1]))\\1
arr[1]表示数组第二个元素,即b这个元素,因此为1个字
printf("%d\n",sizeof(&arr))\\4
&arr表示数组的地址,地址在sizeof内,均为4个字节
printf("%d\n",sizeof(&arr+1))
&arr表示数组的地址,&arr+1表示下一个数组的地址,在此情况下,编译器默认为与前一个同一类型,而地址在sizeof内,均为4个字
printf("%d\n",sizeof(&arr[0]+1))\\4
&arr[0]+1表示数组中第二个元素的地址,因此为4
printf("%d\n",strlen(arr))\\随机值
strlen是计算数组的长度,当遇到NULL时,停止统计长度,而在此情况下,没有NULL字符,因此是一个大于6的随机值
printf("%d\n",strlen(arr+0))
arr+0表示数组首元素的地址,而在此情况下,没有NULL字符,因此是一个大于6的随机值
printf("%d\n",strlen(*arr))\\无值
*arr表示数组首元素,而在此情况下,会让系统崩溃
printf("%d\n",strlen(arr[1]))\\无值
arr[1]同
printf("%d\n",strlen(&arr))
&arr表示取出数组的地址(同首元素的地址),而在此情况下,没有NULL字符,因此是一个大于6的随机值
printf("%d\n",strlen(&arr+1))\\随机值
&arr表示取出数组的地址,&arr+1,则表示指向这个数组的下一个数组,因此为随机值
printf("%d\n",strlen(&arr[0]+1))
&arr[0]表示数组的首元素的地址,而在此情况下加一,表示数组第二个元素,因此为大于5的随机值
(三)指针变量型
char*p="abcdef";
printf("%d\n",sizeof(p));\\4
指针变量p中保存的事abcdef的地址,因此在sizeof内部,表示4个字节
printf("%d\n",sizeof(p+1));\\4<
p+1表示下一个字符串的地址,而在此情况下,平台默认为同上一个数组,在sizeof内,地址均表示4个字节
printf("%d\n",sizeof(*p));\\1
p存放的是字符数组“abcdef”的地址,而*p表示的是字符数组的首元素,因此大小为1
printf("%d\n",sizeof(p[0]));\\1
p[0]表示字符数组首元素,因此为1个字节
printf("%d\n",sizeof(&p));\\4<
&p表示取出整个字符数组的地址,而地址在sizeof内部均为4个字节
printf("%d\n",sizeof(&p+1));\\4
&p+1表示下一个字符数组的地址,地址不论在哪种情况下,均表示4个字节
printf("%d\n",sizeof(&p[0]+1));\\4
&p[0]表示字符数组首元素的地址,而给其+1表示字符数组第二个元素的地址,因此,根据上面所说,表明为个字节
printf("%d\n",strlen(p));\\6
strlen求取字符串的长度,遇‘\0’即停止计算,在字符串的后面默认有‘\0’,因此此字符串长度为6
printf("%d\n",strlen(p+1));\\5
p+1表示第二个元素,因此长度为5
printf("%d\n",strlen(*p));\\崩溃
*p表示数组首元素,此时会让系统崩溃
printf("%d\n",strlen(p[0]));\\崩溃
同上
printf("%d\n",strlen(&p));\\随机值
&p表示取出整个字符数组的地址,此时不会遇到‘\0’,因此为随机值
printf("%d\n",strlen(&p+1));\\随机值<
&p+1表示下一个数组的地址,因此为随机值
printf("%d\n",strlen(&p[0]+1));\\5
p[0]+1表示数组中第二个元素的地址,从此之后,会遇到‘\0’,因此为5个字节
二、简述二维数组的计算
int a[3][4]={0};
printf("%d\n",sizeof(a));\\48
此二维数组中有12个元素,为int型,因此有48个字节
printf("%d\n",sizeof(a[0][0]));\\4
表示数组中第一行第一列的元素,因此为4个字节
printf("%d\n",sizeof(a[0]));\\16
表示数组中第一行的元素,有4个元素,因此为16个字节
printf("%d\n",sizeof(a[0]+1));\\4
a[0]表示数组首行元素,而a[0]+1表示首行中第二个元素,因此为4个字节
printf("%d\n",sizeof(*a));\\16
表示首行元素的地址,因此为16个字节
printf("%d\n",sizeof(*a+1));\\4
表示数组首行中第二个元素的地址,因此为4个字节
printf("%d\n",sizeof(a[3]));16
在此情况下,系统默认为上一个相同,详见下图
写的不好的地方,还请大家多多指教