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

C语言-指针数组和数组指针

在C语言中,int* p[3]int (*p)[3] 的区别与运算符优先级和声明类型密切相关:


  1. int* p[3]
    • 类型:指针数组

• 含义:声明一个包含3个元素的数组,每个元素是int*类型的指针

• 优先级:[] 优先级高于 *,因此p先与[3]结合

• 内存布局:

p[0] → 某个int变量的地址
p[1] → 另一个int变量的地址
p[2] → 第三个int变量的地址

• 典型用途:存储多个独立指针

int a = 1, b = 2, c = 3;
int* p[3] = {&a, &b, &c};

  1. int (*p)[3]
    • 类型:数组指针

• 含义:声明一个指针,指向一个包含3个int元素的数组

• 优先级:()强制*先与p结合

• 内存布局:

p → 指向一个二维数组的行(该行有3int元素)

• 典型用途:操作二维数组的行

int arr[2][3] = {{1,2,3}, {4,5,6}};
int (*p)[3] = arr; // p指向arr的第一行
printf("%d", (*p)[1]); // 输出第1行第2个元素:2

关键区别

特性int* p[3]int (*p)[3]
类型指针数组数组指针
元素类型int*指向int[3]的指针
内存占用3个指针的空间1个指针的空间
解引用结果单个int一个int[3]数组
+1操作步长移动一个指针大小(如4字节)移动整个数组大小(12字节)

示例对比
指针数组 (int* p[3])

int a = 10, b = 20, c = 30;
int* p[3] = {&a, &b, &c};
printf("%d", *p[1]); // 输出20(访问第二个指针指向的值)

数组指针 (int (*p)[3])

int arr[2][3] = {{1,2,3}, {4,5,6}};
int (*p)[3] = &arr[0]; // 指向第一行
printf("%d", (*p)[2]); // 输出3(访问第一行第三个元素)
p++; // 移动到下一行
printf("%d", (*p)[0]); // 输出4(第二行第一个元素)

总结
int* p[3]:当需要存储多个独立指针时使用(如字符串数组)

int (*p)[3]:当需要按行操作二维数组时使用(如矩阵遍历)

• 括号()的作用:改变运算符优先级,明确指针的指向目标类型

http://www.dtcms.com/a/193222.html

相关文章:

  • 2025认证杯数学建模C题思路+代码+模型:化工厂生产流程的预测和控制
  • print()函数详解:输出文字、变量与格式化
  • 【笔试训练】简单写词|dd爱框框|除2!
  • 深度理解用于多智能体强化学习的单调价值函数分解QMIX算法:基于python从零实现
  • 【C#】Thread.Join()、异步等待和直接join
  • AutoVACUUM (PostgreSQL) 与 DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC (Oracle) 对比
  • SCI写作开挂!把Grammarly语法修订嵌入word
  • LLM中最后一个位置的对数概率是什么? 怎么作为LOSS实现方式
  • P1260 工程规划
  • 【vue】【环境配置】项目无法npm run serve,显示node版本过低
  • 夏季养生4要点
  • ⼀键登录原理是什么?⼀键登录sdk怎么选?
  • 快速通关单链表秘籍
  • Java爬虫能处理京东商品数据吗?
  • ruskal 最小生成树算法
  • 嵌入式培训之数据结构学习(四)双向链表、makefile
  • Java 序列化(Serialization)
  • MUSE Pi Pro 使用TiTanTools烧录镜像
  • SiFli-SDK 编译
  • 车载诊断进阶篇 --- 车载诊断概念
  • 基于互联网和LabVIEW的多通道数据采集系统仿真设计
  • Spring 模拟转账开发实战
  • Spring MVC HttpMessageConverter 的作用是什么?
  • 2025年,如何制作并部署一个完整的个人博客网站
  • 智能视觉赋能精准抓取:富唯智能重新定义机械臂应用新高度​
  • 嵌入式学习笔记 D21:双向链表的基本操作
  • 深入浅出:Windows系统DLL劫持提权原理
  • 位运算题目:找到最接近目标值的函数值
  • 面试从微前端拓展到iframe是如何通信的
  • 计量——检验与代理变量