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

160 篇文章 11 订阅
10 篇文章 0 订阅

让我们通过下面的例子,来了解 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').

 

区别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 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);
   
    //忘记释放内存
}

关注B站号:小鱼快来啊,+q粉丝群:725022484 免费领取300G精品编程资料

免费领取300G精品编程资料 icon-default.png?t=N2N8https://jq.qq.com/?_wv=1027&k=k1YO7sJG

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值