欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-03 08:41:10
...

一、回顾数组的知识
定义数组:int a[4]={1,2,3,4};
C语言指针学习(4)指针和数组

C语言指针学习(4)指针和数组
C语言指针学习(4)指针和数组
代码验证如下
C语言指针学习(4)指针和数组
C语言指针学习(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]

C语言指针学习(4)指针和数组
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

运行结果
C语言指针学习(4)指针和数组
对上面进一步进行补充,计算数组的长度,将数组元素值扩大10倍,打印数组元素内容
C语言指针学习(4)指针和数组
C语言指针学习(4)指针和数组
a[i]=*(a+i)均代表取值
C语言指针学习(4)指针和数组

运行结果
C语言指针学习(4)指针和数组
上面两个整合后代码如下:

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));
    }
}

运行结果:
C语言指针学习(4)指针和数组

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

C语言指针学习(4)指针和数组
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、注意:

C语言指针学习(4)指针和数组
4、终极公式:a[i] = *(a+i) = *(pa+i) = pa[i](取元素的值)
**

三、例程

**
(1)将数组元素值扩大(缩小)
C语言指针学习(4)指针和数组

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

#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;
 }

运行结果如下
C语言指针学习(4)指针和数组

上一篇:

下一篇: