strlen与sizeof区别,以及在数组中,字符串中应用

两者区别:1. strlen函数求得是字符串实际长度,它求的方法是从开始找,直到遇见'\0结束,不算‘\0'。

                        sizeof不是函数,是一个操作符,返回的是变量声明后所占内存数,不是实际长度。

                    2.sizeof 可以用类型做参数,strlen只能用char*做参数,且必须为‘\0’结尾

                    3.sizeeof在编译的时候就把sizeof计算过了。strlen结果必须在运行的时候才能计算出来,是用来计算字符串长度的,不是类型占内存大小。

注意:1.数组名单独放sizeof内部,代表整个数组

            2. &a代表整个数组地址

             除此之外所数组名只代表数组首元素地址

了解了上面的基础知识,接下来我们进入主题

#include<stdio.h>
#include<stdio.h>
int main()
{
	int a[] = { 1, 2, 3, 4 };
	printf("%d\n", sizeof(a));//数组名单独放sizeof()内,代表整个数组,4个元素每个是int型,因此16字节
	printf("%d\n", sizeof(a+0));//数组名没单独放sizeof()内,代表数组首元素地址,+0仍然代表首元素地址,既然地址,所以4字节
	printf("%d\n", sizeof(*a));//数组名没单独放sizeof()内,解引用代表数组首元素,首元素int型,因此占4字节
	printf("%d\n", sizeof(a+1));//同上第二个,代表数组第二个元素地址,既然地址,4字节
	printf("%d\n", sizeof(a[1]));//代表数组第二个元素 ,同上三,4字节
	printf("%d\n", sizeof(&a));//&a代表整个数组地址,但仍是地址所以是4字节,但指向数组首元素
	printf("%d\n", sizeof(&a+1));//&a整个数组地址,&a+1表示数组指针加1,跳过整个数组,指向第二个数组,与上面&a差了一个数组,即16字节,但仍是地址4字节
	printf("%d\n", sizeof(&a[0]));//数组第一个元素地址,指向数组首元素,4字节
	printf("%d\n", sizeof(&a[0]+1));//&a[0]数组第一个元素地址,&a[0]+1表示int型指针+1,跳过一个int型,因此指向第二个元素,但仍是地址4字节
	printf("%p\n", &a);
	printf("%p\n", &a+1);
	printf("%p\n", &a[0]);取地址,方便大家了解指针具体指向
	printf("%p\n", &a[0]+1);
	system("pause");
}


  

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));//数组名单独放sizeof内,代整个数组。6字节
	printf("%d\n", sizeof(arr+0));//数组名没单独放sizeof()内,代表数组首元素地址,+0仍然代表首元素地址,既然地址,所以4字节
	printf("%d\n", sizeof(*arr)); //数组名没单独放sizeof()内, 解引用代表数组首元素,首元素char型,因此占1字节
	printf("%d\n", sizeof(arr[1]));//代表数组第二个元素,数组元素为char型,1字节
	printf("%d\n", sizeof(&arr));//&a代表整个数组地址,但仍是地址所以是4字节,但指向数组首元素
	printf("%d\n", sizeof(&arr+1));//&a整个数组地址,&a+1表示数组指针加1,跳过整个数组,指向第二个数组,与上面&a差了一个数组,即6字节,但仍是地址4字节
	printf("%d\n", sizeof(&arr[0] + 1));// &a[0]数组第一个元素地址, &a[0] + 1表示char型指针 + 1,跳过一个char型,因此指向第二个元素,但仍是地址4字节
	printf("%p\n", &arr);
	printf("%p\n", &arr+1);
	printf("%p\n", &arr[0]+1);
	system("pause");
	
}

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//数组名单独放sizeof内,代整个数组。但是后面有个'\0',故7字节
	printf("%d\n", sizeof(arr+0));//数组名没单独放sizeof()内,代表数组首元素地址,+0仍然代表首元素地址,既然地址,所以4字节
	printf("%d\n", sizeof(*arr));//数组名没单独放sizeof()内, 解引用代表数组首元素,首元素char型,因此占1字节 
    printf("%d\n", sizeof(arr[1]));//代表数组第二个元素,数组元素为char型,1字节
	printf("%d\n", sizeof(&arr));//&a代表整个数组地址,但仍是地址所以是4字节,但指向数组首元素
	printf("%d\n", sizeof(&arr+1));//&a整个数组地址,&a+1表示数组指针加1,跳过整个数组,指向第二个数组,与上面&a差了一个数组,即差7字节,但仍是地址4字节
	printf("%d\n", sizeof(&arr[0] + 1));// &a[0]数组第一个元素地址, &a[0] + 1表示char型指针 + 1,跳过一个char型,因此指向第二个元素,但仍是地址4字节
	printf("%p\n", &arr);
	printf("%p\n", &arr+1);
	printf("%p\n", &arr[0]+1);
	system("pause");
	return 0;
}

#include<stdio.h>
#include<stdlib.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//p是一个字符指针,里面只存了a地址,指向a,因为指针所以4字节
	printf("%d\n", sizeof(p+1));//p是一个字符指针,指针+1仍为指针,但跳过一个指针所指向元素类型即char,因此指向b,但还是指针4字节
	printf("%d\n", sizeof(*p));//p指向a,对p解引用,代表字符a,因此1字节
	printf("%d\n", sizeof(p[0]));//代表a,因此1字节
	printf("%d\n", sizeof(&p));//p地址,仍为地址所以4字节
	printf("%d\n", sizeof(&p+1));//p地址+1,仍为地址。即4字节。p本来为指针,&p为二级指针放入char* *ptr,&p+1相当于ptr+1,跳过一个二级指针所指元素类型大小即char*,即跳过一个p,因为p为char*
	printf("%d\n", sizeof(&p[0]+ 1));//仍为地址所以4字节。指向b。
	system("pause");
	return 0;
}

接下来有一张图有助于理解上面这个&p+1


#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48字节         数组名单独放sizeof内部代表整个数组
	printf("%d\n", sizeof(a[0][0]));//4字节    代表第一个元素大小
	printf("%d\n", sizeof(a[0]));//16字节      第一行数组名单独放sizeof内部,代表整个数组,也就是第一行,所以16字节
	printf("%d\n", sizeof(a[0]+1));//4字节     第一行数组名没有单独放sizeof内部,降级代表数组首元素地址+1,也就是第一行第二个元素地址
	printf("%d\n", sizeof(a+1));//4字节        数组名单独没有放sizeof内部,降级代表数组首元素地址即第一行地址。+1代表数组第二行地址,既然地址4字节
	printf("%d\n", sizeof(&a[0]+1));//4字节     a[0]代表第一行数组名,&a[0]也就是&数组名也就代表第一行地址,&a[0]+1跳过整个数组即跳过第一行,也就是第二行第一个元素地址 ,既然地址4字节
	printf("%d\n", sizeof(*a));//16字节       数组名未单独放sizeof内部,降级变为数组第一行地址,解引用代表第一行所有元素
	printf("%d\n", sizeof(a[3]));//16字节      按理来说a[3]代表第4行数组名,但是没有访问第四行,只是拿类型计算了下第四行字节,并没有访问
    system("pause");
	return 0;
}

#include<stdio.h>
#include<stdlib.h>
int main()
{
		char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
		//int strlen(const char*str)
		printf("%d\n", strlen(arr));//随机值    arr代表首元素地址,从首元素地址开始数字符直到'\0',不知道啥时找到因此不确定值
		printf("%d\n", strlen(arr + 0));//随机值    同上
		printf("%d\n", strlen(*arr)); //error   *arr代表字符'a',也就是把字符a的ASC码值97当做地址向后找,然而以97为地址是不是以字符开始,能不能找都不知道,因此报错。
		printf("%d\n", strlen(arr[1]));//error     同上,把'b'的ASC码值当地址开始找,因此也报错
		printf("%d\n", strlen(&arr));//随机值  &arr虽然代表整个数组的地址,但整个数组的地址也指向数组首元素,因此同第一个
		printf("%d\n", strlen(&arr + 1));//随机值    但是是从下个数组地址开始找
		printf("%d\n", strlen(&arr[0] + 1));//随机值    从'b'开始向后找
	
			
	system("pause");
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", strlen(p));//6字节    p存放首元素地址,从a向后找直到遇见’/0',
	printf("%d\n", strlen(p + 1));//5字节    第二个元素地址,从b开始找.
	printf("%d\n", strlen(*p));//error        *p代表字符a,也就是把字符a的ASC码值97当做地址向后找,然而以97为地址是不是以字符开始,能不能找都不知道,因此报错。
	printf("%d\n", strlen(p[0]));//同上
	printf("%d\n", strlen(&p));//随机值     从p的地址开始找,不知道啥时找到
	printf("%d\n", strlen(&p + 1));//随机值     相比上面跳过一个char*开始找
	printf("%d\n", strlen(&p[0] + 1));//5字节    从第二个元素地址找
	system("pause");
	return 0;
}

今天学习就到这了。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值