当前位置: 首页 > news >正文

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

【指针的移动】

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

A:如果指针变量p 已经指向一维数组的第一个元素,那么p+1 就表示指向该数组的第二个元素。

【程序代码1】

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

【程序代码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;
}
 

http://www.lqws.cn/news/162289.html

相关文章:

  • 电商实践 基于token防止订单重复创建
  • 【C++进阶篇】C++11新特性(中篇)
  • 2025年阿里最新软件测试面试题:Web 测试+接口测试+App 测试
  • VMware VCSA 9.0 Install
  • AI问答-vue3+ts+vite:http://www.abc.com:3022/m-abc-pc/#/snow 这样的项目 在服务器怎么部署
  • 【笔记】解决MSYS2安装后cargo-install-update.exe-System Error
  • 服务器中CC攻击的特点有哪些?
  • 数据库-MySQL
  • ES6模块化
  • 搭建前后端分离项目
  • MPLAB X IDE ​软件安装与卸载
  • Three.js光与影代码分析及原理阐述
  • 20250605车充安服务器受木马攻击导致服务不可用
  • Nuxt.js 入门总结教程
  • 通信刚需,AI联手ethernet/ip转profinet网关打通工业技术难关
  • 电路设计基础-3
  • Air8000开发板新资料开放!多功能+高扩展特性全面解锁
  • 嵌入式学习之系统编程(十)网络编程之TCP传输控制协议
  • 等比数列的概念及性质02
  • 探秘鸿蒙 HarmonyOS NEXT:实战用 CodeGenie 构建鸿蒙应用页面
  • 串:BF算法(朴素的魔术匹配算法)
  • Redis 配置与优化
  • 如何通过requests和time模块限制爬虫请求速率?
  • Unity协程Coroutine与UniTask对比
  • 如何排查和解决PHP连接数据库MYSQL失败写锁的问题
  • 数据结构:递归:泰勒展开式(Taylor Series Expansion)
  • SAP学习笔记 - 开发24 - 前端Fiori开发 Filtering(过滤器),Sorting and Grouping(排序和分组)
  • Docker MCP 目录和工具包简介:使用 MCP 为 AI 代理提供支持的简单安全方法
  • 阿里云服务器安装nginx并配置前端资源路径(前后端部署到一台服务器并成功访问)
  • Spring Boot 使用 SLF4J 实现控制台输出与分类日志文件管理