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”,否则在有些编译器和运行环境中不能运行。


结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TikTok系列算法定位还原x-ss-stub

TikTok的x系列的算法比较有名,很多粉丝也问过,之前没有深入研究,本人工作量也比较大。 我们上次说到TikTok的x-ss-stub的算法就是ccmd5标准库算的,今天要讲细致点,表面这个结论本不是直接将数据md5那么来的,是经过一系列分析来的 上图是上次截图的,这次我们分析整个定位…

node(express.js创建项目)+连接mysql数据库

1.node npm的安装 2.express的安装 全局安装:npm install express -gnpm install -g express-generator// ps: 4.0版本把generator分离出来了&#xff0c;需要单独安装3.创建express项目 express 项目名称 cd 项目名称 npm install npm start4.项目中安装数据库 npm install…

C语言督学营(高级阶段)

文章目录 高级阶段19.C语言语法进阶1.条件运算符、逗号运算符(1)条件运算符 / 三目运算符   ? :(2)逗号运算符   , 2.自增自减运算符3.位运算符&#xff1a;按位或、按位异或、按位取反(1)逻辑与、按位与、左移、右移(2)有符号数右移 vs 无符号数右移(3)按位与、按位或、按位…

Docker学习与应用(五)-DockerFile

1、DockerFile 1&#xff09;DockerFile介绍 dockerfile是用来构建docker镜像的文件&#xff01;命令参数脚本&#xff01; 构建步骤&#xff1a; 1. 编写一个dockerfile文件 2. docker build 构建称为一个镜像 3. docker run运行镜像 4. docker push发布镜像&#xff08;D…

LC 83. 删除排序链表中的重复元素

83. 删除排序链表中的重复元素 难度 &#xff1a; 简单 题目&#xff1a; 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 提示&#xff1a; 链表中节点数目在范围 [0, 300] 内-100 < Node.va…

蓝桥杯准备

书籍获取&#xff1a;Z-Library – 世界上最大的电子图书馆。自由访问知识和文化。 (zlibrary-east.se) 书评&#xff1a;(豆瓣) (douban.com) 一、观千曲而后晓声 别人常说蓝桥杯拿奖很简单&#xff0c;但是拿奖是一回事&#xff0c;拿什么奖又是一回事。况且&#xff0c;如果…

Docker教程

docker 安装 官方文档 wget -qO- https://get.docker.com/ | sh sudo usermod -aG docker your-user sudo usermod -aG docker ${USER} newgrp docker # 更新docker用户组 cat /etc/group | grep docker docker --version 使用非root用户管理 帮助启动类 命令 system…

寄快递有没有什么省钱的小妙招? 怎样寄快递才能省钱呢?

快递物流行业的快速崛起刺激了人们的消费欲望&#xff0c;其中典型的是每每到重大节日尤其是双十一或者双十二&#xff0c;消费市场异常火爆&#xff0c;这也使得快递行业加班加点的干也不追不上人们下单的速度。如今&#xff0c;互联网时代崛起&#xff0c;网购成为了大家最寻…

机器学习_捕捉函数的变化趋势(凸函数)

文章目录 连续性是求导的前提条件通过求导发现 y 如何随 x 而变凸函数有一个全局最低点 机器学习所关心的问题之一捕捉函数的变化趋势&#xff0c;也就是标签&#xff08;y&#xff09;是如何随着特征字段&#xff08;x&#xff09;而变化的&#xff0c;这个变化趋势是通过求导…

代码随想录day30 回溯算法最终章

51. N皇后 题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 Q 和…

想做好项目,网工必看!

上午好&#xff0c;我是老杨。 做项目&#xff0c;贯穿一个网络工程师职业生涯的始终。不管是大项目还是小项目&#xff0c;做久了项目&#xff0c;都会形成一种自己的方法论。 项目要划分&#xff0c;无非就是新网组建&#xff0c;旧网优化&#xff0c;以及网络排障三大类。…

ISO11898-闭环高速CAN网络 (125K~1Mbps)

ISO11898 标准的物理框图如下图 可理解为一个高速闭环 CAN 总线网络&#xff1b;CAN 闭环总线网络允许总线最大长度为 40m;最高速度为 1Mbps;可以看到总线的两端各有一个 120Ω 的电阻&#xff0c;此电阻作为阻抗匹配功能&#xff0c;以减少回波反射;节点就是不同的设备&#…

Pytorch基础知识点复习

文章目录 并行计算单卡训练多卡训练单机多卡DP多机多卡DDPDP 与 DDP 的优缺点 PyTorch的主要组成模块Pytorch的主要组成模块包括那些呢&#xff1f;Dataset和DataLoader的作用是什么&#xff0c;我们如何构建自己的Dataset和DataLoader&#xff1f;神经网络的一般构造方法&…

k8s的策略

集群调度&#xff1a; Scheduler的调度算法&#xff1a; 预算策略 过滤出合适的节点 优先策略 选择部署的节点 NodeName&#xff1a;硬策略&#xff0c;不走调度策略&#xff0c;node1 nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走一个调度算法 只要是…

系统性学习vue-vue核心

做了三年前端,但很多系统性的知识没有学习 还是从头系统学习一遍吧 课程是b站的Vue2.0Vue3.0课程 后续还会学习的如下,就重新开一篇了,不然太长,之后放链接 vue组件化编程 vue-cli 脚手架 vue中的ajax vue-router vuex element-ui vue3 老师推荐的vscode针对vue的插件: Vue 3…

机器学习~从入门到精通(二)线性回归算法和多元线性回归

为什么要做数据归一化 一、数据归一化&#xff1a; 1.最值归一化 2.均值方差归一化import numpy as npX np.random.randint(1,100,size100) X X.reshape(-1,2) X.shape X np.array(X,dtypefloat) X[:,0] (X[:,0]-np.min(X[:,0]))/(np.max(X[:,0])-np.min(X[:,0])) X[:,1]…

Postgres 中文周报:Postgres Weekly 537 期

本周报由 Cloudberry Database 社区编译自英文版《Postgres Weekly》&#xff0c;译文较原文有所调整。 推荐博文 &#x1f3c6; PostgreSQL: The DBMS of the Year 2023 PostgreSQL 荣获 DB-Engines 网站 2023 年度 DBMS 冠军。DB-Engines 收集了 480 款数据库系统信息并跟踪…

机器学习笔记 - 基于OpenCV+稀疏光流的无监督运动检测

一、简述 在各种高级开源库的帮助下&#xff0c;检测固定摄像机拍摄的运动行为是轻而易举可以实现的&#xff0c;但检测移动的摄像机拍摄的移动物体的运动检测依然是一个复杂的问题。在这里&#xff0c;我们将继续基于稀疏光流&#xff0c;并检测移动的无人机相机的运动。 这里…

设计模式-传输对象模式

设计模式专栏 模式介绍模式特点应用场景传输对象模式和序列化的区别代码示例Java实现传输对象模式Python实现传输对象模式 传输对象模式在spring中的应用 模式介绍 传输对象模式&#xff08;Transfer Object Pattern&#xff09;是一种设计模式&#xff0c;用于从客户端向服务…

MT8766安卓核心板/开发板_MTK联发科4G安卓手机主板方案定制开发

MT8766采用台积电 12 nm FinFET 制程工艺&#xff0c;4*A53架构&#xff0c;Android 9.0操作系统&#xff0c;搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力&#xff0c;专为具有全球蜂窝连接的高移动性和功能强大的平板设备而设计…