字符数组和字符指针

为什么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.xdnf.cn/news/18715.html

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

相关文章

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…

jedis基础入门

jedis采用key&#xff0c;value的形式保存数据&#xff0c;使用nosql sql和nosql的区别 一&#xff1a;入门案例 导入依赖 <dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>…

QWen2.5学习

配置环境 pip install transformers 记得更新一下&#xff1a;typing_extensions pip install --upgrade typing_extensions 安装modelscope modelscope/modelscope: ModelScope: bring the notion of Model-as-a-Service to life. 下载这个仓库的代码上传到服务器解压 推…

足球青训俱乐部管理后台系统(程序+数据库+报告)

基于SpringBoot的足球青训俱乐部管理后台系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块 编程语言&#xff1a;Java 数据库&#xff1a;MySQL 项目管理工具&#xff1a;Maven 前端技术&#xff1a;Vue 后端技术&#xff1a;SpringBoot…

MoneyPrinterTurbo - AI自动生成高清短视频

MoneyPrinterTurbo是一款基于AI大模型的开源软件&#xff0c;旨在通过一键操作帮助用户自动生成高清短视频。只需提供一个视频 主题或 **关键词** &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然后合成一个高清的短视频。 ​ ​ 主要…

Cross-Inlining Binary Function Similarity Detection

注&#xff1a;在阅读该论文时顺便参考了作者团队的分享视频&#xff1a;【ICSE 2024论文预讲会-第二期-下午-哔哩哔哩】 https://b23.tv/XUVAPy3 在这个视频的末尾最后一个 一.introducion 计算下面两个函数的相似度&#xff1a; 查询函数&#xff1a;脆弱函数&#xff0c;重…

C++:哈希拓展-位图

目录 一.问题导入 二.什么是位图? 2.1如何确定目标数在哪个比特位? 2.2如何存放高低位 2.3位图模拟代码实现 2.3.1如何标记一个数 2.3.2如何重置标记 2.3.3如何检查一个数是否被标记 整体代码实现 标准库的Bitset 库中的bitset的缺陷 简单应用 一.问题导入 这道…

GCP : Memcache backed by Cloud Datastore

Memcache backed by Cloud Datastore 的用途主要体现在以下几个方面&#xff1a; 提高性能和可扩展性&#xff1a; Memcache 是一个高性能的分布式内存对象缓存系统&#xff0c;通常用于缓存数据库查询等操作&#xff0c;以减轻数据库负载&#xff0c;加快动态Web应用的响应速度…

【Python】问题解决:yaml文件加载得到字符串而不是字典

问题描述 最近需要使用python处理yaml文件&#xff0c;但使用过程中发现只能输出字符串的格式&#xff0c;而不是想要的字典格式。 基本使用 在python中想要读写yaml文件&#xff0c;可以安装使用第三方包pyyaml来实现&#xff0c;首先安装一下&#xff1a; pip install pyya…

时钟之Canvas+JS版

写在前面 上一篇介绍使用CSSJS方式实现&#xff0c;但元素太过单一。此篇将以HTML5的canvas标签结合JS来实现。 HTML代码 <canvas id"clock" width"300" height"300"></canvas> JS代码 var canvas null; var ctx null; var int…

shell脚本_创建执行与变量的定义与使用

PS:前言本章节讲解使用的系统为linux2024.1&#xff0c;基于Debian的Linux发行版。 一、什么是shell脚本&#xff1f; 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. Shebang 二、创建执行 1.脚本的创建 2. 脚本的执行 2.1.chmod 2.2. 使用…

CSP/信奥赛C++语法基础刷题训练(11):洛谷P5743:猴子吃桃

CSP/信奥赛C语法基础刷题训练&#xff08;11&#xff09;&#xff1a;洛谷P5743&#xff1a;猴子吃桃 题目描述 一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半&#xff0c;又贪嘴多吃了一个&#xff1b;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n n n…

C++11(四)---可变参数模板

文章目录 可变参数模板 可变参数模板 参数包代表多个类型和参数 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Args> void ShowList(Args... arg…

【qt】控件1

1.控件使能&#xff08;enabled&#xff09; QPushbutton*stnew QPushbutton(this);//定义一个按钮 st->setEnabled(false);//按钮设置不能使用当设置该控件不能使用的话&#xff0c;对应控件的子控件也不能使用 通过isEnabled()函数可以查看对应控件状态 演示&#xff1…

昇思MindSpore第二课---Transformer

1. Transformer的概念 Transformer是一种基于注意力机制结构的神经网络&#xff0c;其主要的作用就是用于处理机器翻译、语言建模以及文本生成等自然语言的处理。 比如人类在做一篇阅读理解的时候&#xff0c;我们的注意力可能主要集中在我们所阅读的这一行内容。而机器也是如此…

【Go】-bufio库解读

目录 Reader和Writer接口 bufio.Reader/Writer 小结 其他函数-Peek、fill Reader小结 Writer Scanner结构体 缓冲区对于网络数据读写的重要性 Reader和Writer接口 在net/http包生成的Conn 接口的实例中有两个方法叫做Read和Write接口 type Conn interface {Read(b []b…

mac 0S中虚拟机分辨率高怎么办

在VMware Fusion安装的Windows虚拟机有时候会遇到下图的问题&#xff0c;分辨率很高、桌面和任务栏的图标都很小&#xff0c;没办法正常使用。 解决方法&#xff1a; 点击工具栏中的扳手图标&#xff0c;打开设置。 打开系统设置中的“显示器”。 取消勾选“使用Retina全分辨率…

找不到d3dx9_43.dll怎么解决,d3dx9_43.dll缺失的七种解决方法

​在计算机游戏领域&#xff0c;遇到“找不到d3dx9_43.dll”错误信息是一个相当普遍的现象。这一问题不仅影响玩家的游戏体验&#xff0c;还可能导致游戏无法启动或运行不稳定。本文旨在深入解析这一问题的原因&#xff0c;并提供有效的解决方法&#xff0c;帮助广大游戏玩家轻…

论文《基于现实迷宫地形的电脑鼠设计》深度分析(四)——现实迷宫算法

论文概述 《基于现实迷宫地形的电脑鼠设计 》是由吴润强、庹忠曜、刘文杰、项璟晨、孙科学等人于2023年发表的一篇优秀期刊论文。其针对现阶段电脑鼠计算量庞大且不适用于现实迷宫地形的问题&#xff0c;特基于超声波测距与传统迷宫算法原理&#xff0c;设计出一款可在现实…

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…