字符指针的进阶

举报
念君思宁 发表于 2023/02/15 14:16:57 2023/02/15
【摘要】 字符指针的进阶

对于指针,到此处的读者对于都有着不少的独自认识与了解!因此,笔者也不敢托大!作为一个浅浅的小白,写篇指针的进阶,来祈祷大佬的指教!

首先,笔者先对指针进行初步回顾一下!

1.指针就是变量,用来存放地址,地址唯一标识的一块内存空间!

2.指针的大小是固定的4/8个字节(32位平台/64位平台)!

3.指针是有类型,指针的类型决定了指针走一步(+,-)整数的步长!指针解引用操作的时候的权限!

4.指针的运算!


下面步入正题:

1.字符指针:char * 类型


  1. char ch = 'W';

  2. char* pc = &ch;

这段是我们所熟悉的!但是对于再字符串指针中:

#include <stdio.h>
int main()
{
	char* ps = "abcdef";
	printf("%c\n", *ps);
    return 0;
}

而最后的打印结果为:a

对于打印结果,不少人有着疑惑,但结果确实是这样的!

在这里面  char* ps = "abcdef",仅仅是将 字符串的首地址(a的地址)传递给了指针ps;

并不是将abcdef存放到ps里面,而是存放的a的地址!因此再printf("");语句里面,对其解引用,得到的结果为a ;

2.在上述代码中:    char* ps = "abcdef";  为字符串常量,

下面笔者对上述代码段进行简单更改!

#include <stdio.h>
int main()
{
	char* ps = "abcdef";
	ps = 'w';
	printf("%c\n", *ps);
	return 0;
}

然而最后的打印结果为:什么都不打印!!!

 

是滴!我没有说错,你也没有看错!最后的打印结果确实为:什么都没有!!!

主要原因为:字符串常量不可修改!

 
#include <stdio.h>
int main()
{
	char* ps = "abcdef";
	
	printf("%s\n", ps);
	return 0;
}

 对于上述代码,与第一个代码不同的是在于printf(""); 语句里面的%s; %s:打印字符串,而打印字符串只需要知道起始位置就可以,而ps里面放的是‘a'的地址!则可以顺序打印出来abcdef;

因此最后的打印结果为: abcdef

3.字符串的比较

#include <stdio.h>
int main()
{
	char ch1[] = "hello jiyuan";
	char ch2[] = "hello jiyuan";
 
	const char* ch3[] = "hello jiyuan";
	const char* ch4[] = "hello jiyuan";
 
	if (ch1 == ch2)
	{
		printf("相同\n");
	}
	else
	{
		printf("不相同\n");
	}
 
	if (ch3 == ch4)
	{
		printf("相同\n");
	}
	else
	{
		printf("不相同\n");
	}
	return 0;
}

在上述代码中,笔者首先定义了两个数组: ch1[], ch2[]; 在这两个数组里面,输入的字符串是一样的,但是再内存中,开辟了两个地址来存放这两个字符串,因此地址是不一样的!

然后笔者定义了两个:const char* 类型的字符串: ch3[], ch4[];里面存放着相同的字符串,常量字符串不能修改!则,存放ch3[] 与存放ch4[] 元素的地址相同!

然而,在下方if语句里面,咋一看吓到了不少人,但是,数组名是数组首元素的地址!所以,在if语句里面比较的是:地址!

所以最后的结果显而易见!

如果读者想比较字符串的内容,则可以使用库函数:strcmp();

即:ch1[] 与 ch2[] 一样 ;  ch3[] 与 ch4[] 一样!在此笔者就不做过多的讲述!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。