C语言(字符数组和字符指针)

news2024/12/12 18:16:30

字符串实现

在C语言中,表示一个字符串有以下两种形式:

  1. 用字符数组存放一个字符串。
  2. 用字符指针指向一个字符串。

案例

 #include <stdio.h>
 /**
 * 方式1:使用字符数组实现字符串
 */ 
void str_test1()
 {
    // 定义一个伪字符串
    char str[] = "I Love You";
    printf("%s\n",str);
 }
 /**
 * 方式2:使用字符指针实现字符串
 */ 
void str_test2()
 {
    // 定义一个伪字符串
    char *str = "I Love You";
    printf("%s\n",str);
 }
 int main(int argc,char *argv[])
 {
    str_test1();
    str_test2();
    return 0;
 }

注意:字符数组和字符指针变量都能实现字符串的存储与运算。(字符指针—> 字符类型的指针变量)

字符数组和字符指针的联系

字符数组由元素组成,每个元素中存放一个字符,而字符指针变量中存放的是地址,也能作为函数参数。
只能对字符数组中的各个元素赋值,而不能用赋值语句对整个字符数组赋值。

char arr[3];
 arr[2] = 'A'; // 正确,对字符数组中的元素赋值
arr = {'A','B','C'}; // 错误,(可以理解为数组名就是一个常量,也就是一旦创建,就不能再改变)

字符数组名虽然代表地址,但数组名的值不能改变,因为数组名是常量。
对于字符串中字符的存取,可以用下标法,也可以用指针。

 #include <stdio.h>
 int main(int argc,char *argv[])
 {
    // 使用两种方式定义字符串
    char str1[] = "你好,张欣!";
    char *str2  = "你好,张欣!";// 我们将数据类型为char的指针变量称之为字符指针
    
    // 测试赋值
    // str1 = "你好,张鹏!"; // 不能对字符数组整体赋值,如果要赋值,请使用string库下strcpy();
    str2 = "你好,张鹏!";
    
    // 打印输出
    printf("%s,%s\n",str1,str2);
    
    char a[] = "I Love You!";
    char *b  = "I Love You!";
    
    // 使用下标法和指针法来访问字符串
    printf("%c,%c,%c,%c\n",a[2],*(a+2),b[2],*(b+2));
    return 0;
 }

字符串作为形式参数

实参与形参都可以是字符数组

 void fun(char str[],int len){..}
 void main(){
    char str[] = "hello";
    fun(str,sizeof(str) / sizeof(str[0]));
 };

实参用字符数组,形参用字符指针

 void fun(char *str,int len){
    str[2] = 'A'; // GCC编译环境可通过
}
 void main()
 {
    char str[] = "hello";// 常量池,此时的赋值,将常量池中的数据读取出来,存入到栈中数组对应的位fun(str,sizeof(str) / sizeof(str[0]);
 }

实参和形参都是指针变量(在函数内部不能对字符串中的字符做修改)

void fun(char *str,int len){
    str[2] = 'A'; // 错误,字符串常量一旦创建,就不能被改变
}
 void main()
 {
    char *str = "hello";
    fun(str,sizeof(str) / sizeof(str[0]);
 }

实参是指针类型,形参是字符数组(在函数内部不能对字符串中的字符做修改)

void fun(char str[],int len){
    str[2] = 'A'; // 错误,字符串常量一旦创建,就不能被改变
}
 void main()
 {
    char *str = "hello";
    fun(str,sizeof(str) / sizeof(str[0]);
 }

注意:

  1. 字符数组在创建的时候,会在内存中开辟内存空间,内存空间可以存放字符数据;字符指针在
    创建的时候,需要依赖于字符数组,字符指针在内存开辟的内存空间中,存放的是数组元素的
    地址。字符指针的创建依赖于字符数组,字符数组可以独立存在,而字符指针不能独立存在。
  2. 字符数组可以初始化,但是不能赋值;字符指针可以初始化,也可以赋值。

案例

 #include <stdio.h>
 /**
 * 定义一个函数,实现字符串的拷贝,返回字符串长度
 * @param source 拷贝的源字符串
 * @param target 需要保存拷贝数据的目标字符串
 * @return 字符串的大小
 */ 
int str_copy(char *source,char *target)
 {
    // 定义一个循环变量
    int i = 0;
    while(source[i]!='\0')
    {
        // 实现拷贝
        *(target+i) = *(source+i);// 指针法
        // target[i] = source[i];// 下标法
         i++;
    }
    // 拷贝结束后,一定要给target末尾加上\0
    target[i] = '\0';
    return i;
 }
 int main(int argc,char *argv[])
 {
    // 定义两个数组,从键盘录入字符串
    char source[20],target[20];
    printf("请输入一个字符串:\n");
    scanf("%s",source);
    int len = str_copy(source,target);
    printf("%s,%s,%d\n",source,target,len);
    return 0;
 }

案例

#include <stdio.h>
 /**
 * 定义一个函数,实现字符串的截取
 * @param source 源字符串
 * @param start 开始截取的位置
 * @param end   截取结束的位置
 * @param target 截取后的字符串
 * @return 新字符串长度
 */ 
int str_split(char *source,int start,int end,char *target)
 {
    // 定义循环变量
    int i = 0, k = 0;
     // 遍历源字符串(数组)
    while(source[i] != '\0')
    {
        // 根据位置截取
        if(i >= start && i < end)
        {
            // 将截取的字符串存入target  "helloworld"
            target[k] = source[i];
            k++;
        }
        i++;
    }
    // 新字符串需要末尾添加\0
    target[k] = '\0';
    return k;
 }
 int main(int argc,char *argv[])
 {
    char *str = "abcdefg";
    char target[100];
    int len = str_split(str,2,5,target);
    printf("%s,%s,%d\n",str,target,len);
    return 0;
 }

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

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

相关文章

Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播

技术背景 好多开发者&#xff0c;希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务&#xff0c;然后低延迟播放出来。简单来说&#xff0c;在Unity 中实现采集 Camera 场景并推送RTMP的话&#xff0c;先是获取 Camera 场景数据&#xff0c;通过创建 RenderTex…

指令周期流程图

例题一 例题二 例题三

使用C#通过ColorMatrix对象为图像重新着色

此示例产生了一些令人印象深刻的结果&#xff0c;但实际上非常简单。 它使用其他几个示例演示的 ImageAttribute 技术来快速操作图像的颜色。 下面的AdjustColor方法启动图像着色的过程。 // Adjust the images colors. private Image AdjustColor(Image image) {// Make the …

SQL 在线格式化 - 加菲工具

SQL 在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql&#xff0c;点击上方的格式化按钮即可 输入框得到格式化后的sql结果

AI作图效率高,亲测ToDesk、顺网云、青椒云多款云电脑AIGC实践创作

一、引言 随着人工智能生成内容&#xff08;AIGC&#xff09;的兴起&#xff0c;越来越多的创作者开始探索高效的文字处理和AI绘图方式&#xff0c;而云电脑也正成为AIGC创作中的重要工具。相比于传统的本地硬件&#xff0c;云电脑在AIGC场景中展现出了显著的优势&#xff0c;…

【密码学】SM4算法

一、 SM4算法简介 SM4算法是中国国家密码管理局于2012发布的一种分组密码算法&#xff0c;其官方名称为SMS4&#xff08;SMS4.0&#xff09;&#xff0c;相关标准为GM/T 0002-2012《SM4分组密码算法》。SM4算法的分组长度和密钥长度均为128比特,采用非平衡Feistel结构。采用32…

Proteus(8.15)仿真下载安装过程(附详细安装过程图)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Proteus是什么&#xff1f; 二、下载链接 三、下安装步骤 1.解压&#xff0c;有键管理员运行 2.点击Next&#xff0c;进行下一步 3.勾选I accept…&#…

【工业机器视觉】基于深度学习的水表盘读数识别(4-训练与预测)

【工业机器视觉】基于深度学习的仪表盘识读(读数识别)&#xff08;3&#xff09;-CSDN博客 训练与预测 Ultralytics YOLO指的是由Ultralytics公司开发的一系列基于YOLO&#xff08;You Only Look Once&#xff09;架构的目标检测算法。YOLO是一种实时目标检测系统&#xff0c;它…

AlphaPose、yolov8Pose、RTMPose进行对比

一、Alphapose 参考&#xff1a; https://blog.csdn.net/m0_45850873/article/details/123939849

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID&#xff0c;它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能&#xff0c;还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID&#xff1f; 在 MongoDB …

ARM学习(36)静态扫描规则学习以及工具使用

笔者来学习了解一下静态扫描以及其规则,并且亲身是实践一下对arm 架构的代码进行扫描。 1、静态扫描认识 静态扫描:对代码源文件按照一定的规则进行扫描,来发现一些潜在的问题或者风险,因为不涉及代码运行,所以其一般只是发现一些规范或则一些质量问题,当然这些可能存在潜…

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级

从 Zuul 迁移到 Spring Cloud Gateway&#xff1a;一步步实现服务网关的升级 迁移前的准备工作迁移步骤详解第一步&#xff1a;查看源码第二步&#xff1a;启动类迁移第三步&#xff1a;引入 Gateway 依赖第四步 编写bootstrap.yaml第五步&#xff1a;替换路由配置第六步&#…

centos部署SkyWalking并在springcloud项目中用法举例

文章目录 场景SkyWalking介绍部署部署Storage [单机版Elasticsearch]部署SkyWalking OAP [下载地址](https://skywalking.apache.org/downloads/#SkyWalkingAPM)部署SkyWalking Java Agent springCloud 使用举例 场景 SkyWalking是应用性能监控平台&#xff0c;可用于分布式系统…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆&#xff0c;用以运送各种汽油、柴油、原油等油品&#xff0c;运输危险系数大&#xff0c;而且由于油罐车需要经常行驶在城区道路&#xff0c;为城市各个加油站点、企业工厂运输补充所需油料&#xff0c;因此也是危化品运输车辆的重点监测和管控对象…

【总结·反思·汇报·思考02】裸辞后,我的一些感想和感悟。

Hello&#xff0c;大家好&#xff01; 首先&#xff0c;我需要向大家道个歉&#xff0c;对不起&#xff01;因为最近发生了一些事情&#xff0c;博客文章一直没有更新。&#xff08;90度鞠躬道歉&#xff09; 那么&#xff0c;最近到底发生了什么呢&#xff1f;相信大家已经从…

李宏毅机器学习-局部最小值与鞍点

一、Optimization Fails because …… 1&#xff0e; 问题 在optimization时&#xff0c;training的loss不会再下降&#xff0c;但是我们对loss并不满意。不管我们怎么更新参数&#xff0c;loss都不会掉下来。 2&#xff0e; 原因&#xff1a;critical point&#xff08;gra…

day10性能测试(2)——Jmeter安装环境+线程组+Jmeter参数化

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、LoadRunner vs Jmeter 1.1 LoadRunner 1.2 Jmeter 1.3 对比小结 2、Jmeter 环境安装 2.1 安装jdk 2.2 安装Jmeter 2.3 小结 3、Jmeter 文件目录结构 4、Jmeter默认配置修改 5、Jmeter元件、组…

STM32软件IIC驱动TCA9548A多路测量AHT10

STM32软件IIC驱动TCA9548多路测量AHT10 TCA9548AAHT10代码逻辑代码展示现象总结 TCA9548A TCA9548A 有八个可通过 I2C 总线控制的双向转换开关&#xff0c;SCL/SDA 上行对扩展到八个下行对&#xff0c;或者通道&#xff0c;适用于系统中存在I2C目标地址冲突的情况。8路双向转换…

鸿蒙调试打包(非正式打包)

文章目录 前言第一步&#xff1a;生成.p12和.csr文件第二步&#xff1a;申请证书的前置步骤第三步&#xff1a;申请证书 前言 HarmonyOS 应用打包后的文件为.app 格式&#xff0c; android 打包后的文件为.apk&#xff0c;IOS 打包后的文件为.apa HarmonyOS通过数字证书&#…

手机租赁系统开发全流程解析与实用指南

内容概要 在如今快速发展的科技时代&#xff0c;手机租赁系统已经成为一种新兴的商业模式&#xff0c;非常符合当下市场需求。那么&#xff0c;在开发这样一个系统的时候&#xff0c;首先要从需求分析和市场调研开始。在这一阶段&#xff0c;你需要了解用户需要什么&#xff0…