9.6 数组的指针和指向数组的指针变量 - 3

news2025/1/14 1:16:20

9.6 数组的指针和指向数组的指针变量 - 3

  • 一.回顾二维数组和多维数组的概念
  • 二.指向多维数组的指针和指针变量探究
    • 1.a:二维数组名,也是整个二维数组的首地址。我们可以认为是第0行的首地址是1000
    • 2.a+1 , a+2 分别代表第一行首地址和第二行首地址。
    • 3.这表示a[0],a[1],a[2]是一维数组名。
      • (1) a[0] == &a[0][0] == 1000 是第0行元素首地址
      • (2) a[1] == &a[1][0] == 1016 是第1行元素首地址
      • (3) a[2] == &a[2][0] == 1032 是第2行元素首地址
    • 4.第0行第1列元素,地址怎么表示
    • 5.int a[5];一些推论
      • (1)a[0] 等价于*a; 都是地址1000,我们注意到a,*a,也是都是1000
      • (2)a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004
      • (3)a[1],等价于*(a+1),等价于1016
      • (4)a[1]+2,等价于*(a+1)+2,等价于 &a[1] [2],等价于1024
    • 6.a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004,这是个地址
      • (1)*(a[0] +1)就代表a[0][1]的值; *(*a+ 1) 也是a[0][1]的值
      • (2)*(a[1] + 2),a[1][2]的值,*(*(a+1)+ 2),都表示第1行第2列元素值
  • 三.指针数组和数组指针
    • 1. 指针数组
    • 2.数组指针
  • 四.多维数组的指针做函数参数
  • 五.整理来源

一.回顾二维数组和多维数组的概念

a[3][4];
在这里插入图片描述
在这里插入图片描述
内存中:
在这里插入图片描述
a[2][3][4];

在这里插入图片描述

二.指向多维数组的指针和指针变量探究

//可以把a看成一个一维数组,这个一维数组有三个元素: a[0] ,a[1], a[2],每个元素又是一个包含4个元素的一维数组。

在这里插入图片描述
在这里插入图片描述

1.a:二维数组名,也是整个二维数组的首地址。我们可以认为是第0行的首地址是1000

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
    int *p;
    p = (int *)a;   //强制转换,p指向数组的首地址


    return;
}

2.a+1 , a+2 分别代表第一行首地址和第二行首地址。

所以a+1跳过16个字节,也就是 a = 1000,a+ 1 = 1016;

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
    int *p;

    p = (int *)(a+1);
    p = (int *)(a+2);
    return;
}

0x0034fc6c a的地址 1000
0x0034fc7c a+1的地址 1016
0x0034fc8c a+2的地址 1032

3.这表示a[0],a[1],a[2]是一维数组名。

C语言规定数组名代表数组的首地址,所以就有如下:

(1) a[0] == &a[0][0] == 1000 是第0行元素首地址

(2) a[1] == &a[1][0] == 1016 是第1行元素首地址

(3) a[2] == &a[2][0] == 1032 是第2行元素首地址

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
    int *p;


    p = a[0];   //地址:0x0042f7cc
    p = a[1];   //地址:0x0042f7dc
    return;
}

4.第0行第1列元素,地址怎么表示

&a[0][1], a[0] + 1; --1004

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
    int *p;

    p = &a[0][1];   //地址:0x000ffb30
    p = a[0] + 1;   //地址:0x000ffb30
    return;
}

5.int a[5];一些推论

(1)a[0] 等价于*a; 都是地址1000,我们注意到a,*a,也是都是1000

(2)a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004

(3)a[1],等价于*(a+1),等价于1016

(4)a[1]+2,等价于*(a+1)+2,等价于 &a[1] [2],等价于1024

注意,不要把*(a+1)+2写成*(a+3),那就变成a[3];

在这里插入图片描述

6.a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004,这是个地址

(1)*(a[0] +1)就代表a[0][1]的值; *(*a+ 1) 也是a[0][1]的值

(2)(a[1] + 2),a[1][2]的值,(*(a+1)+ 2),都表示第1行第2列元素值

a[i]的性质问题:
a[i] 和 &a[i]地址是一样的
实例:

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
        int i,j;
        for(i = 0;i < 3;i++)
        {
            for(j = 0;j < 4;j++)
            {
                a[i][j] = 86;
            }
        }
    int *p;
    p = (int *)(a+1);   //第一行首地址;  //a[1][0]....a[1][3]
    *p = 56;  //a[1][0] = 56
    p++;  //走4个字节   a[1][1]
    *p = 78; //相当于a[1][1] = 78;
    return;
}

三.指针数组和数组指针

1. 指针数组

//首先这是个数组,数组中有10个元素,每个元素都是个指针,所以这相当于定义了10个指针变量,也就是p[0]-p[9];
int *p[10]; //能引用的下标是[0]-[9]

int main()
{
    int a[3][4];    //数组名a 同样代表数组的首地址
        int i,j;
        for(i = 0;i < 3;i++)
        {
            for(j = 0;j < 4;j++)
            {
                a[i][j] = 86;
            }
        }
    int *p[4];   //指针数组,能引用的下标[0]-[3]
    p[0] = &a[0][0];
    p[1] = &a[0][1];
    p[2] = &a[0][2];
    p[3] = &a[0][3];

    for(j = 0;j < 4;j++)
    {
        printf("value = %d\n",*(p[j]));
    }

    return;
}

在这里插入图片描述

2.数组指针

int (*p)[10];是一个指针变量,这个指针变量用来指向含有10个元素的一维数组。

int main()
{
    int (*p)[10];
    int a[10];    //数组名a 同样代表数组的首地址
    int i,j;
    for(i = 0;i < 10;i++)
    {
            a[i] = i;
    }

    p = &a;     //&地址符
    int *q;
    q = (int *)p;
    for(j = 0;j < 10;j++)
    {
        printf("value = %d\n",*q);
        q++;
    }
    return;
}

在这里插入图片描述

int main()
{
    int (*p)[10];
    int a[3][10];    //数组名a 同样代表数组的首地址
    int i,j;
    for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 10;j++)
        {
            a[i][j] = i+j;
        }
    }


    p = a;     //二维数组名可以直接赋值给数组指针
    int *q;
    q = (int *)p;
    for(i = 0;i < 3;i++)
    {
        q = *(p +i);   // 每次指向一个新行
        for(j = 0;j < 10;j++)
        {
            printf("value = %d\n",*q);
            q++;
        }
        printf("--------------\n");
               p++;  //跳40个字节
               q = (int *)p;
    }


    return;
}

在这里插入图片描述

int main()
{
    int (*p)[10];
    int a[3][10];    //数组名a 同样代表数组的首地址
    int i,j;
    for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 10;j++)
        {
            a[i][j] = i+j;
        }
    }


    p = a;     //二维数组名可以直接赋值给数组指针
    int *q;
    q = (int *)p;
    for(i = 0;i < 3;i++)
    {
        for(j = 0;j < 10;j++)
        {
            printf("value = %d\n",*(*(p+i)+j));
        }
        printf("--------------\n");
               p++;  //跳40个字节
               q = (int *)p;
    }


    return;
}

在这里插入图片描述
在这里插入图片描述

四.多维数组的指针做函数参数

五.整理来源

整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记

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

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

相关文章

Mapbox-gl.js v2.13.0 扩展支持4326,4490坐标系

mapbox-gl.js新版本中&#xff0c;支持多种projection 显示效果也不错&#xff0c;根据tiles grid可以看到&#xff0c;还是web_mercator的格网&#xff0c;基于图片做了一定的拉伸形变&#xff0c;想要加载4326的切片格网&#xff0c;依然无法实现。 后来在网上搜索加载4326切…

【JavaWeb】后端(Maven+SpringBoot+HTTP+Tomcat)

目录 一、Maven1.什么是Maven?2.Maven的作用?3.介绍4.安装5.IDEA集成Maven6.IDEA创建Maven项目7.IDEA导入Maven项目8.依赖配置9.依赖传递10.依赖范围11.生命周期 二、SpringBoot1.Spring2.SpringBoot3.SpringBootWeb快速入门 二、HTTP1.HTTP-概述2.HTTP-请求协议3.HTTP-响应协…

【转行互联网】转行互联网必看答疑

课程 追忆寻梦-转行互联网必备知识 https://edu.csdn.net/course/detail/31180 2023年&#xff0c;迟来的编程私教服务 https://bbs.csdn.net/topics/613231237 优先 必读文章 初学者&#xff0c;打算改行学编程&#xff0c;怎么学习java&#xff1f;求指教。https://bb…

如何抓住IT行业最后的红利?网络安全为什么是风口行业?

前言 “没有网络安全就没有国家安全”。当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高&#xff0c;涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…

C语言指针及数组的运行原理

C语言指针及数组的运行原理 文章目录 C语言指针及数组的运行原理一. 指针&#xff08;汇编角度&#xff09;二. 数组&#xff08;汇编角度&#xff09;2.1 数组的定义2.2 指针与数组结合 三. 指令解释参考3.1 nop3.2 leave3.3 ret 这里涉及汇编&#xff0c;虚拟机这边采用的是6…

如何在 Google Cloud 上部署 EMQX 企业版

Google Cloud 的 IoT Core 产品将于 2023 年 8 月 16 日停止服务&#xff0c;随着这一日期的临近&#xff0c;许多用户正在为他们现有的物联网业务寻找新的解决方案&#xff0c;而 EMQX 企业版是实现这一目标的理想选择。 EMQX 企业版是一款大规模分布式 MQTT 消息服务平台&am…

【设计模式】深入浅出--外观模式

文章目录 前言一、外观模式介绍二、案例场景三、外观模式优缺点四、外观模式应用场景总结 前言 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别&#xff0c;如果是自己泡茶需要自行准备茶叶、茶具和开水&#xff0c;而去茶馆喝茶&#xff0c;最简单的方式就是跟茶馆服务员…

高效的配置文件读取工具支持properties和yaml

JefConfig 前言 日常工作中不知道到大家有没有遇到以下几种情况&#xff1a; 1、在程序启动时需要加载配置文件&#xff0c;但是发现程序只能从固定位置读取配置文件。 2、程序在集成了spring框架后&#xff0c;想从配置文件中获取某个配置&#xff0c;但是发现当前程序并未交…

并查集原理及代码实现

并查集 首先要明确的是并查集是森林。由多棵树组成。 并查集 &#xff08;英文&#xff1a;Disjoint-set data structure&#xff0c;直译为不交集数据结构&#xff09;&#xff0c;用于处理一些 不交集 &#xff08;Disjoint sets&#xff0c;一系列没有重复元素的集合&…

android framework-SystemServer进程

SystemServer进程信息 一、SystemServer整体时序图 涉及源码路径&#xff1a; android-10.0.0_r41\frameworks\base\core\java\com\android\internal\os\ZygoteInit.java android-10.0.0_r41\frameworks\base\core\java\com\android\internal\os\Zygote.java android-10.0.0_r4…

JAVAWeb07-WEB 开发通信协议-HTTP 协议-关联篇

1. 概述 1.1 官方文档及示例说明 1.1.1 请求头 1.1.2 响应头 1.1.3 HTTP 响应状态码 HTTP状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含HTTP状态码的信息头&a…

leetcode 1372. Longest ZigZag Path in a Binary Tree(二叉树中最长的之字形路径)

找出最长的之字型路径长度。 可以选择从二叉树的任意一个节点出发。 路径长度为路径中的节点数-1. 思路&#xff1a; 符合DFS的特征。 方向是左右交替的&#xff0c;可以定义0&#xff0c;1两个方向。 如果当前方向是左&#xff0c;下一方向就是右&#xff0c;反之亦然。每次…

FinClip|小程序云开发的那点事儿

在开发一个小程序时&#xff0c;除了考虑界面功能逻辑外&#xff0c;还需要后端的数据支持&#xff0c;开发者需要提前考虑服务器、存储和数据库等相关需求的支持能力&#xff0c;此外还可能需要花费时间精力在部署应用、和依赖服务的建设上。 因此&#xff0c;微信小程序为了…

dolphinscheduler3.1.3版本代码编译运行方法

说明 该文档适用于dolphinscheduler 3.1.3-release版本。 一 环境准备 需要使用的环境包括JDK1.8&#xff0c;以及Maven 3.6以上的版本&#xff0c;这里使用低于3.6版本的Maven也可以调试运行&#xff0c;不过在打包的时候会有报错&#xff0c;最好使用高版本的maven。 二 …

数字IC笔试面试常考问题及答案汇总(内含各岗位大厂题目)

经历了无数的笔试面试之后&#xff0c;不知道大家有没有发现数字IC的笔试面试还是有很多共通之处和规律可循的。所以一定要掌握笔试面试常考的问题。 数字IC笔试面试常考问题及答案汇总&#xff08;文末可领全部哦~&#xff09; 验证方向&#xff08;部分题目&#xff09; Q1…

android studio APP工程的项目结构说明及创建

目录 1.APP工程的项目结构图 2.功能说明 2.1app 2.2Gradle Scripts 3.创建新的APP页面 补充&#xff1a; 1.APP工程的项目结构图 2.功能说明 该项目下两个分类&#xff1a;一个是app&#xff08;代表app模块&#xff09;;另一个是Gradle Scripts。 2.1app app下面有3个…

虚拟机安装Centos7,ping不通百度

虚拟机安装Centos7&#xff0c;ping不通百度 一、虚拟机网络配置 网络适配器选择桥接模式&#xff0c;不勾选复制物理网络连接状态。 同时虚拟机使用默认配置都是桥接。 二、配置静态IP 1、首先&#xff0c;查看宿主机的IP和网关 2、配置静态ip的文件地址及修改命令如下&…

mybatis分页插件的基本理解和使用

mybatis分页插件的基本理解和使用 为什么要使用mybatis分页插件&#xff1f; 分页是一种将所有数据分段展示给用户的技术。用户每次看到的不是全部数据&#xff0c;而是其中一部分&#xff0c;如果在其中没有找到自己想要的内容&#xff0c;用户可以通过制定页码或者是翻页的…

就业并想要长期发展选数字后端还是ic验证?

“就业并想要长期发展选数字后端还是ic验证&#xff1f;” 这是知乎上的一个热点问题&#xff0c;浏览量达到了13,183。看来有不少同学对这个问题感到疑惑。之前更新了数字后端&数字验证的诸多文章&#xff0c;从学习到职业发展&#xff0c;都写过&#xff0c;唯一没有做过…

CRM系统能帮助企业解决哪些问题?

随着信息化技术的不断发展和全球化的推进&#xff0c;市场竞争越来越激烈&#xff0c;客户需求也在不断变化。为了应对这种情况&#xff0c;越来越多的企业开始使用CRM系统来管理与客户的关系。那么&#xff0c;CRM系统到底解决了企业哪些问题呢&#xff1f; 一、提高客户满意…