c语言中指针与数组名

作为初学者,开始时听到最多的就是c语言的指针很难,我倒是觉得指针很形象,容易理解,只是c语言对指针的声明很容易混淆,尤其是和数组名搭配在一起时,让人难以理解.经过一学期学习,我还算理清楚了,因此作为这学期的的总结,我就只谈谈这一个话题吧,一个话题虽然少,但也能代表这门课中我的收获是很重要的,因为这些知识一直是难点,和关键点---c语言中的指针以及数组名.我们看以下3个语句:

1. int *p[10];

2. int (*p)[10];

3. int a[10] = {0}, *p = a;

第一句,由于优先级,[]高于*,所以p先于[]结合,所以p[10]是一个数组,用于存放指向整型数据的指针(放的数据是指针).第二句利用括号回避了优先级,所以p*结合,所以p声明为一个指针,它指向一片内存区域,这片区域用于存放整型数据.第三句也好理解, a是数组名, p是指针,指向一个整型数据,这里把a赋给p实际上是吧a作为地址信息传给了p,于是p指向a[0].

我们可以看到以上数组名,指针的概念还算可以理解,只要小心注意符号优先级,可以分辨其含义,但是下面的问题,困扰了我好久:

int a[3] = {1, 2, 3};

int (*p)[3];

p = a;  //这种赋值是错误的

p = &a; //这种赋值是正确的,原因p是数组指针所以应将数组的地址赋值给p

          // 就如同p若为整型指针,则应将整型的地址赋值给p

//这种感觉就像p其实是一个二次指针,p存放的值是数组名也是它指

//向的数组的地址,再*一次才到数据

为什么第一种赋值是错误的,而第二种才是正确的呢?

事实上编译器没有为数组名分配空间,但编译器对数组名做了特殊处理:

数组名    为数组首地址,

&数组名 也是代表的数组首地址.但把整个数组内存区域看作一个单位

虽然在实际中,数组名与&数组名 都是同一个值,但是编译器在逻辑上仍然将a视为数组,将&a视为取数组的地址,所以, 数组指针= &数组名  即p=&a;

这里也不能写成p = &a[0];因为a[0]是数组元素,不是数组名,虽然他们的值都是某个地址,这个地址完全相同,但&a[0]是取整型元素地址,而&a是取整型数组地址,两者不同.另外,&a+1指向了数组末尾的下一个地址,同样用于存放十个单位整型数据.

再看以下图片中我写的程序对指针的自增运算及其运行结果:

(第一次求得是存放p的地址当然不会变.)

从上图结果我们可以知道:

指针是一个变量,占用4字节,用以保存地址.

指针的占用内存大小是固定的,是4字节,但是指针指向的那块内存区域的大小取决于指针的类型.

再如以下例子:

int *p;       指向的内存区域以4字节为一个单元进行操作 

char *p;       指向的内存区域为以1字节为一个单元进行操作

char  (*p)[5]; 指向的内存区域为以5个字节为一个单元进行操作

好啦以上就是我对c语言指针及数组名的理解.可能也会有错误,请大家指出。                                                                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值