对于strlen库函数和sizeof操作符的进一步了解

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = {"hello everyone"};
	printf("%d\n%d", sizeof(str), strlen(str));//输出结果为15 14,sizeof会将\0也统计进去所以会比strlen多一个。
	return 0;
}
//sizeof
//sizeof是一个操作符
//是用来计算变量(类型)所占空间大小,不关注内存中存放的具体内容,单位是字节

//strlen
//strlen是一个库函数,是专门求字符串长度的,只能针对字符串
//从参数给定的地址向后一直找\0,统计\0之前出现的字符的个数
//返回的是无符号整型数据
 
#include<stdio.h>
#include<string.h>
int main()
{
	if (strlen("abc") - strlen("abcdefg") >= 0)
	//if((int)strlen("abc")-(int)strlen("abcdef")>=0)//这样的话,输出结果为“<”
	{
		printf(">\n");
	}
	else
	{
		printf("<\n");
	}
	return 0;
	//输出结果为“>”
	//因为strlen函数返回的是无符号整型数据,两个无符号整型数据相减等于一个无符号整型数据
	//如果想要输出“<”的话,可以将strlen的返回值强制转换为int
}


#include<stdio.h>
#include<string.h>
int main()
{
	/*char* p = "abcdef";
	int i = 0;
	for (i = 0; i < 6; i++)
	{
		printf("%c ", *(p + i));
	}*/

	char a[] = "abcdef";//这样初始化字符数组,数组最后一个元素是\0
	char b[] = { 'a','b','c','d','e','f' };//这样初始化字符数组,数组最后一个元素是d
	char c[] = { 'a','b','c','d','e','f','\0' };
	sizeof(b);
	sizeof(a);
	printf("%d\n", sizeof(a));//输出结果为 7
	printf("%d\n", sizeof(b));//输出结果为 6
	printf("%d\n", sizeof(c));//输出结果为 7
	//printf("%d\n", strlen(a));//输出结果为 6
	//printf("%d\n", strlen(b));//输出结果为随机值,所以char b[] = { 'a','b','c','d','e','f' }初始化数组记得在末尾加一个'\0'
	//printf("%d\n", strlen(c));//输出结果为 6

	return 0;

}

#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));//输出结果为 16
	//这里的数组名代表的是整个数组,sizeof(数组名)求的是整个数组的大小,单位是字节

	printf("%d\n", sizeof(a + 0));//输出结果为 4 或 8
	//具体是 4 还是 8 要看处于什么环境底下调试,处于32位平台(x86)的话,结果为4,处于64位平台(x64)的话,结果为8
   //这里的a是首元素地址,(a+0)= a,地址的字节是 4 或 8

	printf("%d\n", sizeof(*a));//输出结果为 4
	//这里的a是首元素地址,*a就是第一个元素

	printf("%d\n", sizeof(a + 1));//输出结果为 4 或 8
	//a+1 就是第二个元素的地址

	printf("%d\n", sizeof(a[1]));//输出结果为 4
	// a[1]就是第二个元素

	printf("%d\n", sizeof(&a));//输出结果为 4 或 8
	//&a就是数组的地址,sizeof(地址)就是 4 或 8

	printf("%d\n", sizeof(*&a));//输出结果为 16
	//第一种想法 
	// * 和 & 抵消了
	// *&a相当于a
	// 第二种想法
	// &a拿到的是数组名的地址,类型是int(*)[4],是一种数组指针
	//数组指针解引用找到的是数组
	//*&a <=> a

	printf("%d\n", sizeof(&a + 1));//输出结果为 4或 8
	//&a+1 是从数组a的地址向后跳过了一个(4个整型元素的)数组的大小
	//但是&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;
}

#include<stdio.h>
int main()
{
	char a[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(a));//输出结果为 6

	printf("%d\n", sizeof(a + 0));//输出结果为 4 或 8
	//这里的a的是首元素地址

	printf("%d\n", sizeof(*a));//输出结果为 1
	//这里的a也是首元素地址,*a就是第一个元素

	printf("%d\n", sizeof(a[1]));//输出结果为 1
	//a[1] 就是第二个元素

	printf("%d\n", sizeof(&a));//输出结果为 4 或 8
	//&a 就是数组的地址

	printf("%d\n", sizeof(&a + 1));//输出结果为 4 或 8
	//&a+1 就是从a的地址向后跳过一个(6个字符型元素的)数组大小
	//&a+1 也是地址

	printf("%d\n", sizeof(&a[0] + 1));//输出结果为 4或 8
	//&a[0]+1 就是第二个元素的地址

	return 0;
}

#include<stdio.h>
#include<string.h>
int main()
{
	char a[] = { 'a','b','c','d','e','f' };

	//strlen是一个库函数,是专门求字符串长度的,只能针对字符串
	//从参数给定的地址向后一直找\0,统计\0之前出现的字符的个数
	//返回的是无符号整型数据

	printf("%d\n", strlen(a));//结果为 随机值
	//这里的a表示数组首元素地址,并且像上面那样初始化数组,数组中没有 '\0',strlen会向后一直访问数据,直到遇见 '\0',
	//然后将在遇见 '\0'之前的数据个数统计返回,所以结果才会是随机值

	printf("%d\n", strlen(a+0));//结果为 随机值
	//这里的a也是首元素地址,(a+0)等价于a,所以结果也为随机值
	
	//printf("%d\n", strlen(*a));//会报错
	// *a表示数组的第一个元素,将一个字符数据传给strlen会报错,因为strlen接收的是一个地址,所以传参需要传一个地址 
	// 
	//printf("%d\n", strlen(a[1]));//会报错
	//这里的a[1]表示数组中的第二个元素,与上面结果一样

	printf("%d\n", strlen(&a));//结果为 随机值
	//&a 表示数组的的地址,但是像上面初始化数组,数组中并没有 '\0',所以结果也是随机值

	printf("%d\n", strlen(&a+1));//结果为 随机值-6
	//&a+1 表示从a地址的位置向后跳过一个(6个字符型数据的)数组,所以结果为随机值-6

	printf("%d\n", strlen(&a[0]+1));//结果为 随机值-1
	//&a[0]+1 表示数组中第二个元素的地址,所以结果为随机值-1
	
	return 0;

}

#include<stdio.h>
int main()
{
	char a[] = "abcdef";
	printf("%d\n", sizeof(a));//结果为 7
	//a 表示数组的地址,数组中有7个元素,所以结果为 7

	printf("%d\n", sizeof(a+0));//结果为 4或8
	//a 表示数组首元素地址,地址的大小只与平台测试环境有关

	printf("%d\n", sizeof(*a));//结果为 1
	//*a 表示第一个元素,因为是字符型数组,所以结果为1

	printf("%d\n", sizeof(a[1]));//结果为 1
	//a[1] 表示第二个元素,所以结果为 1

	printf("%d\n", sizeof(&a));//结果为 4 或 8
	//&a 表示数组的地址,因为地址的大小只与平台测试环境有关

	printf("%d\n", sizeof(&a+1));//结果为 4或8
	//&a+1 也表示地址,所以结果为 4或8

	printf("%d\n", sizeof(&a[0]+1));//结果为 4或8
	//&a[0]+1 表示第二个元素的地址,因为是地址,所以结果为 4或8
}

#include<stdio.h>
#include<string.h>
int main()
{
	char a[] = "abcdef";

	printf("%d\n", strlen(a));//结果为 6
	//a 表示数组首元素地址,所以结果为 6

	printf("%d\n", strlen(a+0));//结果为 6
	//这里的a与上面的一样,a+0=a,所以结果为 6

	//printf("%d\n", strlen(*a));//结果为 报错
	// *a 表示第一个元素,strlen无法接收,所以会报错

	//printf("%d\n", strlen(a[1]));//结果为 报错
	//a[1] 表示第二个元素,strlen无法接收,所以会报错

	printf("%d\n", strlen(&a));//结果为 6
	//&a 表示数组的地址,strlen用数组指针接收,然后找到数组并访问

	printf("%d\n", strlen(&a+1));//结果为 随机值
	//&a+1 表示从a的地址向后跳过一个(6个字符型数据的)数组,所以为随机值

	printf("%d\n", strlen(&a[0] + 1));//结果为 5
	//&a[0]+1 表示第二个元素的地址,所以strlen从第二个元素开始往后找'\0',所以结果为5

	return 0;
}

#include<stdio.h>
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//结果为 48
	//这里的a表示二维数组的地址,所以为3*4*4=48

	printf("%d\n", sizeof(a[0][0]));//结果为 4
	//a[0][0] 表示第一行第一个元素,因为数组是int型,所以结果为 4

	printf("%d\n", sizeof(a[0]));//结果为 16
	//a[0] 表示第一行的地址,将第一行的元素看作一个一维数组,a[0]就是这个一维数组的数组名,所以结果为4*4=16

	printf("%d\n", sizeof(a[0]+1));//结果为 4或8
	//a[0]没有单独放在sizeof内部,也没有取地址,a[0]就表示第一行的地址
	//这里的a[0]表示第一行第一个元素的地址,a[0]+1就是第一行第二个元素的地址,因为是地址,所以结果为 4或8

	printf("%d\n", sizeof(*(a[0]+1)));//结果为 4
	//*(a[0]+1) 表示第一行第二个元素,所以结果为 4

	printf("%d\n", sizeof(a+1));//结果为 4或8
	//a虽然是二维数组的地址,但是并没有单独放在sizeof内部,也没有取地址
	// a表示首元素地址,二维数组的首元素地址就是它的第一行,a就是第一行的地址
	//这里的a表示第一行的地址,a+1表示第二行的地址

	printf("%d\n", sizeof(*(a+1)));//结果为 16
	//*(a+1) 表示第二行所有的元素,所以结果为4*4=16

	printf("%d\n", sizeof(&a[0]+1));//结果为 4或8
	//&a[0] 表示第一行的地址,(&a[0]+1) 表示第二行的地址

	printf("%d\n", sizeof(*(&a[0]+1)));//结果为 16
	//*(&a[0]+1) 表示第二行所有的元素

	printf("%d\n", sizeof(*a));//结果为 16
	//这里的a表示第一行的地址,*a 表示第一行所有的元素,所以结果为4*4=16

	printf("%d\n", sizeof(a[3]));//结果为 16
	//a[3] 表示第四行的地址,因为定义二维数组的时候已经将列的长度确定了,所以尽管行访问越界,但是每行的元素个数已经确定了
	//所以结果为4*4=16
	//a[3]与a[0]的结果一样

	return 0;
}

 //总结
 //sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
 //&数组名,这里的数组名也表示整个数组,取出的是整个数组的地址
 //除此之外所有的数组名都表示首元素地址

如果我的理解或者代码有误,请大家指出来,谢谢大家!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值