再学C语言44:字符串表示和字符串I/O(2)

文章介绍了C语言中字符串数组的使用,包括字符串数组仅存储字符串地址而非字符串本身,以及如何通过指针访问字符串。此外,还讨论了与之对比的二维字符数组的差异,后者在内存中存储完整的字符串。在指针和字符串的交互中,文章强调了指针赋值并不复制字符串,而是创建指向同一内存位置的新指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、字符串数组

使用字符串数组可以访问多个不同的字符串

示例代码:

char *string1[3] = {
    "hello world",
    "C language",
    "this is a quote"
};
// string1是一个由3个指向char的指针组成的数组
// string1是一个一维数组,且数组里的每一个元素都是一个char类型的地址
// 第一个指针是string1[0],指向第一个字符串的第一个字符 *string1[0] == 'h'
// 第二个指针是string1[1],指向第二个字符串的第一个字符 *string1[0] == 'C'
// 第三个指针是string1[2],指向第三个字符串的第一个字符 *string1[0] == 't'

上面示例中:

1)string1数组实际上并不存放字符串,只是存放字符串的地址,字符串在程序中用于存放常量的那部分内存中

2)可以把string1[0]看作表示第一个字符串,*string1[0]表示第一个字符串的第一个字符

3)由于数组符号和指针之间的关系,也可以使用string1[0][0]表示第一个字符串的第一个字符,尽管string1并没有被定义为二维数组

4)字符串数组初始化遵循数组初始化规则

与上面示例的声明方法不同,还有另一种方法,即建立二维数组:

char string2[3][80]; // string2是一个5个元素的数组
                    // 每个元素本身又是一个80个char的数组

这种情况下,字符串本身也被存储在数组里

与前面指针的形式的区别是:

1)后者建立了一个所有行的长度都相同的矩形数组;而指针数组建立的是一个不规则的数组,每一行的长度由初始化字符串决定,因此不会浪费任何存储空间

2)string1和string2的类型不同:string1是一个指向char的指针的数组,存放的是3个地址;string2是一个char数组的数组,存放的是3个完整的字符数组

二、指针和字符串

在对字符串的处理过程中不可避免地会经常用到指针,绝大多数C字符串的操作使用的都是指针

示例代码:

#include <stdio.h>

int main(void)
{
    char * msg = "don't forget your mission!";
    char * copy;

    copy = msg;

    printf("%s\n", copy); // 打印copy所指向的内容

    printf("\n");
    printf("msg = %s, &msg = %p, value = %p\n", msg, &msg, msg);
    printf("copy = %s, &copy = %p, copy = %p\n", copy, &copy, copy);

    return 0;
}

运行结果:

2c732ba42d36449c94e01495968e7d77.png

结论:

1)字符串并没有被复制,因为copy指定的指针的值与msg指定的指针的值相同,指针的值是该指针中存放的地址,二者相同

2)copy = msg的作用:并不是对字符串进行赋值,而是产生了一个指向同一个字符的第二个指针(copy)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Forster-C

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

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

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

打赏作者

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

抵扣说明:

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

余额充值