C语言中数组与指针的区别

一.  简介

本文学习了 C语言中数组与指针的区别。这样的话,可以在编写C代码时规避掉出错的问题。

二.  C语言中数组与指针的区别

 1.  数组

定义字符串数组时,必须让编译器知道需要多少空间。

一种方法是用足够空间的数组存储字符串。例如如下:

char buf[40] = "hello world!";

或者 如下:

char buf[40] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\0'};

注意,最后的空字符。没有 '\0'就不是一个字符串,而是一个字符数组。

通常,让编译器确定数组的大小很方便。回忆一下,省略数组初始化声明中的大小,编译器会自动计算数组的大小,如下所示:

char buf[] = "hello world!";

让编译器计算数组的大小只能用在初始化数组时,如果创建一个稍后再填充的数组,就必须在声明时指定大小。

2. 指针

可以用指针表示法创建字符串。例如如下:

char *ptr = "hello world!";

3.  以上数组与指针有什么区别?

数组

数组形式在计算机的内存中分配为一个内含 13(还包括 '\0')个元素的数组,每个元素被初始化为字符串常量对应的字符。

通常字符串都作为可执行文件的一部分存储在数据段中,当把程序载入内存时,也载入了程序中的字符串。字符串存储在静态存储区中,但是,程序在开始运行过时才会为该数组分配内存。此时,才将字符串拷贝到数组中,注意,此时字符串有两个副本,一个是静态内存中的字符串常量,另一个是存储在 buf数组中的字符串。

这里关键要理解,在数组形式中,数组 buf是地址常量。不能更改 buf,如果改变了  buf,则意味着改变了数组的存储位置(即地址)。

可以进行类似 buf+1 这样的操作,标识数组的下一个元素。但是,不允许进行 ++buf这样的操作,递增运算符只能用于变量名前,不能用于常量。

指针

指针形式 (*ptr) 也使得编译器为字符串在静态存储区预留了 13个元素的空间,另外,一旦开始执行程序,它会为 指针变量 ptr 留下一个存储位置,并把字符串的地址村存在指针变量中,该变量最初指向该字符串的首地址。

但是它的值可以改变。因此,可以使用递增运算符,例如:

++ptr  //指向第2个字符

总之,初始化字符数组把静态存储区的字符串拷贝到数组中,而初始化指针只把字符串的地址拷贝给指针。

数组与指针使用上的区别

初始化字符数组来存储字符串和初始化指针来指向字符串有何区别?

(指向字符串:指向字符串的首字符)

例如,有如下声明:

char buf[] = "come on, TangSan!";
char* ptr = "come on, Xiao Wu!";

两者的主要区别是:数组名 buf是常量,而指针名 ptr是变量。那么实际使用有什么区别?

首先,两者都可以使用数组表示法:

for(i=0; i< 10; i++)printf("%c", buf[i]);for(i=0; i< 10; i++)printf("%c", ptr[i]);

其次,两者都能进行指针加法操作:

for(i=0; i< 10; i++)printf("%c", *(buf+i));for(i=0; i< 10; i++)printf("%c", *(ptr+i));

但是,只有指针标识法可以进行递增操作:

for(i=0; i< 10; i++)printf("%c", *(ptr++));

而对于指针 ptr,是否可以进行如下操作:

ptr[1] = '1';

《C primer Plus》书籍说,编译可能允许这样做,但是对当前的 C标准而言,这样的行为还未定义的。例如,这样的语句可能导致内存访问错误。原因是编译可以使用内存中的一个副本来表示所有完全相同的字符串常量。

但是,我这边在 ubuntu系统上经过测试是不行的,会报段错误。

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

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

相关文章

DOM重点核心(注册事件+DOM事件流)

目录 1.注册事件 注册时间概述 addEventListener() 删除事件 2.DOM事件流 DOM事件流理论 事件对象 事件对象的常见属性和方法 e.targe 和 this的区别 阻止默认行为 阻止冒泡 事件委托 禁止右键菜单和禁止选中文字 获得鼠标的坐标&#xff08;可视区、页面、浏览器…

js原生弹框多选框

js原生弹框多选框 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>JavaS…

golang适配国产数据库

随着国产化的推进&#xff0c;越来越多的企业选择国产数据库替代mysql或者Oracle。 本篇主要介绍golang如何适配国产数据库 主流的国产数据库有达梦&#xff0c;金仓&#xff0c;神通&#xff0c;优炫&#xff0c;南大通用数据库等 前提环境 unixODBC安装 yum -y install un…

【深度学习实战(36)】模型转换之onnx模型转地平线J3 二进制bin模型

一、PTQ量化流程 &#xff08;1&#xff09; 核查onnx模型 &#xff08;2&#xff09;准备和生成模型校准数据集 &#xff08;3&#xff09;PTQ量化 &#xff08;4&#xff09;量化模型推理 二、具体流程 &#xff08;1&#xff09;使用01_check_onnx.sh脚本&#xff0c;对o…

Spring6 源码分析-ioc

&#xff08;1&#xff09;IDEA开发工具&#xff1a;2022.1.2 &#xff08;2&#xff09;JDK&#xff1a;Java17&#xff08;Spring6要求JDK最低版本是Java17&#xff09; &#xff08;3&#xff09;Spring&#xff1a;6.0.2 <dependencies><!--spring context依赖…

【教程】Linux/Jetson 安装X11VNC同步屏幕内容

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 目录 背景说明 实际效果 安装步骤 安装 x11vnc 配置 x11vnc 配置 x11vnc 作为系统服务 使用 VNC 客户端连接 背景说明 通常vnc-server是单…

分享一个非常好用的安装包下载网站

当我们需要下载linux下的某些包,以便在自己的环境下进行编译自己的安装包的时候,可能需要用到一些各种版本的依赖包,从网上 百度会很麻烦。 这里分享一个很好用的安装包下载网站,记得点赞收藏 网站: Red Hat Enterprise Linux Repositories - pkgs.org 找到对应系统,然…

深入理解K8S【安全认证机制kubectlconfig】

深入理解K8S【安全认证机制】 1 核心概念 1.1 安全体系 对于大型系统来说&#xff0c;对业务的权限、网络的安全认证是必不可少的。 对于linux系统来说&#xff0c;用户和组、文件权限、SELinux、防火墙、pam、sudo等&#xff0c;究其核心的目的都是为了保证系统是安全的。 …

golang 中在for循环体内使用select case <-time.After定时器问题

在go语言的代码中&#xff0c;我们经常会看到在在for循环体内使用select case <-time.After 的类似语句&#xff0c; 其实这个地方不管你是用 time.After(2 * time.Second) 还是 time.NewTicker(2 * time.Second) 的方式&#xff0c;如果放到for循环体内select case 则这个c…

【element-plus】自动导入 + typescript 提示 + 自定义主题色

1、自动导入 2、引用加载组件类型提示 第一步&#xff1a;安装自动导入功能所需的插件 npm install -D unplugin-vue-components unplugin-auto-import 第二步&#xff1a; vite版&#xff1a; // vite.config.ts import { defineConfig } from vite import AutoImport fr…

四天学会JS高阶(学好vue的关键)——作用域解构箭头函数(理论+实战)(第一天)

一、作用域 提到作用域&#xff08;作用域又分为局部作用域和全局作用域&#xff09;&#xff0c;就要想到变量。因为作用域规定了变量能够被访问的范围&#xff08;也就是作用域是为变量而服务的&#xff09;&#xff0c;为了避免全局变量污染这一情况&#xff0c;所以需要使…

如何排查域名网站无法访问了页面报500错误

本周有一个客户&#xff0c;购买Hostease的虚拟主机&#xff0c;询问我们的在线客服&#xff0c;域名网站无法访问了报500错误页面&#xff0c;怎么办&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff…

bugfix:遇见“隐形字符”:ⅰ与i的编码迷局

前言 在软件开发的世界里&#xff0c;遇到各种奇奇怪怪的bug是在所难免的。今天&#xff0c;我就遭遇了一个看似简单实则棘手的问题——用户反馈账号无法登录&#xff0c;系统一直提示“账号不存在”。一番抽丝剥茧后&#xff0c;我发现问题竟然出在一个不起眼的字符上&#x…

Go微服务: Gin框架搭建网关, 接入熔断器,链路追踪以及服务端接入限流和链路追踪

概述 本文使用最简单和快速的方式基于Gin框架搭建一个微服务的网关调用微服务的场景网关作为客户端基于RPC调用某一服务端的服务并接入熔断和限流以及链路追踪具体场景&#xff1a;通过网关API查询购物车里的数据在最后&#xff0c;会贴上网关和购物车服务的代码仓库 服务端搭…

避雷:搭建AI知识库注意事项

AI知识库作为信息存储和进行智能处理的核心部分&#xff0c;受到越来越多企业的重视。为了更好地发展&#xff0c;企业也纷纷开始搭建AI知识库。然而&#xff0c;在搭建AI知识库的过程中&#xff0c;也有很多雷区容易踩到&#xff0c;导致项目延迟、效果不佳甚至失败。所以&…

《控制系统实验与综合设计》计控第三次(含程序和题目)

实验七 采样控制系统的分析 一、实验完成任务 1、熟悉用 LF398 组成的采样控制系统&#xff1b; 2、通过本实验理解采样定理和零阶保持器的原理及其实现方法&#xff1b; 3、观察系统在阶跃作用下的稳态误差。 4.、研究开环增益 K 和采样周期 T 的变化对系统动态性能的影响…

Linux基础之进程-进程状态

目录 一、进程状态 1.1 什么是进程状态 1.2 运行状态 1.2 阻塞状态 1.3 挂起状态 二、Linux操作系统上具体的进程状态 2.1 状态 2.2 R 和 S 状态的查看 2.3 后台进程和前台进程 2.4 休眠状态和深度休眠状态 一、进程状态 1.1 什么是进程状态 首先我们知道我们的操作系…

分布式光伏监控系统功能模块详解

目前&#xff0c;分布式光伏发电系统的总容量比较小&#xff0c;并且光伏电站的功率受外界环境影响容易出现大起大落的现象。这使电压调整变得很困难。光伏电站运行维护人员不足&#xff0c;长时间不保养维护会影响光伏电站的发电效率。针对上述问题&#xff0c;鹧鸪云基于无线…

天锐绿盾|设计院图纸透明加密软件、制造业文件资料防止外泄

#图纸加密软件# 天锐绿盾是一家专注于数据安全解决方案的提供商&#xff0c;其产品主要为企业级用户设计&#xff0c;旨在保护敏感信息和知识产权免遭未经授权的访问或泄露。"天锐绿盾"的图纸透明加密软件和机械制造业文件资料防止外泄系统&#xff0c;是专为设计院…

JS中的宏任务和微任务

JavaScript 引擎是建立在一个事件循环系统之上的&#xff0c;它实时监控事件队列&#xff0c;如果有事件就执行&#xff0c;如果没有事件就等待。事件系统是一个典型的生产消费模式&#xff0c;生产者发出事件&#xff0c;接收者监听事件&#xff0c;在UI 开发中是常见的一个设…