C语言| 指针在数组中的移动

【指针的移动】

Q:指针变量如何指向一维数组的其他元素呢?

A:

[操作1]  p=&a[3];  // 假设指针变量p和数组a已经全部定义和初始化。

[操作2]  如果指针变量p 已经指向一维数组的第一个元素,那么p+1 就表示指向该数组的第二个元素。p+1指向的就是下一个元素。

【程序代码1 知识点】

如果p指向的是第一个元素的地址,那么*p表示的就是第一个元素的内容。
同理,p+i 表示的是第 i+1个元素的地址,那么*(p+i) 表示第 i+1个元素的内容
就是说p+i 就是指向元素a[i]的指针,*(p+i) 就等价于a[i]。

括号不能省略,* 的优先级比+的优先级更高。

* (p+1) 和 *p+1 不是等价的,*p+1相当于 (*p)+1。

【程序代码2 知识点】

数组名表示数组的首地址,a[i]表示的是数组第i个元素。
如果指针变量也指向这个首地址,可以用p[i]表示数组的第i个元素。

p[i] 和 *(p+i) 是等价的===“指向数组的”指针变量也可以写成“带下标”的形式。

【程序代码3 知识点】

数组a表示的是数组的首地址,元素a[i]的地址也可以用a+i表示。
如果指针变量p也指向数组a的首地址,那么 p+i 和 a+i是等价的。

只要是地址,都可以用 *地址 表示该地址所指向的内存单元中的数据。
而且也只有地址前面才需要加*,才能表示具体的数据。

在执行程序的时候,数组先是计算地址,然后转化成指针。
直接使用 *(a+i),执行速度会更快。

【程序代码1】

【指针的移动】三种不同的写法
1 p =&a[3];
指针p,指向数组a第4个元素的地址,所以输出*p的结果为44。
2 q = a; q = q+3;
指针q指向数组a的起始地址,q+3表示数组的第4个元素。
3 r = a; 输出*(r+3),表示第4个元素。

*q+i相当于 (*q)+i;

#include <stdio.h>

int main(void)
{
    int a[] = {11, 22, 33, 44, 55, 66};
    int *p, *q, *r;

    p =&a[3]; //第一种写法
    printf("*p = %d\n", *p);

    q = a; //第二种写法
    q = q+3;
    printf("*q = %d\n", *q);

    r = a; //第三种写法
    printf("*(r+3) = %d\n", *(r+3));
    
    return 0;
}

【程序代码2】

C语言| 数组-CSDN博客

数组名表示数组的首地址,a[i]表示的是数组第i个元素。
如果指针变量也指向这个首地址,可以用p[i]表示数组的第i个元素。

p[i]和*(p+i)是等价的===“指向数组的”指针变量也可以写成“带下标”的形式。

#include <stdio.h>

int main(void)
{
    int a[] = {11, 22, 33, 44, 55, 66};
    int *p =a;

    printf("p[0] = %d\n", p[0]);
    printf("p[1] = %d\n", p[1]);
    printf("p[2] = %d\n", p[2]);
    printf("p[3] = %d\n", p[3]);
    printf("p[4] = %d\n", p[4]);
    printf("p[5] = %d\n", p[5]);

    return 0;
}

【程序代码3】

数组a表示的是数组的首地址,元素a[i]的地址也可以用a+i表示。
如果指针变量p也指向数组a的首地址,那么 p+i 和 a+i是等价的。

只要是地址,都可以用 *地址 表示该地址所指向的内存单元中的数据。
而且也只有地址前面才需要加*,才能表示具体的数据。

在执行程序的时候,数组先是计算地址,然后转化成指针。
直接使用 *(a+i),执行速度会更快。

#include <stdio.h>

int main(void)
{
    int a[] = {123, 456, 789, 888, 666, 999};
    int *p = a;

    printf("*(p+3) = %d, *(a+3) = %d\n", *(p+3), *(a+3));
    
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值