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.hqwc.cn/news/701275.html

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

相关文章

【Vue】更换vue-element-admin左侧 logo

准备&#xff1a;目标svg格式的 logo&#xff0c;并将目标logo命名为 vuejs-fill.svg替换路径&#xff1a;/icons 文件夹下&#xff0c;覆盖掉原本的 vuejs-fill.svg 原因&#xff1a;配置项的logo设置的是 vuejs-fill

Linux中如何配置虚拟机网络(NAT方法)

首先我们要在Linux中找到配置文件的路径/etc/sysconfig/network-scripts/&#xff0c;然后找到配置文件的名称ifcfg-xxx&#xff08;如&#xff1a;ifcfg-ens33&#xff09;&#xff0c;然后打开这个文件内 容如下&#xff1a; TYPEEthernet # 指定网卡类型是以太网 BOOTPROT…

【ARM Cortex-M 系列 2.3 -- Cortex-M7 Debug event 详细介绍】

请阅读【嵌入式开发学习必备专栏】 文章目录 Cortex-M7 Debug eventDebug events Cortex-M7 Debug event 在ARM Cortex-M7架构中&#xff0c;调试事件&#xff08;Debug Event&#xff09;是由于调试原因而触发的事件。一个调试事件会导致以下几种情况之一发生&#xff1a; 进…

高级DBA手把手教你达梦8国产数据库级联更新语句用MergeInto合并代替方法(达梦官方手册无此内容)

高级DBA手把手教你达梦8国产数据库级联更新语句用MergeInto合并代替方法&#xff08;达梦官方手册无此内容&#xff09; 一、传统级联更新语句例子 举例&#xff1a; 表 1&#xff1a;T1 字段名类型A时间类型B字符类型C字符类型D字符类型E字符类型 表 2&#xff1a;T2 字…

Web开发三层架构

##Controller Service Dao(mapper) 软件设计&#xff1a;高内聚 低耦合 Controller 调用Service&#xff0c; Service调用 DAO 模块之间耦合 如果要从EmpServiceA切换到EmpServiceB&#xff0c;Controller代码也要修改 new EmpServiceB 分层接耦 容器中放EmpServiceA&am…

Transformer+Classification学习笔记

论文名称&#xff1a;An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale [2112.11010] MPViT: Multi-Path Vision Transformer for Dense Prediction (arxiv.org) 参考博客与视频&#xff1a; Vision Transformer 超详细解读 (原理分析代码解读) …

H5 云商城 file.php 文件上传致RCE漏洞复现

0x01 产品简介 H5 云商城是一个基于 H5 技术的电子商务平台,旨在为用户提供方便快捷的在线购物体验。多平台适配:H5 云商城采用 H5 技术开发,具有良好的跨平台适配性。无论是在电脑、手机还是平板等设备上,用户都可以通过网页浏览器访问和使用云商城,无需安装额外的应用程…

WMS仓储管理系统如何让仓库管理有过程

在当今竞争激烈的商业环境中&#xff0c;WMS仓储管理系统的智能化与过程化管理显得尤为重要。一个具有过程管理的WMS仓储管理系统不仅能够帮助企业实时监控、分析和调度仓库作业&#xff0c;还能显著提升作业效率和成本控制能力。下面&#xff0c;我们就来深入探讨一下这种“有…

2024-05-10 Ubuntu上面使用libyuv,用于转换、缩放、旋转和其他操作YUV图像数据,测试实例使用I420ToRGB24

一、简介&#xff1a;libyuv 最初是由Google开发的&#xff0c;主要是为了支持WebRTC项目中的视频处理需求。用于处理YUV格式图像数据的开源库。它提供了一系列的函数&#xff0c;用于转换、缩放、旋转和其他操作YUV图像数据。 二、执行下面的命令下载和安装libyuv。 git clo…

windows 使用 workerman

简单示例 workerman从3.5.3版本开始已经能够同时支持linux系统和windows系统。 1、需要PHP>5.4&#xff0c;并配置好PHP的环境变量。 2、Windows版本的Workerman不依赖任何扩展。 3、安装使用以及使用限制这里。 4、由于Workerman在Windows下有诸多使用限制&#xff0c…

前端崽的java study笔记

文章目录 basic1、sprint boot概述2、sprint boot入门3、yml 配置信息书写和获取 持续更新ing~ basic 1、sprint boot概述 sprint boot特性&#xff1a; 起步依赖&#xff08;maven坐标&#xff09;&#xff1a;解决配置繁琐的问题&#xff0c;只需要引入sprint boot起步依赖的…

能否直接上手 Qt ?——看完 C++ 课本后怎么做?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Qt的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;如果你已经阅读了 C 课本&#xff0c;但仍然感到…