指针和数组名有如下区别:
区别1 数组名指代一种数据结构,这种数据结构就是数组;
char str[20];
char *p=str;
printf("%d \n",sizeof(str));//20
printf("%d \n",sizeof(p));//4
str指代数据结构——20个元素的char型数组。
区别2 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;
char str[20];
char *p=str;
str++;
p++;
编译的时候报错:错误:自增操作数必须是左值//(str)
区别3 指向数组的指针则是另外一种变量类型(在32位平台下,长度为4),仅仅意味着数组的存放地址;
区别4 数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;很遗憾,在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
void function(char str[])
{
printf("%d \n",sizeof(str));
str++;
}
编译通过,且打印出str的长度为4,表示其退化为指针,也可以进行自增、自减操作。
区别5 一般指针变量指向的内存不可写,数组名指向的内存可写。
char str[]="abc";//把"abc"首地址的内容复制到字符数组str开始的内存中,每复制一个字符都会开辟一个字节(char型变量占1字节)内存来存这个字符(这也是实现了数组元素个数的动态确定)。
char *p="abc";//把"abc"首地址赋给指针变量p
*str=1;//正常
*p=1;//编译报错,段错误
以上可以看出,数组名指向的内存可以进行读写;
而指针指向的内存不可写,只可读,只能改变指针的指向。
若要实现指针变量的可读,可以malloc函数开辟一段内存,将其首地址赋给指针变量。
另外,值得注意的是
&str和str以及&str[0]值一样,都是数组的首地址