指针和数组名的区别

 

指针和数组名有如下区别:

区别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]值一样,都是数组的首地址




 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值