C语言基础知识点(六)二维数组指针和地址

news2024/11/15 7:08:45
#include <stdio.h>

int main()
{
    int a[2][3] = {
        2, 4, 6,
        8, 10, 12};
    printf("a:%p, a+1:%p\n", a, a + 1);                 // 相差3*sizeof(int)=12,二维数组名是一个指向每一行的指针,a:0061FF08, a+1:0061FF14
    printf("&a:%p, &a+1:%p\n", &a, &a + 1);             // 相差6*sizeof(int)=1224,&a:0061FF08, &a+1:0061FF20
    printf("a[0]:%p, a[0]+1:%p\n", a[0], a[0] + 1);     // 相差一个sizeof(int)也就是一个数更多v组元素,a[0]:0061FF08, a[0]+1:0061FF0C
    printf("&a[0]:%p, &a:%p\n", &a[0], &a);             // 结果一样,&a[0]:0061FF08, &a:0061FF08
    printf("&a[0]+1:%p, &a+1:%p\n", &a[0] + 1, &a + 1); //&a[0]跳了12个字节(跳过了一行),而&a跳了24个字节(跳过了整个二维数组)

    printf("*a:%p, *a+1:%p,*(a+1):%p\n", *a, *a + 1, *(a + 1)); /* a:0061FF08, *a+1:0061FF0C,*(a+1):0061FF14
                                                                 *a+1偏移了一个sizeof(int).*(a+1)偏移了一行 */
    printf("**a:%p, **a+1:%p,**(a+1):%p\n", **a, **a + 1, **(a + 1));
    printf("*a[0]:%p, *a[0]+1:%p,*(a[0]+1):%p\n", *a[0], *a[0] + 1, *(a[0] + 1));
    printf("*a[1]:%p, *a[1]+1:%p,*(a[1]+1):%p\n", *a[1], *a[1] + 1, *(a[1] + 1));
}
  1. printf("a:%p, a+1:%p\n", a, a + 1);

    输出结果:a:0061FF08, a+1:0061FF14 解释:a是指向二维数组第一行的指针,a+1是指向二维数组第二行的指针。每行有3个int元素,所以相差3个sizeof(int)字节,即12个字节。

  2. printf("&a:%p, &a+1:%p\n", &a, &a+1);

    输出结果:&a:0061FF08, &a+1:0061FF20 解释:&a是整个二维数组的地址,&a+1是整个二维数组后面的地址。整个二维数组占用了2行3列,总共有6个int元素,所以相差6个sizeof(int)字节,即24个字节。

  3. printf("a[0]:%p, a[0]+1:%p\n", a[0], a[0]+1);

    输出结果:a[0]:0061FF08, a[0]+1:0061FF0C 解释:a[0]是二维数组的第一行,是指向第一个元素的指针。每个元素占用一个sizeof(int)字节,所以相差一个sizeof(int)字节。

  4. printf("&a[0]:%p, &a:%p\n",&a[0], &a);

    输出结果:&a[0]:0061FF08, &a:0061FF08 解释:&a[0]是二维数组的第一行的地址,与&a相同,都是指向二维数组第一行的指针。

  5. printf("&a[0]+1:%p, &a+1:%p\n",&a[0]+1, &a+1);

    输出结果:&a[0]+1:0061FF14, &a+1:0061FF20 解释:&a[0]+1跳过了一行,相当于指向了第二行的地址;&a+1跳过了整个二维数组,指向了整个二维数组后面的地址。

  6. printf("*a:%p, *a+1:%p,*(a+1):%p\n",*a, *a+1,*(a+1));

    输出结果:*a:0061FF08, *a+1:0061FF0C,*(a+1):0061FF14 解释:*a是指向第一行的指针,解引用后得到第一行的第一个元素;*a+1偏移了一个sizeof(int)字节,即指向第一行的第二个元素;*(a+1)是指向第二行的指针,解引用后得到第二行的第一个元素。

  7. printf("**a:%p, **a+1:%p,**(a+1):%p\n",**a, **a+1,**(a+1));

    输出结果:**a:00000002, **a+1:00000003,**(a+1):00000008 解释:**a是指向第一行的指针,解引用两次后得到第一行的第一个元素;**a+1对第一行的第一个元素加1;**(a+1)是指向第二行的指针,解引用两次后得到第二行的第一个元素。

  8. printf("*a[0]:%p, *a[0]+1:%p,*(a[0]+1):%p\n",*a[0], *a[0]+1,*(a[0]+1));

    输出结果:*a[0]:00000002, *a[0]+1:00000003,*(a[0]+1):00000004 解释:*a[0]是第一行的第一个元素,解引用后得到该元素的值;*a[0]+1加上1;*(a[0]+1)是第一行的第二个元素,解引用后得到该元素的值。

  9. printf("*a[1]:%p, *a[1]+1:%p,*(a[1]+1):%p\n",*a[1], *a[1]+1,*(a[1]+1));

    输出结果:*a[1]:00000008, *a[1]+1:00000009,*(a[1]+1):0000000A 解释:*a[1]是第二行的第一个元素,解引用后得到该元素的值;*a[1]+1加上1;*(a[1]+1)是第二行的第二个元素,解引用后得到该元素的值。

涉及到了指针和数组的相关知识点,以下是一些总结:

  1. 指针与地址:指针是存储内存地址的变量,可以通过加/减整数来进行地址运算。&运算符用于获取一个变量的地址。

  2. 数组与指针:数组名可以看作是指向数组第一个元素的指针。对于二维数组,每一行都可以看作是指向该行第一个元素的指针。使用a[i]*(a+i)来访问数组元素。

  3. 指针运算:指针运算的结果取决于指针类型和操作数的类型。对指针进行加/减操作时,会根据指针所指向类型的大小进行相应的偏移。

  4. 解引用操作符:使用*运算符可以解引用指针,获取指针所指向的值。

  5. printf格式化输出:%p用于打印指针地址的值。

二维数组名指向行的,“&二维数组名”就指向了整个二维数组"二维数组名[i]" 是指向i行的首元素的地址·。“&二维数组名[i]”就指向了一行

在C语言中,数组名是一个指向数组第一个元素的指针,即其本身代表了该数组第一个元素的地址。因此,在使用数组名时,可以将其视为指向数组第一个元素的指针,例如a[i]就是指向二维数组第i行第一个元素的指针。

对于二维数组而言,&a[i]表示的是二维数组的第i行的地址,但由于数组名已经代表了该数组第一个元素的地址,所以a[i]&a[i]其实是等价的,它们所代表的值也相同。

*二维数组名[i]就是取出第i行首元素的值,

*二维数组名[i]+1就是对取出第i行首元素的值进行+1,

*(二维数组名[i]+1)就是对取出第i+1行首元素的值进行+1

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

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

相关文章

Redis Part1

单体架构&#xff1a;一台Web服务器、一台数据库服务器。 1.了解NoSql 什么是Nosql&#xff1f; NoSQL&#xff0c;即Not-Only-SQL&#xff0c;意思就是我们干事情不能只用SQL&#xff0c;泛指非关系型的数据库&#xff01;NoSQL定位&#xff1a;作为关系型数据库的补充&am…

信息安全三级概述

信息安全三级概述

C语言之const

C语言之const const修饰全局变量 此时全局变量只能使用但是不能修改&#xff0c; 如果直接拿全局变量修改值&#xff0c;编译直接报错 如果使用全局变量的地址修改值&#xff0c;运行时程序异常结束 const修饰普通局部变量 可以读取变量的值 不能直接通过变量进行修改值&a…

开源库源码分析:Okhttp源码分析(一)

开源库源码分析&#xff1a;OkHttp源码分析 导言 接下来就要开始分析一些常用开源库的源码了&#xff0c;作为最常用的网络请求库&#xff0c;OkHttp以其强大的功能深受Android开发者的喜爱&#xff08;比如说我&#xff09;&#xff0c;还有对该库进行二次封装而成的热门库&a…

为何红黑树在B/B+树之上仍然占据重要地位?

为何红黑树在B/B树之上仍然占据重要地位&#xff1f; 引言二、红黑树和B/B树的基本原理2.1、红黑树的特点和性质2.2、B/B树的特点和性质2.3、红黑树和B/B树的比较 三、B/B树相对于红黑树的优势四、红黑树仍然占据重要地位的原因总结 博主简介 &#x1f4a1;一个热爱分享高性能服…

成都营运《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作

成都营运《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作

【深度学习】 Python 和 NumPy 系列教程(廿七):Matplotlib详解:3、多子图和布局:散点矩阵图(Scatter Matrix Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 3、多子图和布局 1. subplot()函数 2. subplots()函数 3. 散点矩阵图&#xff08;Scatter Matrix Plot&#xff09; 一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于…

2327. 知道秘密的人数;1722. 执行交换操作后的最小汉明距离;2537. 统计好子数组的数目

2327. 知道秘密的人数 核心思想&#xff1a;动态规划&#xff0c;每天的人可以分为三种&#xff0c;可分享秘密的人&#xff0c;不可分享秘密的人&#xff0c;忘记秘密的人。定义f[i]为第i天可分享秘密的人&#xff0c;那么第(idelay ,iforget)天&#xff0c;会增加f[i]个可分…

广州口腔医院种植牙-广东省爱牙工程公益种牙,获湾区群众点赞

广州种植牙价格表-自2017年成立以来,广东省爱牙工程一直坚持以公益惠民为宗旨、公益种牙为服务方向,针对群众普遍存在的口腔健康问题,开展形式多样的公益性口腔医疗惠民活动。 广州种植牙费用表-日前,广东省爱牙工程“种植牙惠民行动”第二十季已正式启动。据广东省爱牙工程官方…

DataGrip 2023 年下载、安装教程、亲测可用

文章目录 前言1. 下载2. 安装3、DataGrip 常用操作4 推荐阅读 前言 DataGrip 是 JetBrains 发布的多引擎数据库环境&#xff0c;支持 MySQL 和 PostgreSQL&#xff0c;Microsoft SQL Server 和 Oracle&#xff0c;Sybase&#xff0c;DB2&#xff0c;SQLite&#xff0c;还有 Hy…

窜货链接的有效治理流程

当商跨区域销售时&#xff0c;但产生了窜货&#xff0c;窜货的根本是因为低价&#xff0c;虽然品牌都会禁止经销商窜货销售&#xff0c;但为了获得更多利润&#xff0c;很多经销商还是会悄悄做着窜货销售的行为&#xff0c;而窜货不仅会破坏渠道的正常发展&#xff0c;同时还会…

第六章 图 十、关键路径

开始顶点&#xff08;源点)&#xff1a; 在AOE网中仅有一个入度为0的顶点&#xff0c;称为开始顶点&#xff08;源点)&#xff0c;它表示整个工程的开始; 结束顶点&#xff08;汇点)&#xff1a; 也仅有一个出度为0的顶点&#xff0c;称为结束顶点&#xff08;汇点)&#xf…

Postman应用——初步了解postman

Postman 是一个用于构建和使用 API 的 API 平台&#xff0c;Postman 简化了 API 生命周期的每个步骤并简化了协作&#xff0c;可以更快地创建更好的 API。 Postman 包含一个基于Node.js的强大的运行时&#xff0c;允许您向请求&#xff08;request&#xff09;和分组&#xff…

redis缓存穿透、击穿、雪崩介绍

缓存穿透 概念 缓存穿透指某一特定时间批量请求打进来并访问了缓存和数据库都没有的key&#xff0c;此时会直接穿透缓存直达数据库&#xff0c;从而造成数据库瞬时压力倍增导致响应速度下降甚至崩溃的风险&#xff1b; 解决方案 一、通过布隆过滤器解决 原理&#xff1a;将…

关于content-type的理解

一.content-type的结论 告诉后端传过去的数据是什么类型的数据 二.没有请求体 (1)没有请求体的情况下content-type没有意义。 (2):图示 里面是没有请求体的 (3)有请求体的情况 二.常见的三种方式 (1)application/x-www-form-urlencoded(默认) 参数的表现形式: 传递之前可以…

ESIM实战文本匹配

引言 今天我们来实现ESIM文本匹配&#xff0c;这是一个典型的交互型文本匹配方式&#xff0c;也是近期第一个测试集准确率超过80%的模型。 我们来看下是如何实现的。 模型架构 我们主要实现左边的ESIM网络。 从下往上看&#xff0c;分别是 输入编码层(Input Ecoding) 对前…

变压器寿命预测(python代码,Logistic Regression模型预测效果一般,可以做对比实验)

1.数据来源官网&#xff1a;Data for: Root cause analysis improved with machine learning for failure analysis in power transformers - Mendeley Data 点Download All 10kb即可下载数据 2.下载下来后是这样 每一列的介绍&#xff1a; Hydrogen 氢气&#xff1b; Oxyge…

低代码开源项目整理

低代码是基于可视化和模型驱动理念&#xff0c;结合云原生与多端体验技术&#xff0c;它能够在多数业务场景下实现大幅度的提效降本&#xff0c;为专业开发者提供了一种全新的高生产力开发范式。下面就来分享几个值得学习和使用的前端低代码开源项目&#xff0c;更深入地了解什…

八股——const 关键字

1.const作用 作用&#xff1a;const用于保护指针指向数据不被修改 测试代码1 显示数组的函数不小心修改了指针指向的值&#xff0c;这时候没有加const关键字&#xff0c;编译器不会报错 #include <stdio.h> void showar(int ar[]);int main(void) {int ar[4]{2,3,4,5…

Docker--未完结

一.Docker是干什么的 在没亲自使用过之前&#xff0c;再多的术语也仅仅是抽象&#xff0c;只有写的人或者使用过的人能看懂。 所以&#xff0c;作为新手来说&#xff0c;只要知道Docker是用于部署项目就够了&#xff0c;下面展示如何用Docker部署项目及Docker常用命令。 二、…