初始C语言-数组&字符数组与字符串

C 语言探秘:字符数组 vs. 字符串,那一抹神秘的 \0 本文深入探讨了C语言中字符数组与字符串的区别,重点在于字符串末尾的空字符\0。字符数组是纯字符的集合,而C语言字符串则是以\0结尾的特殊字符数组。\0标志着字符串的结束,对于标准库函数处理字符串至关重要。文章通过代码示例展示了\0在字符串处理中的作用,并提供了确保字符序列成为有效C语言字符串的建议,如使用字符串字面量初始化或手动添加\0。正确理解和使用\0是掌握C语言字符串处理的关键。 阅读详情


数组

数组用来存放多份数据,但是它有两个要求:
1.这些数据的类型必须相同;
2.这些数据在内存中必须连续存储。
如果没有数组,存储多份数据就需要多个变量名,管理和使用起来都非常麻烦;而有了数组,只需要一个变量名就能搞定。

来看个简单的例子:

int nums[4]; //定义了一个存储4个整数的数组
float temp[100]; //定义一个可以存储 100 个浮点数的数组
char name[20];   //定义一个可以存储 20 个字符的数组

数组的初始化
上面的代码是定义数组,我们也可以在定义数组的同时赋值,这叫做初始化。
例如:

int nums[5] = {10, 20, 30, 40, 50};
//数组元素的值由{ }包围,各个值之间以,分隔。

值的类型要和数组的类型匹配,当然如果匹配不上,会自动转换类匹配。
数组的内存分布:
数组在内存中一定是连续存放的
比如:
在这里插入图片描述
sizeof()运算符
sizeof()是一种编译时运算符提供了存储操作数的类型的对象所需的存储空间量(以字节为单位).
sizeof 数组名 得到的结果是整个数组的长度(单位为字节)

如果想要计算数组单个元素的长度,就使用 sizeof 数组名[下标] 的方式

如果想要得到数组元素的个数,只需要将上面两种计算公式结合起来.
即 sizeof(array) / sizeof(array[0])

字符数组与字符串

字符数组是专门用来存储字符数据的数组,其每个元素存放一个字符,定义形式与一般数组类似,但元素类型为char

char names[] = {'s','a','n'};

字符串
在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。
比如上面的字符数组就可以用字符串来表示

char* name = "san";  //默认都是\0结尾
char name[] = "san" //默认都是\0结尾

但两种有本质的不同:

char* name = "zhangsan"这里 name 是一个指向字符串常量的指针。字符串常量通常存储在只读内存区域(如数据段或文本段),修改它会导致未定义行为。

对于第二种其实里面有许多细节值得我们研究

char name[] = "zhangsan"; 这里 name 是一个字符数组,数组元素存储在栈上(或静态存储区,取决于作用域)并且这种其实是发生了字符拷贝

具体如下:

char arr[] = "san";
// 实际上相当于:
char arr[4];  // 1. 在栈上分配4字节
arr[0] = 's'; // 2. 逐个字符拷贝
arr[1] = 'a';  
arr[2] = 'n'; 
arr[3] = '\0';

char names[] = {'s','a','n'};但是对于这种情况,数组name里面就只有三个字符,没有多的 \0,明面上存的什么就是什么,不会有多的 \0 ;

并且对于arr来说本质上是一个数组,但在大多数表达式中会退化为指针 !

#include <stdio.h>
int main()
{
    char arr[] = "san";
    // 情况1:仍然是数组(不退化为指针)
    printf("sizeof(arr) = %u\n", sizeof(arr));  // 输出:4(数组大小)
    printf("&arr = %p\n", &arr);                 // 取整个数组的地址
    printf("&arr + 1 = %p\n", &arr + 1);         // 跳过整个数组
    
    // 情况2:退化为指针(大多数情况)
    printf("arr = %p\n", arr);                   // 退化为 char*(首元素地址)
    printf("arr + 1 = %p\n", arr + 1);           // 指向第二个元素
    printf("*arr = %c\n", *arr);                 // 可以解引用
    printf("arr[1] = %c\n", arr[1]);             // 数组下标访问
    printf("%s\n", arr);     传递给函数时也退化为指针
    return 0;
}

区分表:
在这里插入图片描述

总结: arr 本质上是数组(char[4] 类型),但在使用时通常退化为指针,这不是"转化为指针",而是C语言规定的隐式转换规则

记住:数组名不是指针,但可以像指针一样使用(因为编译器会自动转换)!


还有一种情况特别说明:

char str5[5] = "hello";

在这里插入图片描述

内存分布如图:
在这里插入图片描述

指针

指针的概念:

&a 就是a的地址(编号) , 实质上也可以理解为他是一个 指向 a数据的存放的内存区域地址编号。

我们可以定义一个指针,把这个地址赋值给它,那么我们定义指针的值那个地址编号。指向的就是那个变量的值的资质。一个地址编号是恒定的由系统确定,不会应该数据类型不一样而改变。

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int a = 1;
    //&a//a变量所对应数据的地址
   int  *ap = &a;  //申明指针并初始化

   float f = 1;
   float  *fp = &f; //申明指针并初始化
 
   double d;
   double * dp; //申明指针没有初始化
   dp = &d ; //初始化

    return 0;
}

两种特殊指针

野指针

概念: 指向一块未知内存的指针, 被称为野指针。

int * p ;

  • 危害:引用野指针的时候,很大概率我们会访问到一个非法内存,通常会出现段错

误(Segmentation fault (core dumped))并导致程序崩溃。

更加严重的后果,如果访问的时系统关键的数据,则有可能造成系统崩溃

  • 产生原因:

    定义时没有对他进行初始化

    指向的内存被释放,系统已经回收, 后该指针并没有重新初始化

指针越界

  • 如何防止:

定义时记得对他进行初始化

绝对不去访问被回收的内存地址, 当我们释放之后应该重新初始化该指针。确认所申请的内存的大小,谨防越界

空指针:

在很多的情况下我们一开始还不确定一个指针需要指向哪里,因此可以让该指针先指向

一个不会破坏系统关键数据的位置, 而这个位置一般就是NULL (空)。因此指向该地址

的指针都称之为空指针

华为BEM战略解码体系完整版(85页PPT)(文末有下载方式) 在部门层面,战略解码的核心是将公司战略逐层分解到部门,确保部门目标能够有效支撑公司战略。战略解码的关键原则包括:对公司战略和业务目标的支撑、指标选取考虑部门责任特色、对公司业务流程的支撑、战略解码,华为公司实现了从战略制定到执行的闭环管理,确保了战略目标能够通过可衡量的。战略解码,华为公司实现了从战略制定到执行的闭环管理,确保了战略目标能够通过可衡量的。战略解码体系的核心目标是将公司战略逐层分解,确保战略目标能够通过可衡量的。在公司层面,战略解码的第一步是战略澄清,明确公司的使命、愿景、战略目标及。 阅读详情

相关推荐

嵌入式八股文-ARM

嵌入式八股文总结(ARM篇)-优快云博客现象:I2C死锁就是时钟线SCL一直处于高电平,数据线SDA一直处于低电平。从机拉低数据线SDA时(发送应答信号给主机时或发送数据0时)主机意外复位,主机复位后时钟线SCL就为高电平了,此时,SCL为高电平而SDA为低电平,主机就以为有其他设备占有了总线,而SCL为高电平时 数据位SDA不允许有变化,意思是:主机就一直等待时钟线SDA拉高,而从机就一直等待时钟线SCL拉高 就造成了死锁的现象。解决方法:1.选择带有复位功能的从设备,复位后SDA被拉高。

m0_63127436的博客 1259

C语言 字符数组 和 字符串 详解

C语言 字符数组 和 字符串 详解 用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值 char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r'...

weixin_45691686的博客 7878

保姆级教程:用Simulink从零搭建新能源汽车VCU蠕行控制模型(附模型下载)

本文提供了一份详细的Simulink建模教程,指导读者从零开始搭建新能源汽车VCU蠕行控制模型。内容涵盖环境配置、信号定义、蠕行模式使能条件、扭矩控制算法实现及模型验证等关键步骤,特别适合需要将控制算法转化为可执行模型的初学者。教程还包含实用代码示例和常见问题解决方案,帮助开发者快速掌握VCU蠕行控制的Simulink实现技巧。

546

【C语言】字符串、字符数组、字符指针

目录 一、字符数组 (1)字符数组的定义 (2)字符数组的初始化 二、字符串 (1)字符串的概念 (2)用字符串初始化字符字符数组 (3)获取字符串的长度 三、字符串与指针 四、字符数组与字符指针 一、字符数组 字符数组是存放字符数据的数组,每个元素都是单个字符。 (1)字符数组的定义 char 数组名[数组长度];//一维字符数组 char 数组名[常量表达式1][常量表达式2];//二维字符数组 (2)字符数组的初始化 在数组定义的同时对数组中的元素进行赋值,这个过程

Jacky_Feng的博客 5656

mac(apple silicon)arm64安装spm12详细教程

3.下载matlab runtime R2023b for macOS (macA64),注意必须下载这个,只下载matlab是不可以的。默认安装目录是/Applications/MATLAB/MATLAB_Runtime/R2023b。注意最后的命令,路径根据自己的matlab_runtime安装位置进行调整,然后就可以安装成功了。5. 解压spm12.zip,解压后将文件夹拖到应用程序下(Applications)2.下载spm12,这个版本可兼容mac芯片!6.打开mac终端,输入。

weixin_62332001的博客 2020

稳定性性能系列之十五——系统稳定性监控体系建设:从指标到预警的完整方案

深入探讨Android系统稳定性监控体系的设计与实现,涵盖指标体系设计、数据采集方案、异常检测算法、预警响应机制,并提供完整的监控平台搭建实践。

Cheson的专栏 1357

c语言 字符串数组 初始化,C 字符串数组初始化问题

1、定义的时候直接用字符串赋值char a[10]="hello";注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!2、对数组中字符逐个赋值char a[10]={'h','e','l','l','o'};3、利用strcpychar a[10]; strcpy(a, "hello");易错情况:1、char a[10]; a[10]="hello"...

weixin_39790717的博客 8982

串口调试神器诞生记:我是如何用Cursor+AI自动生成C#上位机的(含VSCode插件清单)

本文详细介绍了如何利用Cursor和AI技术快速开发C#上位机程序,实现高效的串口通讯调试。从开发环境搭建到代码自动生成,再到性能优化和功能增强,全面展示了AI辅助开发在串口调试中的实际应用和显著效率提升。

weixin_28340315的博客 299

C语言 字符数组

C语言 字符数组

qq_48516121的博客 1万+

CTF——流量分析题型整理总结

我见过的流量分析类型的题目总结: 一,ping 报文信息 (icmp协议) 二,上传/下载文件(蓝牙obex,http,难:文件的分段上传/下载) 三,sql注入攻击 四,访问特定的加密解密网站(md5,base64) 五,后台扫描+弱密码爆破+菜刀 六,usb流量分析 七,WiFi无线密码破解 八,根据一组流量包了解黑客的具体行为 例题: 一,ping 报文信息 (icm...

小锤队长的博客 5万+

贝塞尔曲线在机器人路径平滑中的实战应用与优化

本文深入探讨了贝塞尔曲线算法在机器人路径平滑中的核心应用。通过对比G1CBS与G2CBS两种方法,详细阐述了如何实现从切线连续到曲率连续的平滑优化,以满足不同机器人对运动平稳性和效率的需求,并提供了完整的Python代码实现与关键参数调优指南。

weixin_29051811的博客 307

C语言字符串与字符数组

C语言字符串与字符数组 1. 字符串与字符数组 1.1 C 语言字符串 什么是字符串? 通俗的讲字符串是由一串字符组成,例如 “Hello World\n”,即是一个字符串。 C 语言中没有真正意义上的字符串类型,字符串由字符数组或者字符串常量来表示。 什么是字符串常量? const char *p = "Hello World\n"; 上述示例中 "Hello World\n"即是一个字符串常量,该常量由一个字符类型指针保存其实际地址。该字符串常量一般存储于 静态存储区。C 语言字符串常

annjeff的博客 2714

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2501

c语言怎么把字符串转数组,【转】C语言 字符数组与字符串

在C语言编程中,当我们声明一个字符串数组的时候,常常需要把它初始化为空串。总结起来有以下三种方式:(1) char str[10]=”“;(2) char str[10]={”};(3) char str[10]; str[0]=”;第(1)(2)种方式是将str数组的所有元素都初始化为”,而第(3)种方式是只将str数组的第一个元素初始化为”。如果数组的size非常大,那么前两种方式将会造成很大...

weixin_30914901的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C语言笔记之多维数组,字符数组

C语言笔记

pkhlll的博客 2214

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【C/C++】字符数组和string字符串:从C语言到C++的演变

定义字符数组时,必须指定数组的大小或通过初始化让编译器推断大小。//直接在程序内储存数据// 手动定义长度:定义一个长度为100的字符数组,并用str1来储存"hello world"这个c语言风格的字符串//自动适应长度:不直接填写字符数组的具体大小,直接通过c语言风格字符串来初始化str2//通过标准输入流存储数据//需要指定字符数组的大小//直接写 char str5[];会导致编译错误,因为编译器不知道数组需要多大//err。

2301_80361697的博客 1543

第六章 C语言数组_C语言字符数组和字符串详解

用来存放字符的数组称为字符数组,例如: 字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。 C语言规定,可以将字符串直接赋值给字符数组,例如: 数组第 0 个元素为'c',第 1 个元素为'.',第 2 个元素为'b',后面的元素以此类推。 为了方便,你也可以不指定数组长度,从而写作: 注意:这里需要留意一个坑,字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就.

qq_43205256的博客 3731

c语言---字符数组与字符串的使用详解

本篇文章是对c语言中字符数组与字符串的使用进行了详细的分析介绍,需要的朋友参考下 1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个单个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'}; //用单个字符列表 初始化字符数组 即把10个字符分别赋给str[0]到str[9]10个元素 如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这...

weixin_37991107的博客 1772

C语言字符数组与字符串

在C语言中,字符数组和字符串是处理文本数据的基本方式。字符数组是由字符组成的数组,而字符串是以空字符('\0')结尾的字符数组。以下是关于C语言字符数组和字符串的详细介绍:

科技改变人类,技术成就未来 795

【C】C语言数组与字符串(包括:字符串与字符数组)

在程序设计中,为了方便处理,通常把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据结构。一个数组可以分解成多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按照数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 本文主要介绍一维数组、二维数组和字符数组,其余的数组将会在以后的文章中介绍到...

Yngz_Miao的博客 1万+

【C语言】案例五十二 字符串替换(一)【字符,字符串,字符数组】

案例描述 字符串替换是处理字符串时最常见的操作之一,也是学习字符串必须掌握的知识。本案例要求通过编程实现字符串“Good moring”到“Good evening”的转换。 案例分析 我们需要从字符串中被替换的位置开始,将要替换的内容逐个复制到原字符串中,直到字符串结束或者替换的字符串结束为止。 为了顺利完成案例,需要先学习字符数组,字符串,字符指针等基础知识。 必备知识 1,字符数组 字符数组是存放字符数据的数组,其中每一个元素都是单个字符 (1)字符数组的定义 字符数组定义的语法格式如下: char

yusihe的博客 2656

结构体中字符数组赋值字符串问题

今天在看结构体变量时发现一个问题: 问题代码如下 int main() {     struct student{         char c[20];     }s1;     s1.c="china";     printf("%s",s1.c);     return 0; } 输出结果为空,不知道是为什么? 经过网上的答案尽是如此: C语言只有在定义字符数

爪爪大叔的博客 2万+

掘根宝典之C语言字符,字符串常量,字符串数组,字符指针,字符指针与字符串数组的区别

在C语言中,字符数组和字符串数组的区别在于如何使用和表示数据。字符数组:字符数组是一个存储字符的固定长度的数组。它可以存储单个字符或一串字符,但没有自动添加字符串结束符'\0'。字符数组可以用来存储和处理任意字节的数据,不仅仅限于存储字符串。例如,可以定义一个字符数组来存储用户的输入,或者用于存储二进制数据。// 定义一个长度为10的字符数组字符串数组:字符串数组是一个数组,其中每个元素都是一个字符串。字符串是以字符数组的形式呈现,但以'\0'(空字符)作为结束符,表示字符串的结束。

2301_80224556的博客 1665

C语言字符数组和字符串

用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值 char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' }; //对全体元素赋值时可以省去长度 字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没

languan1639397的博客 945

c语言字 字符串转换成数组_c++ c语言 数组与字符串

c语法7 - 数组与字符串概述定义:把具有相同类型的若干变量按有序形式组织起来称为数组。C语言数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。一维数组数组的概念和定义我们知道,要想把数据放入内存,必须先要分配内存空间。放入4个整数,就得分配4个int类...

weixin_39529128的博客 3036

字符数组、字符串

本文系统介绍了C语言中字符数组和字符串的概念、定义、初始化及操作方法。

C2913530048的博客 1532

C 语言字符数组的定义与初始化

1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素 如果花括号中提供的字符个数大于数组长度,则按语法错误处理; 若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定

即使没有翅膀,心也要飞翔! 906
上一篇: c语法基础-顺序结构&选择结构&循环结构
下一篇: C语言数组:零长数组,可变数组,多维数组
kklovecode
博客等级 码龄4年 127粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kklovecode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值