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;