“hello world!”这是一个字符串常量。
他在内存中的存储时末尾自动加上‘\0’;
如果有字符数组:
char st[13] = “hello world!” 注意预留了’\0’
则他们的在内存中的存储造型一模一样
如果是这样:
char st[12] = “hello world!” 注意 此时没有预留了’\0’
此时他们在内存中的存储造型是否一模一样取决于字符数组后面的元素是否刚好为’\0’,尽管数据在内存中的存储非常稀疏,刚好遇到’\0’的几率比较大,但不应该抱有这样的侥幸去写程序,因为冒着程序有可能崩溃的风险不值得。
用指针动态创建字符串很好用
char *p;
p = “hello world!”;
但此时字符串是不允许被修改的。
比如:
p[0] = ‘M’,就是非法的
但只是打印,putchar(p[0]), 是合法的。
但如果是 char st[] = “hello world!”
st[0] = ‘M’,就是合法的。
字符指针的值是可以改变的,但是字符数组的变量名却不可以改变。
还是那上面的举例:
char *p = “hello world!”;
char st[] = “hello world!”;
p++; //合法
puts(p); //”ello world”;
st++; //不合法
如果想输出跟上面一样的效果可以这样写:
puts(&p[1]); //合法
字符数组的数组名也是指针,但它是一个常量指针,即其值不能被修改,取值的时候必须通过下标运算符取值。 而不能通过改变自己的值(指向的地址)取值。
//运用strupr实现忽略大小写,只适用于字符数组,不适于用字符指针动态创建的常量字符串
void main()
{
char a[20], b[20], *p1 = NULL, *p2 = NULL;
puts("请输入第一个字符串");
gets(a);
puts("请输入第二个字符串");
gets(b);
p1 = _strupr(a);
p2 = _strupr(b);
if(strcmp(p1, p2) == 0)
{
puts("相等!!!");
}
else
{
puts("不相等!!!");
}
//puts(_strupr("helloworld")); //不合法,字符常量不允许被改变
getchar();
}