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


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 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; }

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网安瞭望台第4期:nuclei最新poc分享

国内外要闻 多款 D-Link 停产路由器漏洞&#xff1a;攻击者可远程执行代码 近日&#xff0c;知名网络硬件制造商 D-Link 发布重要安全公告。由于存在严重的远程代码执行&#xff08;RCE&#xff09;漏洞&#xff0c;其敦促用户淘汰并更换多款已停产的 VPN 路由器型号。 此次…

【前端】JavaScript中的隐式声明及其不良影响分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是隐式声明&#xff1f;&#x1f4af;隐式声明的常见情景1. 赋值给未声明的变量2. 非严格模式下的隐式声明3. 函数中的变量漏掉声明4. for 循环中的隐式声明5. 使用…

【VRChat 改模】开发环境搭建:VCC、VRChat SDK、Unity 等环境配置

一、配置 Unity 相关 1.下载 UnityHub 下载地址&#xff1a;https://unity.com/download 安装打开后如图所示&#xff1a; 2.下载 VRChat 官方推荐版本的 Unity 跳转界面&#xff08;VRChat 官方推荐页面&#xff09;&#xff1a;https://creators.vrchat.com/sdk/upgrade/…

uniapp学习(010-3 实现H5和安卓打包上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第114p-116p的内容 文章目录 H5配置文件设置开始打包上传代码 安卓设置模拟器启动设置基础配置设置图标启动界面…

基于SpringBoot共享汽车管理系统【附源码】

基于SpringBoot共享汽车管理系统 效果如下&#xff1a; 系统注册页面 系统登陆页面 系统管理员主页面 用户信息管理页面 汽车投放管理页面 使用订单页面 汽车归还管理页面 研究背景 随着计算机技术和计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所。二十…

uniapp运行时,同步资源失败,未得到同步资源的授权,请停止运行后重新运行,并注意手机上的授权提示。

遇到自定义基座调试时安装无效或无反应&#xff1f;本文教你用 ADB 工具快速解决&#xff1a;打开 USB 调试&#xff0c;连接设备&#xff0c;找到应用包名&#xff0c;一键卸载问题包&#xff0c;清理干净后重新运行调试基座&#xff0c;轻松搞定&#xff01; 问题场景&#…

反向代理模块开发

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

AI助力PPT创作:从手动到智能,打造高效演示

在今天这个信息化时代&#xff0c;演示文稿已经成为我们表达观点、传递信息的重要工具。不论是企业汇报、学术交流&#xff0c;还是个人创作&#xff0c;PPT&#xff08;PowerPoint&#xff09;都在日常生活中扮演着不可或缺的角色。创建一份高质量的PPT往往需要花费大量时间与…

金融租赁系统助力企业升级与风险管理的新篇章

内容概要 在当今的商业环境中&#xff0c;“金融租赁系统”可谓是企业成功的秘密武器。简单来说&#xff0c;这个系统就像一位聪明的财务顾问&#xff0c;帮助企业在资金和资源的运用上达到最优化。从设备采购到项目融资&#xff0c;它提供了一种灵活的方式&#xff0c;让企业…

九、Ubuntu Linux操作系统

一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统&#xff0c;于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助其官方网站:http…

戴尔电脑安装centos7系统遇到的问题

1&#xff0c;找不到启动盘&#xff08;Operation System Loader signature found in SecureBoot exclusion database(‘dbx’).All bootable devices failed secure Boot Verification&#xff09; 关闭 Secure Boot&#xff08;推荐&#xff09;&#xff1a; 进入 BIOS/UEFI…

spring +fastjson 的 rce

前言 众所周知&#xff0c;spring 下是不可以上传 jsp 的木马来 rce 的&#xff0c;一般都是控制加载 class 或者 jar 包来 rce 的&#xff0c;我们的 fastjson 的高版本正好可以完成这些&#xff0c;这里来简单分析一手 环境搭建 <dependency><groupId>org.spr…

导入100道注会cpa题的方法,导入试题,自己刷题

一、问题描述 复习备考的小伙伴们&#xff0c;往往希望能够利用零碎的时间和手上的试题&#xff0c;来复习和备考 用一个能够导入自己试题的刷题工具&#xff0c;既能加强练习又能利用好零碎时间&#xff0c;是一个不错的解决方案 目前市面上刷题工具存下这些问题 1、要收费…

Java安全—JNDI注入RMI服务LDAP服务JDK绕过

前言 上次讲到JNDI注入这个玩意&#xff0c;但是没有细讲&#xff0c;现在就给它详细地讲个明白。 JNDI注入 那什么是JNDI注入呢&#xff0c;JNDI全称为 Java Naming and Directory Interface&#xff08;Java命名和目录接口&#xff09;&#xff0c;是一组应用程序接口&…

vue2:Cascader 级联选择器的两种数据初始化方式

背景 项目中有时需要使用级联选择器,供用户从多层数据中逐级选择。官网中的示例都使用的静态数据,但是实际应用中,大部分情况是需要从后台动态获取业务数据的。所以,今天记录一下从后台获取数据进行初始化的两种方式:懒加载模式和全部加载模式及其优缺点。 懒加载模式的实…

【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java技术深度剖析&#xff1a;从分库分表到微服务的核心问题解析 摘要&#xff1a; 本…

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…

深入FastAPI:表单和文件上传详解

引言 大家好&#xff0c;我是GISerLiu &#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年11月学习赛的FastAPI学习总结文档&#xff1b;在实际开发中&#xff0c;我们经常需要处理表单数据和文件上传。本文将深入探讨如何在 FastAPI 中…

学习HTML第三十三天

学习文章目录 一.fieldset 与 legend 的使用&#xff08;了解&#xff09;二.表单总结三.框架标签 一.fieldset 与 legend 的使用&#xff08;了解&#xff09; fieldset 可以为表单控件分组、 legend 标签是分组的标题 二.表单总结 form表单&#xff1a; action 属性&#…

使用NAS开启无纸化办公,Docker部署开源文档管理系统『Paperless-ngx』

使用NAS开启无纸化办公&#xff0c;Docker部署开源文档管理系统『Paperless-ngx』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 对于文案类的办公场景来说&#xff0c;手头堆放最多的可能就是各种文档文件&#xff0c;以及各种用过的打印废纸。 这么多年来&#xff0c;不管是领…