mian()
{
int a[5];
int *p = a;
sizeof(p)/sizeof(p[0]); //结果为1
p =(int*)malloc(5*sizeof(int));
sizeof(p)/sizeof(p[0]); //结果为1
sizeof(a)/sizeof(a[0]) ; //结果为5
}
这个例子很有趣,他体现了数组和指针的一个区别。那指针和数组还有那些区别呢?
(1) 指针是个变量,数组是个常量
指针既可以作为左值,也可以作为右值
数组只可以当右值
p = a ;
a = p ;//不允许
(2)sizeof ()
数组名 a 不止是一个地址这么简单,他还包含数组长度信息。
sizeof(a)并不是4个字节,而是 4 * N 个字节(N 为数组长度,假设是整型数组)
sizeof(p)是4个字节,只带有本身类型信息
(3)[ ]
数组的下标运算符,数组特有,同时实现指针加法运算和间接引用,
而指针可以使用[ ],如p[0],前提是指针首先指向一片连续空间
(4) 虽然同时地址。
数组名a 一定有个有效值,并且这个值是一片连续空间的首地址,进行*a ,基本没问题。
指针p,值不确定,可能为空NULL,可能是个无效地址(野指针),可能是单个变量的地址,可能是一片连续的空间,当他是指向一片连续空间,就可以进行算术运算,比较运算。我们不能冒然使用*(p)
(5)数组名a一声相随,永远指向那片连续空间
指针p ,很容易变心,想指哪就指哪
原因 p 是变量(可以做左值)
这点好像和第(1)点没区别。
但是指针往往要配合数组使用,往往效率高,代码简洁