字符指针使用方法|新手易懂(含笔试题)

在指针的类型中我们知道有一种指针类型为字符指针 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);%sp
在这里插入图片描述

对于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相同。
你懂了吗?
在这里插入图片描述

以上就是我总结的字符指针使用方法,希望对大家有帮助。

欢迎指教指点。

我的主页还有其他文章,欢迎和我一起学习。

点赞👍+关注

让我们一起学习一起成长!
在这里插入图片描述

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值