关于sizeof和strlen计算的一些思考+总结


int main()
{
	//一维数组
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));// 4*8=16. sizeof(数组名),表示取整个数组的长度;
	printf("%d\n", sizeof(a + 0));// 4/8. 数组名+0表示首元素地址,32位下地址为4,64位下,地址为8;
	printf("%d\n", sizeof(*a));// 4. *a表示对首元素地址解引用,得到1,而1是整型,在内存中占4个字节;
	printf("%d\n", sizeof(a + 1));// 4/8. 首元素地址+1表示第二个元素的地址;
	printf("%d\n", sizeof(a[1]));// 4. 表示第二个元素占内存空间的大小,单位为字节;
	printf("%d\n", sizeof(&a));// 4/8. &a表示对整个数组a取地址,而地址占内存空间4or8 byte;
	printf("%d\n", sizeof(*&a));//16. ???取整个数组的地址,解引用出整个数组
	printf("%d\n", sizeof(&a + 1));//4/8。取数组整个地址,+1越过了数组地址,指向数组后的一块内存,内存大小为4/8byte
	printf("%d\n", sizeof(&a[0]));//4. 取第一个元素的地址
	printf("%d\n", sizeof(&a[0] + 1));//4. 第二个元素的地址

	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));//6. sizeof(数组名)表示整个数组所占内存空间的大小,单位是byte
	printf("%d\n", sizeof(arr + 0));//4/8.???表示首元素地址占空间大小
	printf("%d\n", sizeof(*arr));//1. 表示首元素占空间大小
	printf("%d\n", sizeof(arr[1]));//1. 表示首元素所占空间大小
	printf("%d\n", sizeof(&arr));//4/8. 表示整个字符数组arr地址所占空间的大小
	printf("%d\n", sizeof(&arr + 1));//4/8. 表示指向跳过整个数组后面的内存空间的大小
	printf("%d\n", sizeof(&arr[0] + 1));//4/8. 表示第二个元素地址所占内存空间的大小
	printf("%d\n", strlen(arr));//随机值 。arr表示首元素地址,strlen(arr)表示从arr地址开始直到'\0'位置前,字符的个数
	printf("%d\n", strlen(arr + 0));//随机值。同上
	//printf("%d\n", strlen(*arr));//错误。对首元素地址解引用为'a',a的ASCII为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));//随机值。

	char arr[] = "abcdef";
	//相当于 char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0'};
	printf("%d\n", sizeof(arr));//7,表示整个数组所占内存空间的大小,而在此字符中,包含'\0';
	printf("%d\n", sizeof(arr + 0));//4/8.表示第二个元素地址所占内存空间的大小
	printf("%d\n", sizeof(*arr));//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.表示第二个元素地址所占内存空间的大小
	printf("%d\n", strlen(arr));//6.表示从首元素地址开始,向后找'\0',找到后,在'\0'之前的元素总个数
	printf("%d\n", strlen(arr + 0));//6.表示首元素地址,从首元素地址开始,向后找'\0',找到后,在'\0'之前的总元素个数
	//printf("%d\n", strlen(*arr));//错误。
	//printf("%d\n", strlen(arr[1]));//错误
	printf("%d\n", strlen(&arr));//6。取整个数组地址,但是指向数组开头
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//5,表示从第二个元素处向后找'\0'

	char *p = "abcdef";
	printf("%d\n", sizeof(p));//4/8.表示指针变量p所占内存空间的大小
	printf("%d\n", sizeof(p + 1));//4/8.表示第二个元素地址所占内存空间的大小
	printf("%d\n", sizeof(*p));//1.表示第一个元素所占内存空间的大小
	printf("%d\n", sizeof(p[0]));//1.同上
	printf("%d\n", sizeof(&p));//4/8.指针变量p的地址所占内存空间的大小
	printf("%d\n", sizeof(&p + 1));//4/8.指针变量p的地址的下一个地址所占内存空间的大小
	printf("%d\n", sizeof(&p[0] + 1));//4/8.第二个元素的地址所占内存空间的大小
	printf("%d\n", strlen(p));//6。p指向首元素地址,并向后找'\0'
	printf("%d\n", strlen(p + 1));//5.从第二个元素向后找'\0'
	//printf("%d\n", strlen(*p));//错误
	//printf("%d\n", strlen(p[0]));//错误
	printf("%d\n", strlen(&p));//随机值
	printf("%d\n", strlen(&p + 1));//随机值
	printf("%d\n", strlen(&p[0] + 1));//5,从第二个元素向后找'\0'

	//二维数组
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48.表示整个数组所占内存空间的大小
	printf("%d\n", sizeof(a[0][0]));//4.表示首元素所占内存空间的大小
	printf("%d\n", sizeof(a[0]));//16.表示首行所有元素所占内存空间的大小
	printf("%d\n", sizeof(a[0] + 1));
	//4/8,a[0]是第一行数组名,并没有单独放在sizeof内部或者取地址。所以+1表示第一行第二个元素地址所占内存空间的大小
	printf("%d\n", sizeof(*(a[0] + 1)));//4.表示第一行第二个元素占的内存空间的大小
	printf("%d\n", sizeof(a + 1));//4/8.a表示首元素地址,a是二维数组,首元素的地址就是第一行的地址
	//所以a表示的是二维数组第一行的地址,+1表示第二行的地址
	printf("%d\n", sizeof(*(a + 1)));//16.对第二行的地址解引用,访问到的就是第二行
	//*(a+1)->a[1];->sizeof(a[1]),表示第二行数组名
	printf("%d\n", sizeof(&a[0] + 1));//4/8. 表示第二行所有元素地址占的内存空间的大小
	printf("%d\n", sizeof(*(&a[0] + 1)));//16.表示第二行所有元素占内存空间的大小
	printf("%d\n", sizeof(*a));//16.表示首元素就是第一行,第一行占内存空间的大小
	//*a->*(a+0)->a[0],->sizeof(a[0])
	printf("%d\n", sizeof(a[3]));//16.表示第四行数组名,与第二行第一行类型一样

	//int a = 0;
	//printf("%d\n", sizeof(a));//4
	//printf("%d\n", sizeof(int));//4
	//去a处看一下,并没有访问内存,根据int (类型)

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值