当前位置: 首页 > news >正文

C语言——字符串指针和字符串数组

目录

前言

一、定义区别

1、数组表示

2、指针表示

二、内存管理区别

1.字符数组

2.字符指针

三、操作区别

1、访问与修改

 2、遍历

 3......

总结


 


前言

        在C语言中,字符串随处可见,字符串是由字符组成的一串数据,字符串以null字符('\0')结尾,表示字符串的结束。字符串可以通过字符数组或指针来表示和操作。使用指针可以更灵活地处理字符串,因为指针可以指向字符串的起始位置,并通过指针运算来访问字符串中的字符。虽然指针和数组都可以用来表示和操作字符串,但它们在内存管理和使用方式上有一些关键的区别,下面就来简单的理一下吧。


一、定义区别

1、数组表示

        字符串数组是在编译时确定大小的一个字符数组。例如:

char str[10] = "Hello";

 这里str是一个包含10个字符的数组,其中前5个字符是'H''e''l''l''o',剩下的字符自动初始化为'\0'(字符串结束符)。

2、指针表示

        字符串指针是通过字符指针来指向一个字符串常量(只读,不能修改)或动态分配的字符数组。例如:

char *ptr = "Hello";char *Str = (char *)malloc(50 * sizeof(char));  // 动态分配内存  
if (Str != NULL) 
{  strcpy(Str, "Hello");                       // 复制字符串到动态内存  
}

 这里ptr是一个指向字符的指针,它指向一个字符串常量"Hello"注意,字符串常量通常存储在只读的数据段中。

二、内存管理区别

1.字符数组

        如果是局部变量:字符串的内存是在栈上分配的;

        如果是全局变量或静态变量:字符串的内存是在数据段上分配的;

但无论是局部变量还是全局变量(静态变量),数组的大小在编译时就已经确定了,而且在数组的生命周期内大小固定,不可以改变。

2.字符指针

        当字符指针指向一个字符串常量时,内存是由编译器管理的,不能修改这个字符串的内容(只读,存储在只读区)尝试修改会导致段错误,通常使程序崩溃。如果指针指向的是通过malloc、calloc或realloc动态分配的内存,此时可以修改这块内存的内容,并且需要在适当的时候释放它。

三、操作区别

        由于数组的大小是固定的,不能改变数组大小(即不能通过数组重新分配内存来存储更长的字符串),但是,可以修改数组中的字符,只要不超过数组的边界。

        而指针提供了更大的灵活性,可以让它指向不同的字符串(通过改变指针的值)。如果指针指向的是动态分配的内存,可以根据需要调整内存的大小。但不能修改指针指向的字符串内容

1、访问与修改

        可以通过数组索引来访问和修改数组字符串中的字符。

str[0] = 'h';  // 修改第一个字符为小写'h'  
char ch = str[7];  // 获取第八个字符,即将其赋给ch变量

         指针指向字符串常量,则不能修改其内容。如果指向动态分配的内存,则可以修改。

ptr[0] = 'h';    // 该操作是错误的,因为ptr指向的是只读内存if (Str != NULL)
{  Str[0] = 'h';  // 修改动态字符串的第一个字符为小写'h'  
}

 2、遍历

        可以使用循环来遍历数组字符串中的每个字符。

for (int i = 0; str[i] != '\0'; i++) 
{  printf("%c", str[i]);  
}

         可以使用指针来遍历字符串。

while (*ptr != '\0') 
{  printf("%c", *ptr);  ptr++;  
}  if (Str != NULL) 
{  char *temp = Str;  while (*temp != '\0') {  printf("%c", *temp);  temp++;  }  
}

 3......


总结

1、当使用指针指向字符串常量时,不要尝试修改这个字符串的内容,因为字符串字面量通常存储在只读内存段中。

2、当使用动态内存分配时,确保在使用完毕后释放内存,以避免内存泄漏。

3、在修改指针指向的字符串之前,始终检查指针是否为NULL,以避免空指针解引用错误。

4、字符串数组的大小在编译时就确定了,因此不能改变数组大小。如果需要动态大小的字符串,应使用指针和动态内存分配。

相关文章:

C语言——字符串指针和字符串数组

目录 前言 一、定义区别 1、数组表示 2、指针表示 二、内存管理区别 1.字符数组 2.字符指针 三、操作区别 1、访问与修改 2、遍历 3...... 总结 前言 在C语言中,字符串随处可见,字符串是由字符组成的一串数据,字符串以null字符(\0)结尾&#…...

7-1回文判断(栈和队列PTA)

回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。编写一个程序,使用栈判定给定的字符序列是否为回文。 若用C,可借助STL的容器实现。 输入格式: 输入待判断的字符序列,按回车…...

使用 NCC 和 PKG 打包 Node.js 项目为可执行文件(Linux ,macOS,Windows)

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 文章引言 步骤 1:…...

LeetCode:2747. 统计没有收到请求的服务器数目(滑动窗口 Java)

目录 2747. 统计没有收到请求的服务器数目 题目描述: 实现代码与解析: 滑动窗口 原理思路: 2747. 统计没有收到请求的服务器数目 题目描述: 给你一个整数 n ,表示服务器的总数目,再给你一个下标从 0 开…...

项目管理工具--【项目策划任务书】模板

项目策划任务书是项目管理中的重要文件,它详细描述了项目的各个方面,以确保项目能够顺利进行。撰写项目策划任务书时需要考虑以下几个关键要素: 基本信息:包括项目名称、负责人、所在单位、联系方式以及日期等基本信息&#xff0c…...

雷池社区版那么火,为什么站长都使用雷池社区版??

雷池社区版是长亭科技开发的一款免费开源的 Web 应用防火墙(WAF),具有诸多优势,因此值得使用。 防护效果强大。能够检测并防御各种网络攻击,包括 SQL 注入、跨站脚本(XSS)、跨站请求伪造&#x…...

分布式日志有哪些?

分布式日志系统(Distributed Logging Systems)是在分布式计算环境中用来收集、存储和管理来自多个节点的日志数据的系统。这些系统通常设计用于处理高并发、大规模的日志数据流,并提供强大的查询和分析功能。 一、定义与背景 分布式系统通常…...

ETCD未授权访问风险基于角色认证和启用https的ca证书修复方案

ETCD未授权访问风险安全漏洞修复方案 ETCD未授权访问风险介绍基于角色认证的访问控制(BASIC认证)基于ca证书的https访问控制(TLS传输)下载cfssl认证配置工具生成ca认证证书修改etcd配置方式一方式二 访问etcd节点信息 patroni使用…...

执行Django项目的数据库迁移命令时报错:(1050, “Table ‘django_session‘ already exists“);如何破?

一、问题描述: 当我们写Django时,由于自己的操作不当,导致执行数据库迁移命令时报错,报错的种类有很多,例如: 迁移文件冲突:可能你有多个迁移文件试图创建同一个表。数据库状态与迁移文件不同…...

问丫:创新社交平台的技术魅力与发展潜力

最近偶然间发现了一个很特别的社交网站,叫问丫。一开始我也只是抱着随便看看的心态去了解一下,没想到这个网站还蛮有意思的。 这个网站是由 LLMWorld 推出的,据说是一款跨时空跨次元的社交新产品。这个描述给网站蒙上了一层魔幻的纱布&#…...

iOS Swift逆向——被编译优化后的函数参数调用约定修复

头文件导入: typedef long long s64; typedef unsigned long long u64;typedef s64 Int; typedef u64 Bool;struct Swift::String {u64 _countAndFlagsBits;void *_object; };union Swift_ElementAny {Swift::String stringElement; };struct Swift_Any {Swift_Ele…...

self-supervised learning(BERT和GPT)

1芝麻街与NLP模型 我們接下來要講的主題呢叫做Self-Supervised Learning,在講self-supervised learning之前呢,就不能不介紹一下芝麻街,為什麼呢因為不知道為什麼self-supervised learning的模型都是以芝麻街的人物命名。 因為Bert是一個非常…...

基于RBF神经网络的双参数自适应光储VSG构网逆变器MATLAB仿真模型

“电气仔推送”获得资料(专享优惠) 模型简介 此模型源侧部分采用光伏发电系统与混合储能系统(蓄电池超级电容),并网逆变器采用虚拟同步发电机(VSG)控制,为系统提供惯量阻尼支撑。同…...

Openpyxl--学习记录

1.工作表的基本操作 1.1 工作表的新建打开与保存 1.1.1 创建工作簿 from openpyxl import Workbook from pathlib import Pathfile_path Path.home() / "Desktop" / "123.xlsx"# 1.创建工作簿 wb Workbook() # 2.访问默认工作簿 ws wb.active # 3.填充…...

高边坡稳定安全监测预警系统解决方案

一、项目背景 高边坡的滑坡和崩塌是一种常见的自然地质灾害,一但发生而没有提前预告将给人民的生命财产和社会危害产生严重影响。对高边坡可能产生的灾害提前预警、必将有利于决策者采取应对措施、减少和降低灾害造成的损失。现有的高边坡监测技术有人工巡查和利用测…...

计算机毕业设计 | vue+springboot借书管理 图书馆管理系统(附源码)

1,项目背景 1.1 课题背景 随着现在科学技术的进步,人类社会正逐渐走向信息化,图书馆拥有丰富的文献信息资源,是社会系统的重要组成部分,在信息社会中作用越来越重要,在我国图书馆计算机等 信息技术的应用…...

vue3 腾讯地图 InfoWindow 弹框

1、vue项目index.html引入地图js 2、页面使用 <script setup lang"ts"> import { useMapStore } from //store;defineOptions({ name: PageMap }); const emits defineEmits([update:area, update:address, update:latitude, update:longitude]); const prop…...

【Linux】解锁进程间通信奥秘,高效资源共享的实战技巧

管道、共享内存、消息队列、信号量 1. 进程间通信1.1. 目的1.2. 概念和本质1.3. 分类 2. 管道2.1 概念2.2. 4种情况2.3. 4种特性2.4. 匿名管道2.4.1. 原理2.4.2. 概念2.4.3. 创建 — pipe()2.4.4. 应用场景 — 进程池 2.5. 命名管道2.5.1. 概念和原理2.5.2. 创建 — mkfifo()2.…...

O1 Nano:OpenAI O1模型系列的简化开源版本

概览 O1 Nano 是一个开源项目&#xff0c;它实现了 OpenAI O1 模型系列的简化版本。O1 模型是一个高级语言模型&#xff0c;它在训练和推理过程中整合了链式思维和强化学习。这个实现版本&#xff0c;称为 O1-nano&#xff0c;专注于解决算术问题&#xff0c;以展示模型的能力。…...

浅谈人工智能之Llama3微调后使用cmmlu评估

浅谈人工智能之Llama3微调后使用cmmlu评估 引言 随着自然语言处理&#xff08;NLP&#xff09;技术的发展&#xff0c;各类语言模型如雨后春笋般涌现。其中&#xff0c;Llama3作为一个创新的深度学习模型&#xff0c;已经在多个NLP任务中展示了其强大的能力。然而&#xff0c…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...