【C语言】int *p[ ] 与 int (*p)[ ] 的区分辨析

news2024/11/28 0:40:19

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C语言

文章目录

  • 💯前言
  • 💯基本概念:数组与指针
  • 💯理解 `int *p[10]` 与 `int (*p)[10]`
    • 1. `int *p[10]`:存放指针的数组
    • 2. `int (*p)[10]`:指向数组的指针
  • 💯如何区分这两种声明
  • 💯小结


在这里插入图片描述


💯前言

  • C语言系统编程领域的重要语言之一,其中指针的灵活性和强大功能是它的核心之一。指针的灵活性使得它非常强大,但也因此给初学者带来了一些困扰。
    特别是在理解数组和指针结合使用的情况时,如 int *p[10]int (*p)[10],我们常常感到困惑。本文将深入分析这两种声明之间的差异,帮助您从基础到深入理解指针数组指向数组的指针之间的区别。
    C语言
    在这里插入图片描述

💯基本概念:数组与指针

在这里插入图片描述
在进入具体的分析之前,我们首先需要了解一些基本的概念,包括数组和指针。

  1. 数组:数组是一个连续存储相同类型元素的集合。数组的声明需要指定元素类型和元素数量,数组在内存中的存储是连续的,这意味着数组内的每个元素在内存中占据着紧邻的位置。

    • 例如:int arr[5]声明了一个包含5个int类型元素的数组。
  2. 指针:指针是一个存储内存地址的变量。通过指针,我们可以间接地访问存储在内存中的数据。

    • 例如:int *ptr声明了一个指向int类型数据的指针。

指针和数组的结合往往能提供非常强大的操作方式,比如指向数组的指针和指针数组都可以实现非常灵活的数据操作,但是它们的用途和实现方式是不同的。
在这里插入图片描述

💯理解 int *p[10]int (*p)[10]

这两个声明分别有不同的含义,且应用场景也有很大差异。接下来,我们分别对这两种声明进行详细解释。
在这里插入图片描述

1. int *p[10]:存放指针的数组

  • 声明解释int *p[10]是一个“指针数组”。

    • p是一个包含10个元素的数组,其中每个元素都是一个int类型的指针。
    • 换句话说,p是一个数组,数组中的每个元素可以存储一个指向int类型变量的地址。
  • 内存结构:在内存中,这个声明表示有一个包含10个元素的数组,这些元素都是指针,因此每个元素存储的都是某个int变量的地址,而不是int本身。

  • 应用场景:指针数组可以用来处理多个变量指针,比如用来保存多个字符串的首地址。在 C 语言中,字符串数组的实现方式往往就是通过一个指向字符的指针数组来实现的。

    代码示例

    int a = 10, b = 20, c = 30;
    int *p[3];
    p[0] = &a;
    p[1] = &b;
    p[2] = &c;
    
    for (int i = 0; i < 3; i++) {
        printf("%d\n", *p[i]);
    }
    

    在上面的代码中,p是一个指针数组,数组的每个元素都是一个指向整数的指针。p[0]指向ap[1]指向bp[2]指向c,通过*p[i]可以访问每个整数的值。
    在这里插入图片描述

2. int (*p)[10]:指向数组的指针

在这里插入图片描述

  • 声明解释int (*p)[10]是一个“指向数组的指针”。

    • p是一个指针,指向一个包含10个int类型元素的数组。
    • 这里的括号改变了优先级,首先将p声明为一个指针,然后说明这个指针指向一个大小为10的int数组。
  • 内存结构:在内存中,p本身是一个指针,它指向某个数组,这个数组包含10个int类型的元素。

  • 应用场景:指向数组的指针通常用于函数参数,特别是当需要传递一个二维数组给函数时,这种方式非常有用。通过指向数组的指针,可以方便地操作整个数组而不是单个元素。

    代码示例

    int arr[10];
    int (*p)[10] = &arr;
    
    for (int i = 0; i < 10; i++) {
        (*p)[i] = i * 10;
    }
    
    for (int i = 0; i < 10; i++) {
        printf("%d\n", (*p)[i]);
    }
    

    在这个代码中,p是一个指向数组的指针,它指向数组arr。通过(*p)[i]可以对数组的元素进行赋值和访问。
    在这里插入图片描述

💯如何区分这两种声明

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
为了方便理解和区分这两种声明,可以遵循以下规则:

  1. 观察括号的位置

    • int *p[10]中,*紧跟在p之后,说明p是一个数组,每个元素是一个指针。
    • int (*p)[10]中,p被括号括起来,意味着p首先是一个指针,然后指向一个数组。
  2. 理解优先级

    • 数组下标符号[]的优先级高于*,所以在int *p[10]中,p首先被解释为一个数组,接着数组的元素类型是int *
    • int (*p)[10]中,通过括号改变了优先级,使得p首先是一个指针,然后该指针指向一个数组。
      在这里插入图片描述

💯小结

  • 在这里插入图片描述
    int *p[10]:这是一个包含10个指向int类型变量的指针数组。可以看作是“存储指针的数组”。它通常用于处理多个指针,比如保存多个变量的地址,或者在程序中实现多个字符串的存储。
  • int (*p)[10]:这是一个指向包含10个int类型元素的数组的指针。可以看作是“指向数组的指针”。它常用于函数参数中,特别是在处理多维数组时,可以更加灵活地操作整个数组。

理解这些不同的声明方式对于掌握 C 语言中的指针和数组概念非常重要,因为它们是 C 语言强大功能的基础,也是写出高效代码的重要工具。希望通过本文的详细讲解,您能更好地掌握指针数组指向数组的指针之间的区别,增强对 C 语言指针和数组复杂组合的理解。

#include <stdio.h> void processPointerArray(int *arr[], int size) { printf("Values from pointer array (int *p[]):\n"); for (int i = 0; i < size; i++) { printf("%d\n", *arr[i]); } } int main() { int a = 1, b = 2, c = 3; int *pArr[3]; pArr[0] = &a; pArr[1] = &b; pArr[2] = &c; processPointerArray(pArr, 3); int arr[10]; for (int i = 0; i < 10; i++) { arr[i] = i * 10; } int (*p)[10] = &arr; printf("\nValues from pointer to array (int (*p)[10]):\n"); for (int i = 0; i < 10; i++) { printf("%d\n", (*p)[i]); } return 0; }

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248717.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 el-table 默认选中 传入的数组

一、效果&#xff1a; 二、官网是VUE2 现更改为Vue3写法 <template><el-table:data"tableData"border striperow-key"id"ref"tableRef":cell-style"{ text-align: center }":header-cell-style"{background: #b7babd…

MT6769/MTK6769核心板规格参数_联发科安卓主板开发板方案

MT6769安卓核心板具有集成的蓝牙、FM、WLAN和GPS模块&#xff0c;是一个高度集成的基带平台&#xff0c;结合了调制解调器和应用处理子系统&#xff0c;以支持LTE/LTE-A和C2K智能手机应用。 该芯片集成了两个工作频率高达2.0GHz的ARMCortex-A75内核、六个工作频率高达1.70GHz的…

在Excel中处理不规范的日期格式数据并判断格式是否正确

有一个Excel表&#xff0c;录入的日期格式很混乱&#xff0c;有些看着差不多&#xff0c;但实际多一个空格少一个字符很难发现&#xff0c;希望的理想格式是 1980-01-01&#xff0c;10位&#xff0c;即&#xff1a;“YYYY-mm-dd”&#xff0c;实际上数据表中这样的格式都有 19…

flask请求头回显的学习和探究如何进行错误页面污染回显

请求头 首先我们要了解一些flask的请求和响应是利用了什么。 flask的请求和响应主要利用了werkzeug&#xff0c;那么我们就要先了解一下什么是werkzeug&#xff0c;其结构又是什么。 werkzeug是一个基于python开发的一个web工具包&#xff0c;其是flask的核心组件之一。其功能…

【Unity踩坑】Unity中父对象是非均匀缩放时出现倾斜或剪切现象

The game object is deformed when the parent object is in non-uniform scaling. 先来看一下现象 有两个Cube, Cube1&#xff08;Scale2,1,1)&#xff0c;Cube2&#xff08;Scale1,1,1&#xff09; 将Cube2拖拽为Cube2的子对象。并且将position设置为&#xff08;-0.6,1,0&a…

uni-app 蓝牙开发

一. 前言 Uni-App 是一个使用 Vue.js 开发&#xff08;所有&#xff09;前端应用的框架&#xff0c;能够编译到 iOS、Android、快应用以及各种小程序等多个平台。因此&#xff0c;如果你需要快速开发一款跨平台的应用&#xff0c;比如在 H5、小程序、iOS、Android 等多个平台上…

解决SSL VPN客户端一直提示无法连接服务器的问题

近期服务器更新VPN后&#xff0c;我的win10电脑一致无法连接到VPN服务器&#xff0c; SSL VPN客户端总是提示无法连接到服务端。网上百度尝试了各种方法后&#xff0c;终于通过以下设置方式解决了问题&#xff1a; 1、首先&#xff0c;在控制面板中打开“网络和共享中心”窗口&…

spring boot框架漏洞复现

spring - java开源框架有五种 Spring MVC、SpringBoot、SpringFramework、SpringSecurity、SpringCloud spring boot版本 版本1: 直接就在根下 / 版本2:根下的必须目录 /actuator/ 端口:9093 spring boot搭建 1:直接下载源码打包 2:运行编译好的jar包:actuator-testb…

大语言模型LLM的微调代码详解

代码的摘要说明 一、整体功能概述 这段 Python 代码主要实现了基于 Hugging Face Transformers 库对预训练语言模型&#xff08;具体为 TAIDE-LX-7B-Chat 模型&#xff09;进行微调&#xff08;Fine-tuning&#xff09;的功能&#xff0c;使其能更好地应用于生成唐诗相关内容的…

华三(HCL)和华为(eNSP)模拟器共存安装手册

接上章叙述,解决同一台PC上同时部署华三(HCL)和华为(eNSP)模拟器。原因就是华三HCL 的老版本如v2及以下使用VirtualBox v5版本,可以直接和eNSP兼容Oracle VirtualBox,而其他版本均使用Oracle VirtualBox v6以上的版本,所以正常安装HCL模拟器无法和ENSP兼容。 环境及组件:…

Android 15 版本更新及功能介绍

Android 15版本时间戳 Android 15,代号Vanilla Ice Cream(香草冰淇淋),是当下 Android 移动操作系统的最新主要版本。 开发者预览阶段:2024年2月,谷歌发布了Android 15的第一个开发者预览版本(DP1),这标志着新系统开发的正式启动。随后,在3月和4月,谷歌又相继推出了D…

【含开题报告+文档+PPT+源码】基于Spring Boot+Vue的在线学习平台的设计与实现

开题报告 随着互联网的普及和技术的快速发展&#xff0c;网络教育逐渐崭露头角&#xff0c;成为现代教育领域的重要组成部分。网络教育以其灵活性、便捷性和资源共享性&#xff0c;吸引了越来越多的学习者。同时&#xff0c;随着学习者需求的多样化&#xff0c;他们对于在线学…

【Flink】快速理解 FlinkCDC 2.0 原理

快速理解 FlinkCDC 2.0 原理 要详细理解 Flink CDC 原理可以看看这篇文章&#xff0c;讲得很详细&#xff1a;深入解析 Flink CDC 增量快照读取机制 (https://juejin.cn/post/7325370003192578075)。 FlnkCDC 2.0&#xff1a; Flink 2.x 引入了增量快照读取机制&#xff0c;…

【前端】JavaScript 中 arguments、类数组与数组的深入解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是 arguments 对象2.1 arguments 的定义2.2 arguments 的特性2.3 使用场景 &#x1f4af;深入了解 arguments 的结构3.1 arguments 的内部结构arguments 的关键属性…

Kubernetes 还是 SpringCloud?

前些年&#xff0c;随着微服务的概念提出以及落地&#xff0c;不断有很多的公司都加入到了这场技术革新中&#xff0c;现在可谓是人人都在做和说微服务。 提到微服务&#xff0c;Java栈内&#xff0c;就不得不提SpringBoot、SpringCloud、Dubbo。 近几年&#xff0c;随着Cloud …

Redis设计与实现 学习笔记 第二十章 Lua脚本

Redis从2.6版本引入对Lua脚本的支持&#xff0c;通过在服务器中嵌入Lua环境&#xff0c;Redis客户端可以使用Lua脚本&#xff0c;直接在服务器端原子地执行多个Redis命令。 其中EVAL命令可以直接对输入的脚本进行求值&#xff1a; 而使用EVALSHA命令则可以根据脚本的SHA1校验…

C# 调用系统级方法复制、移动和删除等操作界面

有时候需要在程序复制、移动、删除文件等操作&#xff0c;虽然实现的方法有很多&#xff0c;但有些时候真的不如系统自带的界面效果来的直接省事。 好了不啰嗦了&#xff0c;直接看代码。这是网上找的&#xff0c;能用&#xff0c;但是有一点bug&#xff0c;有时候第一次复制文…

AI赋能电商:打造高效销售与卓越用户体验的新引擎

在数字经济迅猛发展的今天&#xff0c;电商行业正处于持续演变的关键时期。技术的进步不仅重塑了电商生态的运行方式&#xff0c;也在深刻改变用户的消费习惯。人工智能&#xff08;AI&#xff09;作为现代科技的核心驱动力&#xff0c;为电商平台提供了前所未有的工具和机遇。…

基于机器视觉的表面缺陷检测

基于机器视觉的表面缺陷检测存在的问题与难点 - AVT相机|AVT红外相机|万兆网相机EVT|VIEWORKS线扫相|映美精相机|Specim多光谱相机|Adimec相机|Basler相机|富士能FUJINON镜头|理光RICOH镜头|OPTO远心镜头|SPO远心镜头|Navtar镜头|VST镜头|CCS光源|3D视觉引导机床上下料系统 (完…

Fakelocation Server服务器/专业版 Windows11

前言:需要Windows11系统 Fakelocation开源文件系统需求 Windows11 | Fakelocation | 任务一 打开 PowerShell&#xff08;以管理员身份&#xff09;命令安装 Chocolatey Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProto…