指针引用字符串问题(详解)
创始人
2024-05-25 15:37:44
0次

通过指针引用字符串可以更加方便灵活的使用字符串。

 字符串的引用方式有两种,下面简单介绍一下这两种方法。

1.用字符数组来存放一个字符串。

1.1

可以通过数组名和下标来引用字符串中的一个字符。

1.2

还可以通过数组名和格式声明符%s输出整个字符串。

具体实现代码如下:

#include 
int main()
{char ch[] = "xuejiejie";printf("%s\n", ch);    //输出整个数组printf("%c\n", ch[1]); //输出第2个字符return 0;
}

结果:

xuejiejie
uD:\VS\Project4\x64\Debug\Project4.exe (进程 17608)已退出,代码为 0。
按任意键关闭此窗口. . .

2.用字符指针变量引用字符串常量。

先来举个例子:

#include 
int main()
{const char* string = "xuejiejie";printf("%s\n",string);return 0;
}

结果:

xuejiejieD:\VS\Project4\x64\Debug\Project4.exe (进程 17916)已退出,代码为 0。
按任意键关闭此窗口. . .

分析:

在c语言中对字符串常量是按照字符数组来处理,所以首先在内存中开辟一个连续字符数组来存放该字符串常量。

但是通过上面的代码我们可以发现字符串是没有数组名的,所以只能通过指针变量来引用。

其实在对指针进行赋值时,只是把字符串中的第一个字符的地址(首元素地址)赋值给指针变量。

对上面string而言就是把“x”的地址赋值给string。(注意不是把整个xuejiejie赋值给string)

错误示范:

	const char* string = "xuejiejie";*string = "xuejiejie";

 注意:当对一个数值型的数组时只用数组名是不能输出整个数组的,只能一个一个输出。

对于字符串的存取,可以采用下标法,指针法和指针变量法。

如下所示:

#include 
#include 
int main()
{char a[] = "xuejiejie";//下标法for (int i = 0; i < strlen(a); i++){printf("%c", a[i]);}printf("\n");//指针变量char* ch;ch = a;printf("%s\n", ch);for (; *ch != '\0'; ch++){printf("%c", *ch);}return 0;
}

    结果:
 

xuejiejie
xuejiejie
xuejiejie
D:\VS\Project4\x64\Debug\Project4.exe (进程 8860)已退出,代码为 0。
按任意键关闭此窗口. . .

字符指针作为函数参数时

函数的形参和实参都可以分别用字符数组名或字符指针变量来表示。

具体情况如下表所示:

实参形参
字符数组名字符数组名
字符数组名字符指针变量
字符指针变量字符指针变量
字符指针变量字符数组名

比较字符指针变量和字符数组

1.

字符数组是由许多元素组成的,里面只能一个一个来存放一个字符,存放的是‘字符’,而字符指针只是存放字符串中第一个字符的地址,而不是整个字符,

2.

可以对字符指针变量进行赋值,而不能对数组名进行赋值。(数组名代表地址,是常量,不能赋值)

3.

初始化含义不同。数组可以在定义时随便对其赋值,但不能用赋值语句对字符数组中的全部元素整体赋值。而指针数组可以后再进行赋值语句。

4.

开辟的存储空间不同。字符数组将会根据字符串长度或者人为定义的长度来分配储存单元。而字符指针变量,只会分配一个储存单元,用来存放首元素地址。

5.

指针变量的值后期可以自行设定改变,而字符数组的数组名代表一个固定的值(首元素地址)不能改变。

6.

字符数组中各元素的值可以改变,而字符指针变量指向的字符串常量中的内容是不能改变的。

 

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...