C语言之字符指针

导读:本篇文章讲解 C语言之字符指针,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

字符指针:char*

字符指针的使用方式:

第一种:指向一个字符

#include<stdio.h>
int main()
{
	char ch = 'w';
	char* pc = &ch;//pc为字符指针
	*pc = 'w';//对指针进行解引用操作
	printf("%c\n", ch);
	printf("%c\n", *pc);
	return 0;
}
w
w

第二种:指向一个数组

#include<stdio.h>
int main()
{
	char ch[] = "hello, world";
	char* pc = ch;//pc为字符数组指针
	//以%s的形式进行输出,直到遇到\0停止打印
	printf("%s\n", ch);
	printf("%s\n", pc);
	return 0;
}
hello,world
hello,world

第三种:指向一个字符常量

#include<stdio.h>
int main()
{
	const char *ch = "hello, world";//hello,world(常量字符串)
	printf("%c\n", *ch);
	printf("%s\n", ch);
	return 0;
}
h
hello,world

对于char*ch=”hello,world”这行代码,很多小伙伴会认为是把hello,world放到字符指针ch里面,但其实是把字符串hello,world,首字符的地址放到了ch中.
它的内存布局如下图所示:
在这里插入图片描述
通过打印两者的地址验证一下:

#include<stdio.h>
int main()
{
	const char *ch = "hello, world";
	printf("%d\n", &(*ch));//输出首元素地址
	printf("%d\n", ch);//输出指针的值
	return 0;
}

那我检验一下你是不是真的搞清楚了,请看下面这道题,想想输出结果是什么?

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	const char* p1 = "abcdef";
	const char* p2 = "abcdef";
	if (arr1 == arr2)
	{
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

到底是haha还是hehe?如果你的答案是haha,那么恭喜你答对了。输出haha的原因很简单,数组名代表首地址,每个数据在内存中的地址不同。如果还有质疑的话,我们不妨打印look一下:
在这里插入图片描述到这里还没完,如果我将代码if语句里面的条件进行修改:

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	const char* p1 = "abcdef";
	const char* p2 = "abcdef";
	if (p1==p2)
	{
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

那么此时是输出haha还是hehe?
相信很多小伙伴会觉得,这不是明知故问吗?p1/p2指向字符串”abcdef”的首地址,两地址怎么可能相同啊,因此打印的一定是haha,那现在我们让代码运行看看输出结果是什么:
在这里插入图片描述咦!怎么是hehe呢?那么上面这种思路的小伙伴错哪里了?错在它们认为
它们都是代表首字符的地址,前两行是这样,我们上面也进行了验证。

char arr1[] = "abcdef";
char arr2[] = "abcdef";
const char* p1 = "abcdef";
const char* p2 = "abcdef";

但p1/p2指向的是一个常量字符,编译器认为它们都是常量,所以为了存储方便,所以p1/p2指向的当然是同一个字符。

const char* p1 = "abcdef";
const char* p2 = "abcdef";

不妨我们进行打印一下:
在这里插入图片描述
用图示为这样:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81491.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!