0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中的char数组和char指针有什么区别?

玩转单片机与嵌入式 来源:玩转单片机与嵌入式 2023-01-29 16:35 次阅读

让我们通过下面的例子,来了解 C语言中字符数组和字符指针之间的区别。

void test()
{
    //arr is array of characters
    char arr[12] = "Aticleworld";

    //ptr is pointer to char
    char *ptr = "Aticleworld";
}
现在,让我们比较arr(字符数组)和ptr(字符指针)。

区别1: 字符串文本是用双引号括起来的零个或多个多字节字符的序列。当你编写语句 char arr[12] = "Aticleworld"时,字符串文本中的字符被复制到 arr. 当您编写语句 char *ptr = "Aticleworld"时,您是让字符串文本数组进行数组到指针的转换,以获取指向其第一个元素的指针。指针 ptr 指向字符串文本数组的第一个元素 ('A').

6aed65a2-9a66-11ed-bfe3-dac502259ad0.png

区别2: arr 是存储在连续内存位置的字符集合,而 ptr 保存字符的地址。

arr 包含 12 个元素,每个元素位于连续的内存位置。另一方面,ptr 保存字符串文本的第一个字符的地址。

区别3:当我们在 char 数组 arr 上使用 sizeof 运算符时,它给出字符总数,而 char 指针 ptr 只给出指针的大小。如下:

#include 
int main()
{
    //arr is array of characters
    char arr[] = "Aticleworld";
    //ptr is pointer to char
    char *ptr = "Aticleworld";
    printf("Size of arr %ld
", sizeof(arr));
    // sizeof a pointer is printed which is same for all type
    // of pointers (char *, void *, etc)
    printf("Size of ptr %ld", sizeof(ptr));
    return 0;
}

输出

Size of arr 24
Size of ptr 4
区别4: 和指针之间的另一个重要区别是,我们可以增加指针,但不能创建数组的增量。例
arr++ =>非法语句。
ptr++==>正常语句。
区别5:我们可以将值重新分配给数组,但字符串文本不可修改。如果程序尝试修改由字符串文本形成的静态数组,则行为未定义。例

//arr is array of characters
char arr[] = "Aticleworld";
gets(arr); 
fgets(arr,sizeof(arr),stdin); //有效表达式
scanf("%s", arr); //有效表达式
strcpy(arr, "aticle"); //有效表达式
arr[0] = 'a'; //有效表达式
arr[10] = 'M'; //有效表达式
arr[11] = 'M'; //有效表达式

char *ptr = "Aticleworld";


ptr[0]='P';//无效表达式


*ptr='W';//无效表达式
无别6: 未初始化的指针也可能导致未定义的行为。请参阅以下示例。
char *ptr;
ptr[0] = 'A'; //未定义的行为
gets(ptr); //未定义的行为
scanf(“%s”, ptr); //未定义的行为
strcpy(ptr, “source”); //未定义的行为
strcat(ptr, “second string”); //未定义的行为
区别7: Char数组本质上是静态的,这意味着您无法调整数组的大小,而使用指针,您可以在任何时间点更改分配的内存的大小。

区别8:数组完全由程序控制。它将正确分配所需的内存,并在超出范围时自动释放内存。但是,如果分配动态内存,则char指针的情况有所不同,您必须手动取消分配它,否则会引入内存泄漏。例

void foo1()
{
    //arr是字符数组
    char arr[12] = "Aticleworld";
}




//Issue memory leak
void foo2()
{
    char *ptr = (char*)malloc(12);

//忘记释放内存
}

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136691
  • 字符
    +关注

    关注

    0

    文章

    233

    浏览量

    25199
  • 指针
    +关注

    关注

    1

    文章

    480

    浏览量

    70551
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25939
  • char
    +关注

    关注

    0

    文章

    11

    浏览量

    3720

原文标题:【软件】C语言中的char数组和char指针有什么区别?

文章出处:【微信号:玩转单片机与嵌入式,微信公众号:玩转单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言数组指针区别

    大家好,我是嵌入式老林,从事嵌入式软件开发多年,今天分享的内容是C语言数组指针区别,希望能对你有所帮助。
    发表于 07-11 12:40 375次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>数组</b>和<b class='flag-5'>指针</b>的<b class='flag-5'>区别</b>

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

    指针数组之间存在着紧密的关系。在本文中,我们将探讨指针数组的关系、指针算术和数组遍历、多维
    发表于 08-17 15:29 410次阅读

    指针数组数组指针什么区别和联系呢

    什么是指针数组数组指针指针数组数组
    发表于 12-24 06:55

    C语言中指针数组分别有哪些作用呢

    C语言中指针数组分别有哪些作用呢?
    发表于 02-25 07:20

    C语言入门教程-用指针操作数组

    C语言入门教程 在C语言中数组指针的关系十分密切。要想有效地使用
    发表于 07-29 12:18 1491次阅读

    char *和char数组区别及内核访问用户区

    的也就是两个指针了,而对于char数组 pa2,它的内存表示就是s1的15个字节而s2的15个字节连续排放,整个结构就是实实在在的数据,我们传入send就将s1和s2的内容一块传送出去 了,而不仅仅
    发表于 04-02 14:36 3154次阅读

    指针数组都是C语言的精髓所在 两者何联系区别

    指针数组都是C语言的精髓所在,对于很多C程序员来说,如果你问这样一个问题:数组
    的头像 发表于 05-27 14:51 4143次阅读
    <b class='flag-5'>指针</b>和<b class='flag-5'>数组</b>都是<b class='flag-5'>C</b><b class='flag-5'>语言</b>的精髓所在 两者<b class='flag-5'>有</b>何联系<b class='flag-5'>区别</b>

    C语言函数中的传值和传指针到底什么区别

    我们可能听过C语言中的传值和传指针,在其他语言中,也有传引用一说,那么他们到底什么区别呢?如果
    的头像 发表于 09-08 10:14 5061次阅读

    C语言函数参数关于传值和传指针什么区别

    C语言函数参数的传值和传指针什么区别
    的头像 发表于 02-26 16:35 2221次阅读

    为什么C语言函数不能返回数组

    C语言函数可以返回指针、结构体,为什么不能返回数组? 下面一步一步来分析: 1 函数不能返回数组C
    的头像 发表于 03-29 11:18 2001次阅读

    MCU_C语言中 数组指针 的应用 -- char (*stringp)[]

    定义一个指向数组指针stringpchar (*stringp)[];取得某个数组的地址 :char *dst = &string[10];
    发表于 11-29 18:06 2次下载
    MCU_<b class='flag-5'>C</b><b class='flag-5'>语言中</b> <b class='flag-5'>数组</b>型<b class='flag-5'>指针</b> 的应用 -- <b class='flag-5'>char</b> (*stringp)[]

    C语言中指针(重点)超详细

    C语言中指针1、指针是什么2、指针指针类型2.1、指针
    发表于 01-13 14:10 11次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的<b class='flag-5'>指针</b>(重点)超详细

    C语言指针数组区别

    C语言教程中我们使用通过数组名通过偏移和指针偏移都可以遍历数组,那么指针
    的头像 发表于 07-18 16:29 1924次阅读

    C语言中什么是指针数组

    C语言中一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,
    的头像 发表于 03-10 15:26 1749次阅读

    Char数组与String是如何从统一走向分离的?

    在很多编程语言中,经常用 String 类型来表示字符串,用 Char 来表示字符类型;
    发表于 05-19 09:49 246次阅读
    <b class='flag-5'>Char</b><b class='flag-5'>数组</b>与String是如何从统一走向分离的?