char *p 与char p[N]

数组不是指针,指针也不是数组,这是两个不同的东西,只是在某些场合下,可以进行相似的操作。

char a[10] = "Hello";
char *p = "World";

a和p在内存分别是这样的

可以看出,p是一个指针,其内容指向一个数组;a就是数组本身;

再看操作上的不同

1、对于sizeof操作符来说,char *p结果是指针大小,我的机器是8char p[10]结果是数组大小,是10。

2、对&(取地址)操作符而言,得到的结果不一样,a = &a = &a[0],这三个数值都一样,但是类型不一样,&a是数组指针char (*)[10],&a[0]是指向第一个元素的指针,是char *; p != &p,p最为一个变量,本身需要内存存放,这个地址是p本身,&p获取p本身的地址,类型是char **,p存放的值为指向的数组首址,所以p != &p

void func(char (*p)[10]);

func(&p); // error

func(&a); // ok

3、编译器对两者的处理不同,即访问a和p(不是内容),产生的汇编不同,具体后补

为什么会说指针和数组一样呢,这是因为在指针代数运算、数组下标运算和数组作为参数传递给函数的时候,数组会退化生成指向第一个元素的指针。p[2] => *(p + 2), a[2] => *(a + 2),在这里看起来是等价的,而且还有诡异的写法3[p], 4[a]都是合法表达式,因为都会被转换成指针运算。

 

其实这两货没有什么区别,都是一个字符串开头地址,特别是传参数用char *p和 char p[1]完全是一样的东西,当然了,你用char *p是没有分配内存的,而char p[N]会分配N字节的内存

 

C++使用指针来处理数组的,所以就有了数组名是指向数组第一个元素指针的值,凡是数组的地方换为指针没问题,利用指针运算,但是,指针的地方,不一定可以换成数组处理方式,只有指针指向了数组,才可以换,所以char[]和char*就好理解了,第一个做形参的时候,表明这是数组,当然可以换成后者,但是后者做形参,得看看主调函数传的实参是不是数组指针,是的话,也可以等价互换,不然绝对不可以!


 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wangchuang2017

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

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

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

打赏作者

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

抵扣说明:

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

余额充值