C语言指针学习(4)指针和数组

一、回顾数组的知识
定义数组:int a[4]={1,2,3,4};
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
代码验证如下
在这里插入图片描述
在这里插入图片描述
&a[0]=a+0均代表数组a第0个元素的地址

a=&a[0]=a+0
数组第0个元素的地址=数组首地址=a=&a[0]=a+0;
第1个元素的地址:a+1=&a[1]
第2个元素的地址:a+2=&a[2]
第3个元素的地址:a+3=&a[3]

在这里插入图片描述
a[0]=*(a+0)均代表数组a第0个元素的数值

例如:int a[4]={1,2,3,4};
a[2]
(1)	先求第2个元素地址:a+2
(2)	根据地址取出值:*(a+2)
结论:
第0个元素的值=a[0]=*(a+0)=1
第1个元素的值=a[1]=*(a+1)=2
第2个元素的值=a[2]=*(a+2=3
第3个元素的值=a[3]=*(a+3)=4

运行结果
在这里插入图片描述
对上面进一步进行补充,计算数组的长度,将数组元素值扩大10倍,打印数组元素内容
在这里插入图片描述
在这里插入图片描述
a[i]=*(a+i)均代表取值
在这里插入图片描述

运行结果
在这里插入图片描述
上面两个整合后代码如下:

int main()
{
    int a[4]={1,2,3,4};
    int length=sizeof(a)/sizeof(a[0]);
    printf("a的地址是%p\n",a);
    printf("第0个元素的地址是%p,%p\n",&a[0],a+0);
    printf("第1个元素的地址是%p,%p\n",&a[1],a+1);
    printf("第2个元素的地址是%p,%p\n",&a[2],a+2);
    printf("第3个元素的地址是%p,%p\n",&a[3],a+3);
    printf("*****************\n");
    printf("第0个元素的值是%d,%d\n",a[0],*(a+0));
    printf("第1个元素的值是%d,%d\n",a[1],*(a+1));
    printf("第2个元素的值是%d,%d\n",a[2],*(a+2));
    printf("第3个元素的值是%d,%d\n",a[3],*(a+3));
    printf("*****************\n");
    printf("&a[3]-a的值是%d\n",&a[3]-a);
    for(int i=0;i<length;i++){
        *(a+i)*=10;//元素值扩大10倍
    }
    for(int i=0;i<length;i++){
        printf("第%d个元素的值是%d,%d\n",i,a[i],*(a+i));
    }
}

运行结果:
在这里插入图片描述

二、指针变量和数组的关系(公式)

在这里插入图片描述
1、通过指针变量访问数组的写法1:
pa[i]=*(pa+i)均表示取数组元素的数值
sizeof(a)/sizeof(a[0])//计算数组元素个数

  int a[4] = {1,2,3,4};
  int *pa = a;//指针指向数组首地址
  int lenght = sizeof(a)/sizeof(a[0]);//计算数组元素个数
  //读查看
  for(int i = 0; i < lenght; i++) {
  		printf("%d, %d\n", pa[i], *(pa+i));//用两种读取数据方式打印内容
  }
  //写修改
  for(int i = 0; i < lenght; i++) {
  		*(pa + i) *= 10;//将数组元素扩大10倍
  		pa[i] *= 10;//使用另一种方式将数组元素扩大10倍
  }

2、通过指针变量访问数组的写法2:

  int a[4] = {1,2,3,4};
  int *pa = NULL;
  int lenght = sizeof(a)/sizeof(a[0]);
  
  //读查看
  for(pa = a; pa < a + lenght; pa++) {
  		printf("%d\n", *pa);
  }
  
  //写修改
  for(pa = a; pa < a + lenght; pa++) {
  		*pa *= 10;
  }

3、注意:

在这里插入图片描述
4、终极公式:a[i] = *(a+i) = *(pa+i) = pa[i](取元素的值)
**

三、例程

**
(1)将数组元素值扩大(缩小)
在这里插入图片描述

在这里插入图片描述
(2)*pa++计算过程是如何的呢?
*pa++是先计算 * 还是先计算++呢?
*pa++计算的过程是先算 * 然后在计算++
如果先计算了pa++则表示地址加1,表示指向了下一个地址,再计算 (pa++)就不是将数组元素值扩大10倍 了,而是取下一个元素的数值,所以是先计算 * 再去计算++
在这里插入图片描述
运行结果
在这里插入图片描述
(3)指针做相减运算得到的是相差元素的个数,实际地址相差元素个数
数据类型
在这里插入图片描述
运行结果如下
在这里插入图片描述
综合代码如下

#include<stdio.h>
  int main()
  {
      int a[]={1,2,3,4};
      int length=sizeof(a)/sizeof(a[0]);
      //写法1
      int *pa=a;
      for(int  i=0;i<length;i++){//写修改
          *(pa+i)*=10;
          pa[i]*=10;
      }
      for(int i=0;i<length;i++){//读查看
          printf("%d %d\n",pa[i],*(pa+i));
      }
      //写法2:
      for(pa=a;pa<a+length;pa++){//写修改
          *pa/=100;
      }
      for(pa=a;pa<a+length;pa++){//读查看
          printf("%d\n",*pa);
      }
      //写法3
	  for(pa=a;pa<a+length;){//写修改
	         *pa++*=10;//先算*,再算pa++
	     }
	     for(pa=a;pa<a+length;){//读查看
	         printf("%d\n",*pa++);
	     }
	 
	     int *p1=&a[1];//p1指向第一个元素,p1保存第一个元素的地址
	     int *p2=&a[3];//p2指向第三个元素,p2保存第三个 元素的地址
	     printf("p2-p1=%d\n",p2-p1);//相差2个元素
	     return 0;
 }

运行结果如下
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永栀哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值