指针与数组

数组和指针

1、数组和指针的区别:
数组和指针并不相等,下面我来说一下它们的一些区别:
举个例子吧,
int a[5]; int *b;
这是指针和数组的声明,虽然他们都具有指针值,而且都可以进行指针访问和下标引用操作。但是,声明数组时,编译器会根据声明所指定的元素数量为数组保留一定的内存空间,然后再创建数组,并且它的只是一个常量,指向这段空间的起始位置;声明指针时,编译器只为指针本身保留内存空间,并不为整型值分配内存空间,而且,指针变量并没有被初始化为指向任何现有的内存空间,如果它是一个自动变量,就根本不会被初始化。所以说,表达式b++可以通过编译,但是a++不能,因为a是一个常量。
2、数组初始化:
数组的初始化和变量的差不多,不过,数组需要好多值,这些值用逗号隔开,放在一对花括号中:
举个例子:
int arr[3]={1,2,3};
这里arr[3]中的3是表示数组总共可以放三个元素,要是多放,比如:int arr[3]={1,2,3,0};系统就会报错,少放呢?如:int arr[3]={1};这个却是合法的,系统会将没有初始化的元素默认为0。
不过,也只能默认最后几个,不能默认中间的。
如果不定义数组的长度,那么,系统将会根据初始化的元素个数自动计算长度,如:int arr[]={1,2,3,4,5};系统将会默认这个数组长度为5。如果初始值列表经常修改,那么就可以使用这个小技巧。
字符数组的初始化:显而易见,一种很直观的方法就是像整形数组初始化一样,例如:char arr[]={‘h’,’e’,’l’,’l’,’o’,’0’};最后的0是字符结束标志’\0‘的ASCll值;不过显然这种方法只适用于比较短的字符串,要不然,很麻烦的,所以,这里又有一种快速方法来初始化字符数组:char arr[]=”hello”;
3、数组名作为函数参数:
用数组名作为函数实参的时,不是把数组元素的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共占同一段内存单元。如下图:

内存

假如a的起始地址为1000,则b数组的起始地址也是1000,显然a和b同占一段内存单元,a[0]和b[0]同占一个内存单元……。由此,我们可以看到,形参数组中各个元素的值如果发生变化会使实参数组元素的值同时发生变化,从上图是很容易理解的。这一点与变量做函数参数的情况是不同的,务必注意!在程序设计中可以有意识地利用这一点,改变实参数组元素。
4、指针数组和数组指针:
指针数组:显然它是一个数组,数组的元素都是指针,数组占多少字节取决于数组本身。它是储存指针的数组。
数组指针:那么这个就是指针了,指向一个数组,即是指针,那么在32位系统中永远都是占用4个字节,它是指向数组的指针。
下面看例子:
(1)、int * p1[10]
(2)、int (* p2)[1]
现在看一下哪个是指针数组,哪个是数组指针?要解决这个问题,首先要确定符号的优先级问题,“[]”的优先级显然比“*”的优先级要高,那么再来看(1),p1先于[]结合形成数组,然后再用指针指向这个数组,那么这就是指针数组了,(2)中()的优先级大于[],所以是数组指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值