C语言之字符串和指针

 

目录

用数组实现的字符串和用指针实现的字符串

█用数组实现的字符串str

█用指针实现的字符串ptr

注意

用数组和指针实现字符串的不同点

字符串数组

 用数组实现的字符串的数组——二维数组

用指针实现的字符串数组——指针数组

注意


字符串和指针有着紧密·的联系,下面我们就来学习字符串和指针的相似点和不同点。


用数组实现的字符串和用指针实现的字符串

下面我们来看用数组和指针实现的字符串

#include<stdio.h>

int main()
{
	char str[] = "ABC";
	char *ptr = "123";
	
	printf("str=\"%s\"\n", str);
	printf("ptr=\"%s\"\n", ptr);

	return 0;
}

让我们来结合两图来分析它们的异同:

█用数组实现的字符串str

str是char[4]类型的数组,各元素从开头开始依次用‘A’ 'B' 'C' '\0'进行初始化,char数组占据的内存空间和数组元素个数一致,可以通过sizeof(str)求得

█用指针实现的字符串ptr

ptr是指向char型变量的指针变量,它的初始值为字符串字面量“123”,对字符串字面量进行判定,可以得到指向该字符串字面量第一个字符的指针,所以ptr被初始化为指向保存在内存中的字符串字面量“123”的第一个字符‘1’的指针

另外一般情况下,我们把指针p指向字符串字面量“string”的首个字符‘s’,称为“指针p指向string”

需要注意的是指针ptr不可进行如下声明:

	char *ptr = {'1', '2', '3', '\0'};

数组用的{ }形式的初始值,不可以用于单一的变量

从上面的图可以看出,指针ptr和字符串字面量“123”都占用了空间,指针ptr占用的空间为sizeof(ptr),即sizeof(char*)字节,其长度因编译器而异。

请注意,用指针实现的字符串相比于数组需要更多的内存空间。

注意

指针p是指向字符串首个字符的指针,数组str也是指向首个字符的指针(因为数组名会被解释为指向起始元素的指针)

综上,使用下标运算符[ ],可以访问字符串中的各个字符,这是二者的共同点

用数组和指针实现字符串的不同点

先让我们来看下面两段代码:

/*这是一段错误的代码*/
#include<stdio.h>

int main()
{
	char s[] = "ABC";
	printf("s= \"%s\"\n", s);
	s = DEF;
	printf("s= \"%s\"\n", s);

	return 0;
}
/*这是一段正确的代码*/
#include<stdio.h>

int main()
{
	char *p = "123";
	printf("p= \"%s\"\n", p);
    p = "456";
	printf("p= \"%s\"\n", p);

	return 0;
}

 在第一段代码中,目的是将“DEF”赋值给“ABC”的数组,并显示前后赋值的字符串,在进行DEF的赋值过程中会发生错误,所以程序无法执行,因为对数组不能进行赋值,虽然左边的数组名可以被解释为数组起始元素的地址,但依然不能改写其值,否则就会改变数组的地址。

我们用图来解释第二段代码的赋值的原理:

第一个图对应:

char *p = "123";

指针p的初始值为字符串字面量“123”,所以指针p指向字符串字面量“123”的第一个字符‘1’

第二个图对应:

  p = "456";

与上面的解释一样,不过是对其地址上保存的值进行更改而异,指针p指向的字符变为了‘4’

不要误以为是进行了赋值,其实不过是指针的指向发生了变化,因为不再有指针指向123,所以该字符串也不能被访问,也就是说成为了无法清除的垃圾。


字符串数组

在前面我们学习了用数组和指针两种形式来表示字符串,而字符串数组就是将字符串“数组化”来实现的


#include<stdio.h>

int main()
{
	int i = 0;
	char a[][5] = {"MAX", "MIN"};
	char *p[] = {"MAX", "MIN"};
	
	for(;i < 2; i++)
		printf("a[%d] = \"%s\"\n", i, a[i]);
	for(;i < 2; i++)
		printf("p[%d] = \"%s\"\n", i, p[i];
			
			return 0;
}

 用数组实现的字符串的数组——二维数组

数组a是2行5列的二维数组,占用的内存空间是10个字节(行数乘列数),并非所有的字符串长度是一样的,所以数组会产生未被使用的部分。

a[0][0]

a[0][1]

……

……

a[2][4]

a[2][5]

01234
0MAX\0\0
1MIN\0\0

用指针实现的字符串数组——指针数组

指针p是元素类型为char*型,元素个数为2的数组,数组p[0] p[1] 分别指向各字符串字面量的首字符‘M’的指针,因此除了数组p占用的2个sizeof(char*)长度之的空间之外,还占用2个字符串字面量的空间。

字符串字面量中的MAX中的字符,可以从头开始按顺序通过p[0][0] p[0][1]……等来访问,通过连续使用下标运算符[ ],可以像二维数组一样处理指针数组。

注意

因为无法保证初始值的字符串字面量在内存单元时连续保存的,所以在上图中字符串字面量并不是相邻的,并不能想当然的认为“MAX”后面就保存着“M”,否则在有些编译器和运行环境中不能运行。


结语

我也是终于放寒假了,希望在座的各位都能不挂科取得好成绩!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/319268.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣(105. 从前序与中序遍历序列构造二叉树,106. 从中序与后序遍历序列构造二叉树)

题目1链接 题目1&#xff1a; 思路&#xff1a;使用前序确定根&#xff0c;使用中序分左右子树&#xff0c;分治法。 难点&#xff1a;如何控制递归确定左右子树。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* T…

【STM32】FLASH闪存

1 FLASH闪存简介 本节所指STM32内部闪存&#xff0c;即下载程序的时候&#xff0c;程序存储的地方。&#xff08;非易失性&#xff09; STM32F1系列的FLASH包含程序存储器、系统存储器&#xff08;bootloader&#xff0c;不允许修改&#xff09;和选项字节三个部分&#xff0…

华西建筑智能化寻找志同道合的创业团队

我今天四十多了&#xff0c;之前也创过业&#xff0c;做软件开发系统集成的。 19年进入华西建筑装饰工程有限公司负责机电安装及弱电智能化版块。后公司成立建筑智能化事业部&#xff0c;我负责。现在想全身心打造施工企业项目管理平台&#xff0c;同时进军智慧康养领域。我想…

1.5矩阵元素的引用

通过下标来引用矩阵的元素 A(3, 2)表示A矩阵第3行第2列的元素。 >> arr [1,2,3;4,5,6]; >> arr(4, 5) 10arr 1 2 3 0 04 5 6 0 00 0 0 0 00 0 0 0 10>> 如果引用元素超过矩阵的大小将自…

Windows下面基于pgsql15的备份和恢复

一、基础备份 1.创建一个文件用来存储备份数据 2.备份指令 $CurrentDate Get-Date -Format "yyyy-MM-dd" $OutputDirectory "D:\PgsqData\pg_base\$CurrentDate" $Command "./pg_basebackup -h 127.0.0.1 -U postgres -Ft -Pv -Xf -z -Z5 -D $O…

Navicat 16 for MySQL:打造高效数据库开发管理工具

随着数据的快速增长和复杂性的提升&#xff0c;数据库成为了现代应用开发中不可或缺的一部分。而在MySQL数据库领域&#xff0c;Navicat 16 for MySQL作为一款强大的数据库开发管理工具&#xff0c;正受到越来越多开发者的青睐。 Navicat 16 for MySQL拥有丰富的功能和直观的界…

功能权限篇

文章目录 1. 如何设计一套权限系统1.1 目标1.2 权限模型1.2.1 模型一RBAC1.2.2 模型二ABAC 2.如何实现菜单的创建&#xff1f;2.1 表结构2.2 前端实现2.3 后端实现 3. 如何实现角色的创建&#xff1f;4.如何给用户分配权限 —— 将菜单赋予角色&#xff1f;5.如何给用户分配权限…

sqlilabs第五十三五十四关

Less-51(GET - GET - Error based - ORDER BY CLAUSE-String- Stacked injection) 手工注入 单引号闭合&#xff0c;和上一关一样堆叠注入解决 自动注入 和上一关一样 Less-52(GET - challenge - Union- 10 queries allowed -Variation 1) 手工注入 这一关开始后面的可以看…

设计模式之备忘录模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

QT上位机开发(函数运行时间分析)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 软件除了功能开发、debug之外&#xff0c;另外一个很重要的部分就是软件的优化和提高。这里面的优化&#xff0c;当然就是希望软件能够处理更多的数…

[Beego]1.Beego简介以及beego环境搭建,bee脚手架的使用,创建,运行项目

一.Beego介绍 Beego是一个开源的基于Golang的MVC框架&#xff0c;主要用于Golang Web开发,Beego可以用来快速开发API、Web、后端服务等各种应用。 Golang 的Web开发框架有很多,从 github star 数量来看Gin>Beego>lris>Echo>Revel>Buffalo 目前国内用的比较多的就…

在ubuntu平台上安装minecraft

一、获取minecraft启动器安装包 登陆minecraft官网Welcome to the Minecraft Official Site | Minecraft&#xff0c;使用已经购买minecraft的microsoft或者mojang账号登陆。 点击Download Launcher 对于ubuntu系统&#xff0c;使用点击debian版本 此后便会自动下载Minecraft.…

基于pyradiomics影像组学特征提取

基于pyradiomics影像组学特征提取 特征提取&#xff1a;1 pyradiomics的使用&#xff1a;1.1&#xff0c;在python环境下安装pyradiomics:1.2,设置特征提取器&#xff0c;获得想要特征&#xff1a;1.2.1 图像类型1.2.2 目标特征设置1.2.3 特征提取器设置 2 代码示例;参考&#…

关于提高IDEA运行速度的说明

1.作者IDEA软件版本和计算机内存 Ultimate 2022.1.2版 2.修改配置提高IDEA运行速度的误区 很多文章会教调内存&#xff0c;但大多是让你调高堆内存&#xff0c;-Xms -Xmx 是最小堆内存和最大堆内存。堆内存越高&#xff0c;说明堆区可放入新对象的数量越多&#xff0c;由于…

关闭免费版pycharm社区版双击shift时出现的搜索框

Pycharm 在双击 shift 的时候总是弹出搜索框&#xff0c;但作为中国玩家&#xff0c;经常需要双击 shift 循环切换中英文。这就很困恼。 下面就解决这个问题。单独关闭双击shift的功能。 步骤 1.左上角 File -> Settings 2. 如图&#xff0c;输入‘advan’ 找到高级设置&…

分享从零开始学习网络设备配置--任务4.4 使用动态路由OSPFv3实现网络连通

任务描述 由于RIPng不适用于复杂的网络&#xff0c;考虑到公司的未来发展&#xff0c;需要不断扩大网络规模。某公司在企业网络升级时&#xff0c;选择 OSPFv3路由协议实现网络连通&#xff0c;降低网络拓扑变化引发的人工维护工作量并加快网络收敛的速度。 公司内部的所有设…

Leetcode26——引出c++ vector中erase()的内部原理

erase是对数组中某个元素进行删除的操作&#xff0c;实际的时间复杂度为O(n) 预备知识 数组在内存中是连续存储的&#xff0c;删除某个位置的时候不能直接删除&#xff0c;只能用后序的元素覆盖 以nums数组为例&#xff0c;target为需要删除的目标数据 方法&#xff1a; ①…

Windows无法登录管理路由器故障排查

问题描述 家里的路由器使用拨号上网&#xff0c;路由器DHCP分发IP的范围是192.168.1.0/24。默认使用192.168.1.1管理路由器。然后拨号上网成功后&#xff0c;修改了私网IP的分发范围&#xff1a;192.168.5.1-192.168.5.10。为了防止有人蹭网&#xff0c;只分配的10个IP地址。修…

Android Studio由于开启代理无法下载依赖,一直在Build model

一、问题描述 正常打开AS项目&#xff0c;一直显示Build model就是不下载依赖 二、问题解决 1、首先选择No Proxy&#xff0c;可以看到这位同学之前是使用的代理。 2、打开下面文件&#xff0c;然后删除某尾的4行。 3、面对提示框&#xff0c;直接点击OK。 4、然后停…

Trans论文复现:基于数据驱动的新能源充电站两阶段规划方法程序代码!

适用平台&#xff1a;MatlabYalmipCplex/Gurobi&#xff1b; 文章提出了一种电动汽车充电站的两阶段规划方法&#xff0c;第一阶段通过蒙特卡洛法模拟充电车辆需求和电池充放电数据来确定充电站位置&#xff1b;第二阶段通过数据驱动的分布鲁棒优化方法优化充电站的新能源和电池…