char p[] 的相关问题

【1】数组结尾问题

都以'/0'结束 '/0'(字符形式)=0x00(十六进制)=0(十进制)= NULL

char s[] = "the sentence";//编译器在结尾生成'/0'

char x[]= {'t','h','e','/0'};//要自己填充'/0'

例如:判断s结尾,*s==NULL/'/0'/0/0X00;!*s

       x            *x==‘/0’ /NULL/0X00      !*x

 

常用if(!*s)

        while(*s)

 

strlen[s] = 12;

strlen[x] = 3;

【2】数组名到底是不是指针

转自http://hi.baidu.com/%BE%C5%B6%B0high%C4%D0/blog/item/259cc752373464190cf3e3fd.html

实际上数组名永远都不会是指针!这个结论也许会让你震惊,但它的确是事实。数组名、指针、地址这几个概念虽然是基础中的基础,但它们恰恰是被混淆和滥用得最 多的概念,把数组名说成指针,是一个概念性的错误,实质是混淆了指针与地址两个概念的本质。因此,在讨论数组之前,有必要先回过头来澄清一下什么是指针, 什么是地址,什么是数组名.

根据 C89 规定

指针是一个保存对象地址的变量,首先是变量,其次变量里的值是地址,所以输出的时候用 %x 输出。

printf("p4=%x/n",p4);

首先推翻数组名是指针的说法,这个说法出自国内某牛人的书,祸害了多少代学生

数组名不是指针

我们先来推翻 " 数组名就是指针 " 的说法,用反证法。

代码如下    

证明 数组名不是指针。

假设:数组名是指针;

则: p5 p6 都是指针;

因为:在 WIN32 平台下,指针长度为 4

所以:输出都应该为 4

实际情况是:第 p5 输出 10 ,第 p6 行输出 4

所以:假设不成立,数组名不是指针。

 

数组名是什么?身份不确定!

结论1 常地址,指向数组第一个元素

你可以写成 p5+1 如此类推遍历数组内所有元素,但你写成 p5++ 就会出错,因为它是常量。

结论2 数组名指代一种数据结构:数组

现在可以解释为什么程序中 p5 输出为 10 的问题,数组名 p5 的内涵为一种数据结构,即一个长度为 10 char 型数组,所以 sizeof(p5) 的结果为这个数据结构占据的内存大小: 10 字节。

结论3 数据名可能失去其数据结构内涵

到这里似乎数组名魔幻问题已经宣告圆满解决,但是平静的湖面上却再次掀起波浪。请看下面一段程序:

程序的输出结果为 4 。不可能吧?

一个可怕的数字,前面已经提到其为指针的长度 !

结论 2 指出,数据名内涵为数组这种数据结构,在 arrayTest 函数体内, str 是数组名,那为什么 sizeof 的结果却是指针的长度?这是因为:

数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。 所以,数据名作为函数形参时,其全面沦落为一个普通指针!它的贵族身份被剥夺,成了一个地地道道的只拥有 4 个字节的平民。

以上就是结论 3

 

PS sizeof strlen

1 Sizeof 是操作符,而 strlen 是函数

2 sizeof 会区分数据类型,而 strlen 不会区分是什么数据 它只会很正常的找 /0 结尾。

所以 sizeof strlen 对于同一个数组结果会差一个。


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值