在指针的类型中我们知道有一种指针类型为字符指针 char* ;
一般使用方式
一般使用方式如下:
int main()
{
char ch = 'w';
char *pc = &ch;//pc是指向一个字符变量
*pc = 'w';
return 0;
}
对于
char* pc = &ch;
拆开讲,前面的*
表示pc是个指针变量,char
表示pc指向的变量的类型是char类型。
其他使用方式
还有一种使用方式如下:
int main()
{
char* p = "hello world";
printf("%s", p);
return 0;
}
对于
char* p = “hello world”;
特别容易让人以为是把字符串 hello world 放到字符指针 p 里
了,其实不是的。
"hello world"
是一个常量字符串,存放在内存的常量区。
上面表达式的作用是:把常量字符串"hello world"的第一个字符h的地址赋值给p。
我们可以来测试一下是不是这样?
printf(“%c”, *p);
上面说p指向 hello world的首字母h的地址,那么对p解引用,*p就是h,我们来运行一下看是不是这样
可以看到,确实是这样的
其实
p指针是指向了hello world
这个字符串,但它只是存了h的地址,指向了h就相当于指向了hello world整个字符串,因为这个字符串是连续的。
所以我们要打印一个字符的时候,用printf("%c", *p);
用%c
和*p
如果我们要打印整个字符串,则用printf("%s", p);
用%s
和p
对于printf,
printf(“%c”, *p);
printf(“%s”, p);
写成%s的时候,后面“p”这里只提供一个地址就可以了。p里面存的是h的地址,打印时就从p里面存的h的地址开始打印整个字符串hello world。
💡注意:
这里写一个p就可以了,不要写成*p了。*p指的是一个字符h。写%s表示打印字符串,后面给一个地址就可以了;而%c表示只打印一个字符。
隐含的问题
其实这个写法char* p = "hello world";
不太好,有的编译器可能会报错。
因为"hello world"
是一个常量字符串,存放在内存的常量区是不允许改动的。而前面的char* p
是不受限制的,一旦p指针重新改动,即后面的不允许改,但前面的有随意改动,程序就会报错
比如说我们来改一下*p,运行时不会报错,不过一直也不会给出打印的结果,但调试一下就会显示错误
(前面讲的时候,常量字符串用的是"hello world",这里我截屏上写的是"hello bit",一个意思,改动的是*p)
可以看到确实不行。
解决措施
那这时候怎么办呢?
我们可以用到const,用它来修饰p,即指针指向的内容就不能被修改了,一旦我们修改了p,编译器就会报错提醒,如下图
所以如果写常量字符串,我们要有一个指针指向的话,前面最好加一个const修饰,这样比较合理。
对应笔试题
#include <stdio.h>
int main()
{
char str1[] = “hello bit.”;
char str2[] = “hello bit.”;
char *str3 = “hello bit.”;
char *str4 = “hello bit.”;
if(str1 ==str2)
printf(“str1 and str2 are same\n”);
else
printf(“str1 and str2 are not same\n”);
if(str3 ==str4)
printf(“str3 and str4 are same\n”);
else
printf(“str3 and str4 are not same\n”);
return 0;
}
问最后输出什么?
可以看到,最后的运行结果如下
原因如下:
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。
但是用相同的常量字符串去初始化
不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。
你懂了吗?
以上就是我总结的字符指针使用方法,希望对大家有帮助。
欢迎指教指点。
我的主页还有其他文章,欢迎和我一起学习。
点赞👍+关注我
让我们一起学习一起成长!