【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 对于同一个数组结果会差一个。