C语言中字符串和指针

目录

字符串的概念

字符串的存储形式: 数组、文字常量区、堆区

 字符串的可修改性

初始化

字符串和指针总结:


从0开始记录我的学习历程,我会尽我所能,写出最最大白话的文章,希望能够帮到你,谢谢。


提示:文章作者为初学者,有问题请评论指正,感谢。

字符串的概念

字符串就像是一串珍珠项链。在C语言中,这串珍珠是一系列的字符(比如字母、数字、标点符号等),它们连在一起,形成了一个完整的信息单元。就像珍珠项链一样,每颗珍珠都是项链的一部分,每个字符也都是字符串的一部分。

在C语言中,字符串是以空字符 '\0' 结尾的字符数组。这个空字符告诉计算机字符串在哪里结束,就像项链的扣子一样,标志着项链的结束。所以,即使我们看到的是一串字符,计算机在处理字符串时,实际上是在查找这个结束的标志。

举个例子,如果我们有一个字符串 "hello",在内存中,它会被存储为 ['h', 'e', 'l', 'l', 'o', '\0']。这个 \0 是不可见的,但它对于C语言来说非常重要,因为它标记了字符串的结束。

字符串的地址,是第一个字符的地址。如:字符串“hello ”的地址,其实是字符串中字符’h’的地址。 我们可以定义一个字符指针变量保存字符串的地址, 比如:char *s =”hello ;

字符串的存储形式: 数组、文字常量区、堆区

  1. 数组: 当你声明一个字符数组并初始化它,如 char string[100] = "I love C!";,这个字符串实际上是存储在内存的栈区(如果是局部变量)或静态全局区(如果是全局变量或静态变量)中。这个数组会包含字符串的每个字符,以及一个额外的空字符 '\0' 来标识字符串的结束。

    char string[100] = "I love C!";
    

    在这个例子中,string 是一个数组,它占用了100个字符的空间,但实际上 "I love C!" 只使用了10个位置(包括空字符)。

  2. 文字常量区: 当你使用字符串字面量初始化一个指针变量时,如 char *str = "I love C!";,这个字符串实际上是存储在程序的文字常量区中的。这个区域是只读的,你不能修改其中的内容。str 是一个指针,它存储了字符串第一个字符 I 的地址。

    char *str = "I love C!";
    

    这里,"I love C!" 存储在文字常量区,而 str 只是一个指向该区域的指针。

  3. 堆区: 你可以使用 malloc 或 calloc 等函数在堆区动态地分配内存来存储字符串。这种方式允许你在运行时确定字符串的大小,并且需要你在使用完毕后手动释放内存。

    char *str = (char*)malloc(10);
    strcpy(str, "I love C");
    

    在这个例子中,malloc 函数分配了10个字节的内存,并将地址赋给了 str 指针。然后使用 strcpy 函数将 "I love C" 复制到分配的内存中。注意,这里分配的内存大小应该包括空字符 '\0'

 字符串的可修改性

在C语言中,字符串的可修改性确实取决于它们存放的位置。这里有三种情况:

  1. 存放在数组中: 如果字符串存储在一个数组中,如 char str[100] = "I love C!";,那么这个字符串是可修改的。因为数组分配在栈区或静态全局区,你可以自由地修改数组中的任何元素,包括字符串的字符。

    char str[100] = "I love C!";
    str[0] = 'y'; // 正确,可以修改
    

    这里,str[0] = 'y'; 将字符串的第一个字符从 'I' 改为 'y'

  2. 存放在文字常量区: 如果字符串是通过指针指向一个字符串字面量,如 char *str = "I love C!";,那么这个字符串存储在文字常量区,是不可修改的。尝试修改会导致未定义行为,通常是程序崩溃。

    char *str = "I love C!";
    *str = 'y'; // 错误,不可修改
    

    这里,*str = 'y'; 尝试修改文字常量区的内容,这是不允许的。

  3. 存放在堆区: 如果字符串是通过 malloc 动态分配在堆区,如 char *str = (char*)malloc(10);,那么这个字符串是可修改的。因为你拥有这块内存的所有权,可以自由地修改它。

    char *str = (char*)malloc(10);
    strcpy(str, "I love C");
    *str = 'y'; // 正确,可以修改
    

    这里,*str = 'y'; 将动态分配的字符串的第一个字符从 'I' 改为 'y'

初始化

字符数组初始化: 就像你有一个空盒子,你可以一开始就决定放什么东西进去。比如:

char buf_aver[20] = "hello world";

这里,buf_aver 是盒子,"hello world" 是你放进盒子的东西。

指针指向文字常量区,初始化: 就像你有一个标签,上面写着 "hello world" 的地址。你不能改变地址上的内容,但你可以改变标签上的地址。

char *buf_point = "hello world";

这里,buf_point 是标签,它指向的 "hello world" 是不可改变的内容。

指针指向堆区,堆区存放字符串: 就像你租了一个储物柜,然后把你的东西放进去。你可以随时改变储物柜里的东西。

char *buf_heap = (char *)malloc(15);
strcpy(buf_heap, "hello world");

这里,buf_heap 是储物柜的钥匙,"hello world" 是你放进储物柜的东西。

使用时赋值

  1. 字符数组: 你可以用 strcpy 或 scanf 来改变盒子里的东西,但不能直接给盒子贴上新的标签。

    char buf[20]=”hello world”
    buf="hello kitty";        错误, 因为字符数组的名字是个常量,不能用等号给常量赋值。
    strcpy(buf,"hello kitty");正确,数组中的内容是可以修改的 
    scanf("%s",buf);          正确,数组中的内容是可以修改的
  2. 指针指向文字常量区: 你可以改变标签上的地址,但不能改变地址上的内容。

    char *buf_point = “hello world”;
    buf_point="hello kitty";  正确,buf_point 指向另一个字符串
    strcpy(buf_point,"hello kitty"); 错误,这种情况,buf_point 指向的是文字常量区,
    内容只读。 当指针指向文字常量区的时候,不能通过指针修改文字常量区的内容。
  3. 指针指向堆区: 你可以改变储物柜里的东西,也可以换一个储物柜。

    char *buf_heap = (char *)malloc(15);
    strcpy(buf_heap, "hello world"); // 正确
    scanf("%s", buf_heap); // 正确

字符串和指针总结:

1 、指针可以指向文字常量区

  1. 1.指针指向的文字常量区的内容不可以修改
  2. 2.指针的指向可以改变,即可以给指针变量重新赋值,指针变量指向别的地方。

2 、指针可以指向堆区

1.指针指向的堆区的内容可以修改。

2.指针的指向可以改变,即可以给指针变量重新赋值,指针变量指向别的地方。

3 、指针也可以指向数组(非 const 修饰) 

例:char buf[20]="hello world"; char *str=buf;

这种情况下

1.可以修改 buf 数组的内容。

2.可以通过 str 修改 str 指向的内存的内容,即数组 buf 的内容

 3.不能给 buf 赋值 buf=hello kitty ”;错误的。

4.可以给 str 赋值,及 str 指向别处。 str=hello kitty 

总结

以上就是今天要讲的内容,本文仅仅简单介绍了C语言中字符串和指针,祝愿你我的朋友在学习的路上一帆风顺,也祝愿我会成为一个优秀的嵌入式工程师。

  • 13
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值