文章目录
前言
在32位平台是4个字节
在64位平台是8个字节
本人是在Visual Studio 2022 x86 下测试,也就是32位机器
提示:以下是本篇文章正文内容,下面案例可供参考
1.
#include <stdio.h>
#if 0
数组名是首元素的地址
有两个例外
1.sizeof(数组名),这里的数组名是表示整个数组的,计算的是整个数组的大小,单位是字节
2.&数组名,这里的数组名也表示整个数组,取出的是数组的地址
除了以上两种情况,数组名都是数组首元素的地址
#endif
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//数组名a单独放在sizeof()中,计算的整个数组的大小,单位是字节,4*4=16
printf("%d\n", sizeof(a + 0));//a表示的首元素的地址,a+0还是数组首元素的地址,是地址大小4/8
printf("%d\n", sizeof(*a));//a是数组首元素的地址,*a就是对首元素地址的解引用,就是首元素,大小是4个字节
printf("%d\n", sizeof(a + 1));//a+1是第二个元素的地址,是地址,大小就是4/8个字节
printf("%d\n", sizeof(a[1]));//a[1]是第二个元素,大小是4个字节
printf("%d\n", sizeof(&a));//&数组名,取出的是数组的地址,地址大小就是4/8字节
printf("%d\n", sizeof(*&a));//可以理解为*和&相互抵消,*&a相当于a,sizeof(a)是16
printf("%d\n", sizeof(&a + 1));//&a+1跳过整个数组的地址,是地址就是4/8个字节
printf("%d\n", sizeof(&a[0]));//取出第一个元素的地址,地址是4/8
printf("%d\n", sizeof(&a[0] + 1));//取出第二个元素的地址,地址就是4/8
return 0;
}
2.
#include <stdio.h>
int main()
{
//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//arr单独放在sizeof内部,计算的是整个数组的大小,单位是字节:6
printf("%d\n", sizeof(arr + 0));//arr是数组首元素的地址,arr+0是首元素的地址,地址也就是4/8
printf("%d\n", sizeof(*arr));//arr是数组首元素的地址,*arr就是第一个元素,大小是一个字节,1
printf("%d\n", sizeof(arr[1]));//arr[1]是第二个元素,也就是一个字符,大小是1个字节
printf("%d\n", sizeof(&arr));//&arr取出的数组的地址,地址就是4/8个字节
printf("%d\n", sizeof(&arr + 1));//&arr+1跳过整个数组,但它还是地址,大小是4/8个字节
printf("%d\n", sizeof(&arr[0] + 1));//是第二个元素的地址,也是4/8个字节
return 0;
}
” sizeof只关注占用空间的大小,单位是字节
sizeof不关注类型
sizeof是操作符
strlen关注的字符串中\0之前出现了多少个字符
strlen指针对字符串
strlen是库函数“
3.
#include <stdio.h>
int main()
{
字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));//arr是首元素的地址,但是arr中没有\0,计算的时候不知道什么时候停止,结果是随机值
printf("%d\n", strlen(arr + 0));//arr是首元素的地址,arr+0还是首元素的地址,
/*printf("%d\n", strlen(*arr))*/;//err,strlen需要的是一个地址,从这个地址向后面找子符,直到\0,统计字符的个数
//但是*arr是数组的首元素,也就是'a',传给strlen的就是ASCII码值97,strlen函数会把97作为起始地址,统计字符串,造成内存错误
/*printf("%d\n", strlen(arr[1]))*/;//第二个元素,把98作为起始地址,造成内存错误
printf("%d\n", strlen(&arr));//&arr是整个数组的地址,从第一个字符开始向后数字符,但是无\0,不知道什么时候停止,结果是随机值
printf("%d\n", strlen(&arr + 1));//随机值
printf("%d\n", strlen(&arr[0] + 1));//随机值
return 0;
}
*对printf("%d\n", strlen(arr));
进行f10调试,会有
也就是内存访问冲突。
4.
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));// a b c d e f \0,所以是7
printf("%d\n", sizeof(arr + 0));//第一个元素'a'的地址,4/8
printf("%d\n", sizeof(*arr));//表示第一个元素,为char类型,1
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//整个数组的地址,但表示首元素地址,4/8
printf("%d\n", sizeof(&arr + 1));//4/8
printf("%d\n", sizeof(&arr[0] + 1));//4/8
5.
#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n", strlen(arr));//a b c d e f ,结果为6
printf("%d\n", strlen(arr + 0));//从第一个元素开始数,也为6
//printf("%d\n", strlen(*arr));//传进去'a'的ASCII码值97,内存访问错误
//printf("%d\n", strlen(arr[1]));//内存访问错误
printf("%d\n", strlen(&arr));//从第一个开始数,6
printf("%d\n", strlen(&arr + 1));//跳过整个数组,找不到\0,随机值
printf("%d\n", strlen(&arr[0] + 1));//5
return 0;
}
6.
#include <stdio.h>
#include <string.h>
int main()
{
//二维数组
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//a单独在sizeof()中,为整个数组的大小,3*4*4=48
printf("%d\n", sizeof(a[0][0]));//第一行第一列的元素,4
printf("%d\n", sizeof(a[0]));//a[0]表示第一行的数组名,a[0]作为数组名单独放在sizeof()内部,计算的是第一行的大小 16
printf("%d\n", sizeof(a[0] + 1));//a[0]作为第一行的数组名,没有&,没有单独放在sizeof()中,所以a[0]表示首元素的地址,
//即a[0][0]的地址,a[0]+1就是第一行第二个元素的地址是地址就是4/8
printf("%d\n", sizeof(*(a[0] + 1)));//第一行第二个元素:4
printf("%d\n", sizeof(a + 1));//a作为二维数组的数组名,没有&,没有单独放在sizeof()中,a表示首元素的地址,
//即第一行的地址,a+1就是第二行的地址,是类型为int(*)[4]的指针,是地址就是4/8
printf("%d\n", sizeof(*(a + 1)));//*(a+1)就是第二行,相当于第二行的数组名,*(a+1)->a[1],sizeof(*(a+1))计算的是第二行的大小,16字节
printf("%d\n", sizeof(&a[0] + 1));//&a[0]是第一行的地址,&a[0]+1就是第二行的地址,是地址就是4/8个字节
printf("%d\n", sizeof(*(&a[0] + 1)));//*(&a[0]+1)相当于第二行,也就是a[1],大小是16字节
printf("%d\n", sizeof(*a));//*a = *(a+0)=a[0] :16
printf("%d\n", sizeof(a[3]));//感觉是a[3]是越界了,但是没关系,还是求的是一行:16
return 0;
}