打印
[其它应用]

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

[复制链接]
208|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2024-2-25 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先,让我们通过下面的例子,来了解一下C语言中字符数组和字符指针之间的区别。

void test(){    //arr is array of characters    char arr[12] = "Aticleworld";        //ptr is pointer to char    char *ptr = "Aticleworld";}

[color=rgba(0, 0, 0, 0.9)]下面,让我们比较一下arr(字符数组)和ptr(字符指针)。

[color=rgba(0, 0, 0, 0.9)]区别1:

[color=rgba(0, 0, 0, 0.9)]字符串文本是用双引号括起来的零个或多个多字节字符的序列。当你编写语句 char arr[12] = "Aticleworld" 时,字符串文本中的字符被复制到 arr。

当您编写语句 char *ptr = "Aticleworld" 时,您是让字符串文本数组进行数组到指针的转换,以获取指向其第一个元素的指针。指针 ptr 指向字符串文本数组的第一个元素('A')。
区别2:arr 是存储在连续内存位置的字符集合,而 ptr 保存字符的地址。arr 包含 12 个元素,每个元素位于连续的内存位置。另一方面,ptr 保存字符串文本的第一个字符的地址。区别3:当我们在 char 数组 arr 上使用 sizeof 运算符时,它给出字符总数,而 char 指针 ptr 只给出指针的大小。例如:

#include <stdio.h>int main(){    //arr is array of characters    char arr[] = "Aticleworld";    //ptr is pointer to char    char *ptr = "Aticleworld";    printf("Size of arr %ld\n", 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 24Size of ptr 4区别4:和指针之间的另一个重要区别是,我们可以增加指针,但不能创建数组的增量。例如:

arr++ =>非法语句。ptr++ ==>正常语句。

[color=rgba(0, 0, 0, 0.9)]区别5:

[color=rgba(0, 0, 0, 0.9)]我们可以将值重新分配给数组,但字符串文本不可修改。如果程序尝试修改由字符串文本形成的静态数组,则行为未定义。例如:


//arr is array of characterschar arr[] = "Aticleworld";gets(arr); fgets(arr,sizeof(arr),stdin); //有效表达式[color=var(--weui-LINK)][url=]scanf[/url]("%s", arr); //有效表达式[color=var(--weui-LINK)][url=]strcpy[/url](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 leakvoid foo2(){    char *ptr = (char*)malloc(12);       //忘记释放内存}

使用特权

评论回复
沙发
小夏天的大西瓜| | 2024-2-26 18:11 | 只看该作者
arr 是存储在连续内存位置的字符集合,而 ptr 保存字符的地址。

使用特权

评论回复
板凳
中国龙芯CDX| | 2024-2-26 21:35 | 只看该作者
和指针之间的另一个重要区别是,我们可以增加指针,但不能创建数组的增量

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

379

主题

1429

帖子

1

粉丝