字符数组和字符指针

为什么C程序里面不能对字符数组进行重新赋值而可以在控制台进行输入赋值?

在C语言中,字符数组(char array)和字符指针(char pointer)是两种不同的数据类型,它们在内存中的存储方式和使用方式有所不同,这导致了它们在赋值操作时的行为也不同。

  1. 字符数组(char array)

    • 字符数组是一个固定大小的内存块,用于存储字符序列,包括一个结束符 \0
    • 字符数组的大小在编译时确定,一旦声明,其大小不能改变。
    • 你不能直接对整个字符数组进行重新赋值,因为这样做需要改变数组的大小,这在C语言中是不允许的。
    • 但是,你可以逐个字符地修改数组中的值,直到达到数组的末尾。

    示例:

    char arr[5] = "Kimi";
    // arr = "Moonshot"; // 错误:不能对整个数组重新赋值
    arr[0] = 'M'; // 正确:可以修改单个字符
    
  2. 字符指针(char pointer)

    • 字符指针是一个变量,它存储了指向字符的内存地址。
    • 字符指针可以指向不同的内存位置,因此可以指向不同的字符串。
    • 你可以改变指针的值,使其指向新的字符串,因为这只是改变了指针的地址值,而不是改变原有的字符串。

    示例:

    char *ptr = "Kimi";
    ptr = "Moonshot"; // 正确:可以改变指针指向的字符串
    

在控制台进行输入赋值时,实际上是在逐个字符地填充字符数组或字符串,直到遇到换行符或达到数组的大小限制。这个过程是合法的,因为你只是在填充已经分配好的内存空间,而不是尝试改变数组的大小。

总结来说,字符数组的大小是固定的,不能在运行时重新赋值,而字符指针可以改变其指向的字符串,因为它们只是改变了指针的值。这就是为什么在程序中不能对字符数组进行重新赋值,但可以在控制台进行输入赋值的原因。

字符指针为什么不可以在控制台输入字符串给其赋值?

实际上,字符指针本身是不能直接存储字符串的,它只能存储一个地址。在C语言中,字符串通常是由字符数组或者指向字符数组的指针来表示的。当你说“字符指针”时,可能是指的指向字符的指针,但为了存储字符串,你需要一个字符数组或者一个指向字符数组的指针。

在控制台输入字符串并赋值给一个字符指针,你需要先有一个足够大的字符数组来存储输入的字符串,然后你可以让字符指针指向这个数组。这里是一个例子:

#include <stdio.h>int main() {char str[100]; // 分配一个足够大的字符数组来存储输入的字符串char *ptr;     // 声明一个字符指针printf("Enter a string: ");fgets(str, sizeof(str), stdin); // 使用fgets从控制台读取字符串到str数组ptr = str; // 让ptr指向str数组的首地址// 现在ptr指向了str数组,你可以使用ptr来操作字符串printf("You entered: %s\n", ptr);return 0;
}

在这个例子中,fgets 函数用于从标准输入(控制台)读取字符串,并存储在 str 数组中。然后,我们让 ptr 指向 str 数组的首地址,这样 ptr 就可以用来操作字符串了。

如果你尝试直接使用 scanfgets函数来给字符指针赋值,这是不安全的,因为这些函数不会检查目标缓冲区的大小,可能会导致缓冲区溢出。gets 函数甚至已经在C11标准中被移除,因为它是不安全的。正确的做法是使用 fgets 或其他安全的函数,这些函数允许你指定缓冲区的大小,以避免溢出。

总结来说,字符指针本身不能直接存储字符串,你需要一个字符数组或者一个指向字符数组的指针来存储字符串。在控制台输入字符串并赋值给字符指针是可能的,但你需要先有一个字符数组来存储输入的字符串,然后让指针指向这个数组。

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

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

相关文章

【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍

文章目录 前言一、Zachman架构二、ToGAF架构三、FEA架构四、DoDAF 前言 企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;是指企业在信息技术和业务流程方面的整体设计和规划。 最近接触到“企业架构”这个概念&#xff0c;转念一想必定和我们软件架构…

迷宫题解 题目ID:8015

题目描述 时间限制&#xff1a; 1s 空间限制&#xff1a;32M 题目描述&#xff1a; 给定一个N∗M 方格的迷宫&#xff0c;每个方格最多经过一次&#xff0c;且迷宫里有 T 处障碍&#xff0c;障碍处不可通过。 在迷宫中有上下左右四种移动方式&#xff0c;每次只能移动一个方…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…

Python中常用的内置函数介绍

1、生成器&#xff08;Generator&#xff09;&#xff1a; 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受到内存限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#x…

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型

本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统&#xff0c;旨在通过技能匹配的方式对招聘信息进行分析与预测&#xff0c;帮助求职者根据自身技能找到最合适的职位&#xff0c;同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…

vulhub之fastjson

fastjson 1.2.24 反序列化 RCE 漏洞(CVE-2017-18349) 漏洞简介 什么是json json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下: {"name":"BossFrank", "age":23, "isDevel…

Scala案例:全文单词统计

2.txt内容如下 Thank you very much.Well I want to thank you all very much this is great, these are our friends, we have thousands of friends in this incredible movement.This was a movement like no nobodys ever seen before, and frankly this was I believe the…

失落的Apache JDBM(Java Database Management)

简介 Apache JDBM&#xff08;Java Database Management&#xff09;是一个轻量级的、基于 Java 的嵌入式数据库管理系统。它主要用于在 Java 应用程序中存储和管理数据。这个项目已经过时了&#xff0c;只是发表一下以示纪念&#xff0c;现在已经大多数被SQLite和Derby代替。…

【STK学习】part2-星座-目标可见性与覆盖性分析

【Satellite Tool Kit】学习并深入了解卫星/星座生成、可见性分析、覆盖性分析等知识&#xff0c;并基于STK软件实现对应数据的导出&#xff0c;以用于算法的约束输入。 文章目录 一、学习目标二、学习内容2.1 星地可见性分析2.1.1 单星单地2.1.2 单星多地2.1.3 多星单地 2.2 星…

金融数据中心容灾“大咖说” | 美创科技赋能“灾备一体化”建设

中国人民银行发布的《金融数据中心容灾建设指引》&#xff08;JR/T 0264—2024&#xff09;已于2024年7月29日正式实施。这一金融行业标准对金融数据中心容灾建设中的“组织保障、需求分析、体系规划、建设要求、运维管理”进行了规范和指导。面对不断增加的各类网络、业务、应…

k8s篇之flannel网络模型详解

在 Kubernetes (K8s) 中,Flannel 是一种常用的网络插件,用于实现容器之间的网络通信。Flannel 提供了一种覆盖网络(Overlay Network)模型,使得容器可以跨多个主机进行通信。 以下是 Flannel 在 Kubernetes 中的详细工作原理和覆盖网络模型的详解: 1.Flannel 简介 Flann…

《第十部分》1.STM32之通信接口《精讲》之IIC通信---介绍

经过近一周的USART学习&#xff0c;我深刻体会到通信对单片机的重要性。它就像人类的手脚和大脑&#xff0c;只有掌握了通信技术&#xff0c;单片机才能与外界交互&#xff0c;展现出丰富多彩的功能&#xff0c;变得更加强大和实用。 单片机最基础的“语言”是二进制。可惜&am…

Vue通过file控件上传文件到Node服务器

功能&#xff1a; 1.多文件同时上传、2.拖动上传、3.实时上传进度条、4.中断上传和删除文件、5.原生file控件的美化 搁置的功能: 上传文件夹、大文件切片上传、以及其他限制条件未处理 Node服务器的前置准备: 新建文件夹: file_upload_serve初始化npm: npm …

【AI图像生成网站Golang】图床上传与图像生成API搭建

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 五、图床上传与图像生成API搭建 在项目中&#xff0c;我们通过整合 Go 和 FastAPI 实现了图像的上传和生成功能。本…

如何使用 Docker Compose 安装 WireGuard UI

简介 wireguard是什么&#xff1f;维基百科是这样描述的&#xff1a; WireGuard是一种实现加密虚拟专用网络(VPN) 的通信协议和免费开源软件&#xff0c;其设计目标是易于使用&#xff0c;高速性能和低攻击面。它旨在比IPsec和OpenVPN这两种常见的隧道协议具有更好的性能和更…

IM项目-----客户端网络通讯流程

文章目录 前言数据中心类数据持久化网络通信类http客户端websocket客户端 前言 对即时通信系统客户端部分的网络通讯流程的总结。 数据中心类 通过model/datacenter.h 中的DataCenter 类来管理所有客⼾端需要的数据.这是⼀个单例类. 这里管理一份数据有两个作用&#xff0c;1…

软件测试—— Selenium 常用函数(一)

前一篇文章&#xff1a;软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中&#xff0c;我们介绍了自动化的一些基础知识&a…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议&#xff1a; webSocket协议&#xff1a; 1.2WebSocket协议&#xff1a; 1.3客户端&#xff08;浏览器&#xff09;实现 1.3.2 WebSocket对象的相关事宜&#xff1a; 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

【图像分割】SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers

SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers 论文链接&#xff1a;http://arxiv.org/abs/2105.15203 代码链接&#xff1a;https://github.com/NVlabs/SegFormer 一、摘要 文中提出了SegFormer&#xff0c;一个简单、高效且强大的…

HarmonyOS知识点

HarmonyOS应用模型Stage&FA 、ArkTS、ArkUI Stage模型&#xff1a; Module - UIAbility - Page - component 装饰器Entry、Component、CustomDialog、State、关键字struct、函数build() 系统组件&#xff08;Text Column Row Scroll&#xff09;、自定义组件 、组件复用、…