sizeof、strlen

"本文详细探讨了C/C++中的sizeof运算符和strlen函数在处理数组和字符串时的不同行为。sizeof返回变量或类型所占用的内存大小,而strlen计算的是字符串的长度,直到遇到''为止。示例代码展示了它们在处理一维数组、字符数组以及字符串时的各种情况,包括首元素地址、数组总大小、元素大小等。"
摘要由CSDN通过智能技术生成

sizeof、strlen


//-------------------------sizeof、strlen----------------------------



//-----------------------整形数组、sizeof---------------------
int main()
{
           //	数组名是首元素的地址
          //	1.sizeof(数组名) - 数组名表示整个数组
           //	2.&数组名 - 数组名表示整个数组

         //	一维数组

	int a[] = { 1, 2, 3, 4 };       //4*4 = 16
	printf("%d\n", sizeof(a));      //sizeof(数组名) - 计算的是数组总大小-单位是字节 - 16
	printf("%d\n", sizeof(a + 0));   // 4/8 - 数组名这里表示首元素的值,a+0 还是首元素地址,地址的大小就是 4/8个字节
	printf("%d\n", sizeof(*a));      // 4 - 数组名表示首元素的地址, *a就是首元素,sizeof(*a)就是4
	printf("%d\n", sizeof(a + 1));    // 4/8 - 数组名这里表示首元素的值,a+1 第二个元素的地址,地址的大小就是 4/8个字节
	printf("%d\n", sizeof(a[1]));     // 4 - 第二个元素的大小
	printf("%d\n", sizeof(&a));        //4/8  &a取出的是数组的地址,但是数组的地址那也是地址,地址的大小就是 4/8个字节
	printf("%d\n", sizeof(*&a));       //16 - &a数组的地址,数组的地址解引用访问的数组,sizeof计算的就是数组的大小单位是字节
	printf("%d\n", sizeof(&a + 1));    //4/8 - &a是数组的地址,&a+1跳过整个数组,但还是地址所以是4/8个字节
	printf("%d\n", sizeof(&a[0]));      // 4/8 - &a[0]是第一个元素的地址
	printf("%d\n", sizeof(&a[0] + 1));   // 4/8 - &a[0] + 1是第二个元素的地址
	return 0;
}


---------------------------------------字符数组、sizeof----------------

int main()
{
	
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));      // sizeof计算的是数组大小,6*1 = 6字节
	printf("%d\n", sizeof(arr + 0));   // 4/8 arr是首元素的地址,arr+1还是首元素的地址
	printf("%d\n", sizeof(*arr));      // 1 arr是首元素的地址,*arr就是首元素,首元素是字符大小是一个字节
	printf("%d\n", sizeof(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;
}



---------------------------------------字符数组、strlen----------------

int main()
{
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };

	printf("%d\n", strlen(arr));       //随机值,  找到\0结束  
	printf("%d\n", strlen(arr + 0));   //随机值
	printf("%d\n", strlen(*arr));      //err    *arr解引用,是首元素的地址,地址a=97
	printf("%d\n", strlen(arr[1]));    //err    地址8=98
	printf("%d\n", strlen(&arr));      //随机值
	printf("%d\n", strlen(&arr + 1));  //随机值 - 6
	printf("%d\n", strlen(&arr[0] + 1)); //随机值 - 1   从b后开始找
	return 0;
}


//--------------------------------字符串----------------

int main()
{
	char arr[] = "abcdef";
	  //   [7]   abcdef\0

	//strlen字符串长度,遇到\0结束

	printf("%d\n", strlen(arr));        //6
	printf("%d\n", strlen(arr + 0));    //6
	printf("%d\n", strlen(*arr));       //err a=97
	printf("%d\n", strlen(arr[1]));     //err b=98
	printf("%d\n", strlen(&arr));       // 6 &arr - 数组的地址- 数组指针 char(*p)[7] = &arr
	printf("%d\n", strlen(&arr + 1));   // 随机值
	printf("%d\n", strlen(&arr[0] + 1)); // 5 从b的字符开始查找


	printf("%d\n", sizeof(arr));        //7*1 = 7   7个元素 * char(1个字符)
	printf("%d\n", sizeof(arr + 0));    //4/8 计算的是首元素地址的大小
	printf("%d\n", sizeof(*arr));       //1 *arr 是首元素,sizeof(*arr))计算首元素的大小   char
	printf("%d\n", sizeof(arr[1]));     //1 arr[1]是第二个元素,sizeof(arr[1]))计算的是第二个元素的大小
	printf("%d\n", sizeof(&arr));       //4/8 &arr虽然是数组的地址,但也是地址,所以是4/8个字节
	printf("%d\n", sizeof(&arr + 1));    //4/8 sizeof(&arr + 1))是跳过整个数组后的地址,但也是地址
	printf("%d\n", sizeof(&arr[0] + 1));  //4/8 sizeof(&arr[0] + 1 是第二个元素d的地址
	return 0;
}


//--------------------------*p指针----------------------

int main()
{
	char *p = "abcdef";
	// a的地址  

	printf("%d\n", sizeof(p));       // 4/8 计算指针变量p的大小
	printf("%d\n", sizeof(p + 1));   // 4/8 p+1 得到的是字符b的地址
	printf("%d\n", sizeof(*p));      // 1 *p就是字符串的第一个字符 - 'a'
	printf("%d\n", sizeof(p[0]));    // p[0] == *(p+0) =='a'
	printf("%d\n", sizeof(&p));      // 4/8 就是取地址
	printf("%d\n", sizeof(&p + 1));  // 4/8 地址
	printf("%d\n", sizeof(&p[0] + 1)); // b的地址,地址就是4/8字节


	printf("%d\n", strlen(p));      // 6
	printf("%d\n", strlen(p + 1));  // 5
	printf("%d\n", strlen(*p));     //err
	printf("%d\n", strlen(p[0]));   //err
	printf("%d\n", strlen(&p));     //随机值
	printf("%d\n", strlen(&p + 1)); //随机值
	printf("%d\n", strlen(&p[0] + 1)); //5


	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值