指针定义字符串与数组定义字符串 sizeof与strlen使用

	const char *m3 = "\nEnough about me - what's your name? ";
	const char *m4 = "1";
	const char(*m5)[21] = "12345678901234567890";

m3是不含初始化长度,m5含有初始化长度

m3+1是指m3的地址加1,m5加1是指m5的地址加上m5的长度

 

m5的地址为0x00337ca8,加1后变为0x337cbd,即加上22

m3的地址为0x00337bb5,加1后变为0x00337bb6。


int main(void) {
	char str1[] = "abc";
	char str2[] = "abc";
	const char str3[] = "abc";
	const char str4[] = "abc";
	const char* str5 = "abc";
	const char* str6 = "abc";
	printf("%d\n",(int)str1);
	printf("%d\n", (int)str2);
	printf("%d\n", (int)str3);
	printf("%d\n", (int)str4);
	printf("%d\n", (int)str5);
	printf("%d\n", (int)str6);
	if (str1 == str2)
		printf("TURE ");
	else
		printf("FALSE ");
	if (str3 == str4)
		printf("TURE ");
	else
		printf("FALSE ");
	if (str5 == str6)
		printf("TURE ");
	else
		printf("FALSE ");
	getchar();
	return 0;
}

 

数组定义字符串:

每次定义数组的时候,系统都会在内存开辟你指定数组大小的空间,并且数组中的内容对于我们是可读可写的,每次定义的数组的首地址是不相同的。

 

指针定义字符串:

指针定义的字符串是存储在内存中的静态存储空间中,可读但不可写,并且如果再定义一个相同的字符串,指针的值不会变,还会指向原来的地址,不会开辟新的存储空间,相同的字符串的指针是指向同一个地方的。

------------------------------------------------------

sizeof与strlen使用

	char str1[] = "abcde";
	const char* str5 = "abcde";
	printf("%d\n",sizeof(str1));
	printf("%d\n",strlen(str1));
	printf("%d\n", sizeof(str5));
	printf("%d\n", strlen(str5));

sizeof计算大小数组字符串包含\0,strlen计算数组字符串不包含\0

sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。

strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。

sizeof计算的都是类型的长度。如果是对象,则转换成类型,再计算类型的长度。在32位系统中。指针类型是32位,4个字节。所以对任何指针用sizeof结果都是4;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值