9.4 数组的指针和指向数组的指针变量-1

9.4 数组的指针和指向数组的指针变量-1

  • 一.指向数组元素的指针变量的定义和赋值
  • 二.通过指针引用数组元素
    • 1.情况1
    • 2.情况2
    • 3.情况3
    • 4.情况4
    • 5.情况5
      • 注意事项:
    • 情况6:*p++ 优先级相同,并且都是从右到左的结合性,所以 *(p++)
    • 情况7: (*p)++ 表示p所指向的元素加1,如果p指向数组首地址,那么就等价于a[0]++,实际上是数组元素值+1,不是指针+1;
  • 三.学习网站

一.指向数组元素的指针变量的定义和赋值

数组指针 是指 数组的开始地址,数组元素的指针就是数组元素的地址
a[3] = 6; //下标法引用数组元素,也可以用指针
int a[5]; //能引用的是a[0]-a[4];
a[0] = 5;a[1] = 6; a[2] = 7; a[3] = 8; a[4] = 9;
9.4 数组的指针和指向数组的指针变量-1_第1张图片

int *p;   //指针变量,整型指针变量,和数组a类型相同。
p = &a[0];  //把a[0] 元素的地址赋给指针变量p,即p指向数组第0号元素;
p = a; //数组名代表数组的首地址

9.4 数组的指针和指向数组的指针变量-1_第2张图片
//定义指针变量时也可以给指针变量赋予初值

int *p = &a[0];

int *p;
p = &a[0];   // *p = &a[0];
int *P = a;

二.通过指针引用数组元素

1.情况1

*P =19; //a[0] = 19;
9.4 数组的指针和指向数组的指针变量-1_第3张图片

2.情况2

p = p +1; //增加了4,比如原来p = 1000, p = p +1后 p= 1004;

3.情况3

p =i 或者 a+i (i是数组元素的下标 0-4)
假如现在p指向数组首地址,a是数组名(代表数组首地址),那么p+i或者a+i就是数组元素a[i]的地址,也就是说,它们指向了数组a的第i个元素。
也就是说 p+3,和 a+3的值, &a[3],也就是都指向a[3], a+ 3*4 = 1012
9.4 数组的指针和指向数组的指针变量-1_第4张图片
结论:p+i 或者a+i,都是地址。既然是地址,就可以赋给指针变量。

*P = 19;   //a[0]
p = a +3;
*p = 13; //a[3]

4.情况4

(p+i) 或者 (a +i)
有了情况3,自然知道情况4,这两个是p+i或a+i所指向的数组元素,也就是a[i],比如
(p+2) 或者
(a+2)就是a[2];
*(p+3) = 18; //相当于a[3] =18;
*(p+2) = 190; //相当于a[2] =190;
9.4 数组的指针和指向数组的指针变量-1_第5张图片

5.情况5

p[i] (i是数组元素的下标0-4)
p[i]与 *(p+i) 等价,也就是跟a[i]等价
p[3] = 156; //等价于a[3] = 156
9.4 数组的指针和指向数组的指针变量-1_第6张图片
引用数组元素有很多方法:
a[i] ; p[i]; *(p+i); *(a+i);

演示实例:

int a[5];  //能引用的是a[0]-a[4];
int *p;
int i;
a[0] = 12;a[1] =14; a[2] = 20; a[3] = 18; a[4] = 50;


for(i = 0;i < 5;i ++)
{
    printf("%d\n",a[i]);
}

    printf("--------------------\n");

for(i = 0;i < 5;i ++)
{
    printf("%d\n",*(a+i));
}

    printf("--------------------\n");


for(p = a;p < (a+5);p ++)    //直接操作内存,效率最高
{
    printf("%d\n",*p);
}

注意事项:

1.a++不可用
2.*a[5] 按照 *(a+5)

p++:优先级相同,并且都是从右到左的结合,所以(p++)

情况6:*p++ 优先级相同,并且都是从右到左的结合性,所以 *(p++)

p++是先用后加,所以*(p++)整个作用是:得到p指向的变量的值(*p),然后再使p指针自加1,指向下一个数组元素;

int a[5];  //能引用的是a[0]-a[4];
int *p;
a[0] = 12;a[1] =14; a[2] = 20; a[3] = 18; a[4] = 50;
p = a;
printf("%d\n",*p++);   //打印a[0]的值,然后p指向了a[1];
printf("%d\n",*++p);   //打印a[1]的值,然后p指向了a[1]

情况7: (*p)++ 表示p所指向的元素加1,如果p指向数组首地址,那么就等价于a[0]++,实际上是数组元素值+1,不是指针+1;

(*P)++; //相当于a[0]++;
p++;
(*p)++; //相当于a[1]++;
p–; //又指回&a[0]
(*p) = 789; //a[0] = 789;

三.学习网站

整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记

你可能感兴趣的:(C语言,c语言)