数组的相关运算(sizeof和strlen的灵活应用)

本文详细对比了sizeof与strlen函数在不同类型的数组中的应用,并通过示例程序的方式进行了解释,有助于区分这两个函数在求取数组长度及地址时的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们数组的运算当中,经常会碰到或者用到求数组的长度,求数组中某一个元素的地址的长度或者是数组的运用。

我们经常会搞混sizeof和strlen在不同类型数组中的应用,因此我在这里详细的罗列出来我们常见的以及常用的一些典型例子。

通过程序的方式加注释 方便大家理解,而且可以实时验证。

在下面的注释中,X表示随机值,error表示该语句错误。

程序在32位平台下运行的结果:

#include <stdio.h>
#include <windows.h>
#include <string.h>
int main()
{
	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 表示第一行第一个元素的地址
	printf("%d\n", sizeof(a + 1));    //4 表示第二行的地址
	printf("%d\n", sizeof(&a[0] + 1));//4 表示第二行第一个元素的地址
	printf("%d\n", sizeof(*a));       //16 第一行元素的大小
	printf("%d\n", sizeof(a[3]));     //16 虽然超出了定义,但还是按类型计算

	char arr[] = "abcdef";//字符数组
	printf("%d\n", sizeof(arr));        //7 表示数组的大小,有\0
	printf("%d\n", sizeof(arr + 0));    //4 表示首元素的地址
	printf("%d\n", sizeof(*arr));       //1 表示首元素的大小
	printf("%d\n", sizeof(arr[1]));     //1 表示第一个元素的大小
	printf("%d\n", sizeof(&arr));       //4 表示整个字符串的地址
	printf("%d\n", sizeof(&arr + 1));   //4 向字符串后面的地址
	printf("%d\n", sizeof(&arr[0] + 1));//4 表示第二个字符的地址
	printf("%d\n", strlen(arr));        //6 表示字符串的长度
	printf("%d\n", strlen(arr+0));      //6 指向a,开始往后找
	printf("%d\n", strlen(*arr));       //error 从97开始找,给了一个错误的地址
	printf("%d\n", strlen(arr[1]));     //error 从98开始找,给了一个错误的地址
	printf("%d\n", strlen(&arr));       //6 表示整个数组的长度,不算\0
	printf("%d\n", strlen(&arr + 1));   //X  跳出数组,值不确定
	printf("%d\n", strlen(&arr[0] + 1));//5 表示从b开始

	char *p = "abcdef";//指针数组
	printf("%d\n", sizeof(p));        //4 表示指针的大小
	printf("%d\n", sizeof(p+1));      //4 表示第二个字符的地址
	printf("%d\n", sizeof(*p));       //1 表示第一个字符的大小
	printf("%d\n", sizeof(p[0]));     //1 表示第一个字符的大小
	printf("%d\n", sizeof(&p));       //4 表示整个字符串的地址
	printf("%d\n", sizeof(&p+1));     //4 向字符串后面的地址
	printf("%d\n", sizeof(&p[0]+1));  //4 表示第二个字符的地址
	printf("%d\n", strlen(p));        //6 表示字符串的长度
	printf("%d\n", strlen(p+1));      //5 指向b
	printf("%d\n", strlen(*p));       //error 从97开始找,给了一个错误的地址
	printf("%d\n", strlen(p[0]));     //error 从98开始找,给了一个错误的地址
	printf("%d\n", strlen(&p));       //X 从p的地址开始,找不到对应的字符
	printf("%d\n", strlen(&p + 1));   //X 跳出地址,从地址之外开始,值不确定
	printf("%d\n", strlen(&p[0] + 1));//5从第二个字符开始



	char  arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };//字符数组
	printf("%d\n", sizeof(arr));        //6 表示整个数组的大小
	printf("%d\n", sizeof(arr+0));      //4 表示首元素的地址
	printf("%d\n", sizeof(*arr));       //1 表示首元素的大小
	printf("%d\n", sizeof(arr[1]));     //1 表示第二个元素的大小
	printf("%d\n", sizeof(&arr));       //4 表示整个数组的地址
	printf("%d\n", sizeof(&arr+1));     //4 表示跳出这个数组的地址
	printf("%d\n", sizeof(&arr[0]+1));  //4 表示第二个元素的地址
	//strlen(起始位置)(给一个地址,strlen去找)
	printf("%d\n", strlen(arr));        //X 表示首元素的地址,但是遇不到\0,值不确定
	printf("%d\n", strlen(arr + 0));    //X 表示首元素的地址,但是遇不到\0,值不确定
	printf("%d\n", strlen(*arr));       //error 从97开始找,给了一个错误的地址
	printf("%d\n", strlen(arr[1]));     //error 从98开始找,给了一个错误的地址
	printf("%d\n", strlen(&arr));       //X 表示这整个数组的地址,但是遇不到\0,值不确定
	printf("%d\n", strlen(&arr + 1));   //X 表示跳出这个数组的地址,值不确定
	printf("%d\n", strlen(&arr[0] + 1));//X 表示第二个元素的地址,但是遇不到\0,值不确定


	int a[] = { 1, 2, 3, 4 };//一维数组
	printf("%d\n", sizeof(a));      //16 表示整个数组的大小
	printf("%d\n", sizeof(a+0));    //4 表示首元素的地址
	printf("%d\n", sizeof(*a));     //4 表示首元素的大小
	printf("%d\n", sizeof(a+1));    //4 表示第二个元素的地址
	printf("%d\n", sizeof(a[1]));   //4 表示第二个元素的大小
	printf("%d\n", sizeof(&a));     //4 表示整个数组的地址
	printf("%d\n", sizeof(&a+1));   //4 表示跳出这个数组的地址
	printf("%d\n", sizeof(&a[0]));  //4 表示第一个元素的地址
	printf("%d\n", sizeof(&a[0]+1));//4 表示第二个元素的地址
	system("pause");
	return 0;
}
如果读者在查看的过程当中发现错误,还望您及时联系,帮助我修改错误!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值