指向数组的指针

数组(array)是一系列具有相同类型的数据的集合,每一份数据叫做数组元素(element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。
定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第0个元素。在c语言中 我们将0个元素的地址称为数组的首地址。
   int arr[]={99,15,100,888,252}
 首先数组名和数组首地址并不总是等价。
  以指针的方式遍历数组元素:
#include <stdio.h>

int main(){
    int arr[]={99,15,100,888,252};
    int len=sizeof(arr)/sizeof(int);  //求数组长度
    int i;
    for(i=0;i<len;i++){
       printf("%d ",*(arr+i));// *(arr+i)等价于arr[i]
    }
    printf("\n");
    return 0;

}

代码中 sizeof(arr)会获得整个数组所占字节数,sizeof(int)会获得一个数组元素所占用的字节数,他们相除的结果是数组包含数组个数,即数组长度
*(arr+i)表达式指向数组第0个元素,数组首地址。

我们接下来定义一个指向数组的指针,如
int arr[]={9,15,100,888,122};
int *p=arr;
arr 本身就是一个指针,所以可直接赋值给指针变量p。arr、p、&arr[0] 三种写法是等价的,都指向数组第0个元素,或说是数组的开头。
如果一个指针指向了数组,我们称他为数组指针(array pointer)。

数组指针指向的是数组中的一个具体元素,而不是整个数组,所以数组指针的类型和数组元素的类型有关,在例子中,p指向的数组元素是int类型,所以p的类型必须是int*。
反过来想,p并不知道它指向的是一个数组,p只知道它指向的是一个整数,究竟如何使用p取决于程序员的编码。更改代码 使用指针遍历
#include <stdio.h>

int main(){
    int arr[]={99,15,100,888,252};
    int len=sizeof(arr)/sizeof(int);  //求数组长度
    int i;
    for(i=0;i<len;i++){
       printf("%d ",*(p+i));
    }
    printf("\n");
    return 0;

}


关于数组指针的谜题
假设p 是指向数组arr中第n个元素的指针,那么*p++、*++p、(*p)++分别是什么意思

 *p++等价于*p(++),表示先取得第n个元素的值,再将p指向下一个元素。

 *++p等价于*(++p)会先进行++p运算,使得p的值增加,指向下一个元素,整体上相当于*(p+1),所以会获得第n+1个数组元素的值

 (*p)++ 会先取得第n个元素的值,再对该元素的值加1。假设p指向第0个元素,并且第0个元素的值为99,执行完该语句后,第0个元素的值就会变为100.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值