学习笔记---指针法访问数组、数组的实质、数组/指针作为函数参数

指针法访问数组


首先,通过一个小程序来初步窥探数组的实质:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用于测试数组的实质
*/
#define n 5
int main()
{
    int a[n]={123,5,9,11,33};
    printf("%d\n",a);//如果直接输出数组名字所代表的值
    printf("%x\n",a);//如果用16进制输出数组名字所代表的值
    printf("%x\n",&a[0]);//如果用16进制输出数组第一个元素的地址
    printf("%d\n",a[0]);
    printf("%d\n",*a);//如果对数组的名字使用取指针运算。。
    return 0;
}
结果:


解析:

1.当输出数组名所代表的值时,发现输出的不是数组内所有的元素,甚至不是数组内任何一个元素。

2.用十六进制输出数组名所代表的值和数组第一个元素的地址值,发现他们是相同的。

3.对数组名使用取指针运算,得到的结果就是数组第一个元素的值。

4.综上所述,可以得出结论:数组名代表的是数组第一个元素的地址值。


数组和指针


已知:数组名代表数组的起始地址(数组首元素的地址)

因此:

当  int a[10],*p;

p=&a[0];等价于p=a;

由此,进行以下测试:

代码示例:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试数组的本质

核心:数组的本质是在内存空间中定义一段连续的存储单元,数组名等同于指向数组首元素的指针
*/
int main()
{
    int a[10]={1,3,5,7,9,11,13,15,17,19},*p,i;//定义一个整型的数组和指针
    p=a;//使得指针指向数组中第一个元素的地址
    /*用传统的方式输出数组中的元素*/
    printf("output1:\t");
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    /*因为p是数组中第一个元素的地址,所以。。*/
    printf("\noutput2:\t");
    for(i=0;i<10;i++)
        printf("%d ",*(p+i));
    /*因为a也是数组中第一个元素的地址,所以。。*/
    printf("\noutput3:\t");
    for(i=0;i<10;i++)
        printf("%d ",*(a+i));
    /*更激进的尝试。。。*/
    printf("\noutput:4\t");
    for(i=0;i<10;i++)
        printf("%d ",p[i]);
    return 0;
}
结果:


解析:

1.p+1代表的是p加一个内存单元的值,如果p代表数组第一个元素的地址,那么p+1代表的就是数组第二个元素的地址。

2.验证得出,以上4中方法都能输出数组中的值。

3.  [  ] 这种形式的常用于数组之后的符号,其实是一种运算符。


注1:

运算符
优先级 运算符 功能 结合方式
    1    [   ]    数组     由左向右

该运算符的运算实质:

1.按(a+i*d)计算

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值