【C语言】char *和 char[ ] 的区别,一文解决

一、字符指针 char *p

1.首先看最常用初始化的例子(注意初始化和赋值的区别)

char *p = "hello world";
//对于编译器而言,这里是会报警告的,warning

为什么编译器会报警告呢?

因为 “hello world” 是一个字符串常量const char *类型,当编译器编译到 "hello world" 的时候,会进行三个步骤

①将 "hello world" 存放在常量区

②存放的时候在末尾自动加上‘\0’, 即存储为“hello world\0”

③将存储字符串的内存的地址返回。即能够被字符串常量赋值的一定是指针。

而char *p中,字符指针p是存放在栈区的,但是p存储的地址(也就是“hello world”的地址)是常量区的地址,所以会报警告

那为什么不报错而只是报警告呢?因为字符指针p存储的只是 别的内存区的地址,而不是存储的 别的内存区的值,所以不会出现因生存期不同而造成内存错误

2.字符指针 char *p 允许赋值

char *p;
p = "hello world";

这没什么说的了,跟第一个解释是一样的,报警告不报错

3.写一个既不报错也不报警告的字符指针 char *p

很简单,报警告是因为内存区不一样导致的,我们只需要把它变成一样的即可

//初始化
const char *p = "hello world";//完全正确的写法

//赋值
const char *p ;
p = "hello wolrd";//完全正确的写法

二、字符数组

1.最常见的字符数组初始化

        基本在写程序都会用第一种写法,因为懒......

char p[] = "hello";
char p[6] = "hello";

char p[] = {"hello"};
char p[6] = {"hello"};

char p[] = {'h', 'e', 'l', 'l', 'o'};
char p[6] = {'h', 'e', 'l', 'l', 'o'};

//以上写法完全等效,且完全正确,既不会报错也不会报警告

2.字符数组不能赋值

char p[6];
p = "hello";//错误

为什么字符数组不能赋值呢?

原因是字符数组名p其实是一个指向数组第一个元素的指针。换句话说p其实是一个指针常量,即相当于char * const p。所以字符数组只能声明即初始化,而不能声明再初始化。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值