C语言之 指针与多维数组最强解析

news/2025/2/23 15:19:21

假设有以下声明:

int multiArray [4] [2] 				//声明一个int类型的二维数组

数组名multiArray是该数组首元素( multiArray[0] )的地址
在本例中,multiArray的首元素是一个内含两个int值的数组,所以multiArray是这个内含两个int值的数组的地址。如下图所示:
在这里插入图片描述

#include <stdio.h>
int main(void){
    
    int multiArray[4][2] ={{2,4},{6,8},{1,3},{5,7}};
    
    printf(" multiArray=%p, multiArray+1 =%p \n",multiArray,multiArray+1);
    printf(" multiArray[0]=%p, multiArray[0]+1 =%p \n",multiArray[0],multiArray[0]+1);
    printf(" *multiArray=%p, *multiArray+1 =%p \n",*multiArray,*multiArray+1);
    printf(" multiArray[0][0]=%d \n",multiArray[0][0]);
    printf(" *multiArray[0]=%d\n",*multiArray[0]);
    printf(" **multiArray=%d\n",**multiArray);
    printf(" multiArray[2][1]=%d \n",multiArray[2][1]);
    printf(" *(*(multiArray+2)+1)=%d \n",*(*(multiArray+2)+1));
    
    return 0;
    
}

Output:

 multiArray=0x7ffeefbff540, multiArray+1 =0x7ffeefbff548 
 multiArray[0]=0x7ffeefbff540, multiArray[0]+1 =0x7ffeefbff544 
 *multiArray=0x7ffeefbff540, *multiArray+1 =0x7ffeefbff544 
 multiArray[0][0]=2 
 *multiArray[0]=2
 **multiArray=2
 multiArray[2][1]=3 
 *(*(multiArray+2)+1)=3 

下面我们从指针的属性进一步分析。

1.我们发现,multiArray,multiArray[0], *multiArray的值相同,这是为什么呢??

  • 因为multiArray是数组首元素的地址,所以multiArray的值与&multiArray[0]的值相同。而multiArray[0]本身是一个内含两个整数的数组,所以multiArray[0]的值和它的首元素(一个整数)的地址(即&multiArray[0] [0]的值)相同。 multiArray[0]表示的是第一个数组中第一个元素的地址。
  • 简单而言,multiArray[0]本质就是一个占用一个int大小对象的地址,因为multiArray[0]表示的是第一个数组中第一个元素的地址(注意这里是用了一个方括号,与用两个方括号不同!比如multiArray[0][0]表示的是第一个元素的值),而multiArray是一个占用两个int大小对象的地址,因为multiArray是数组首元素(如文章开始的图所示)的地址。
  • 由于multiArray和multiArray[0]的地址都是各自数组首元素的地址,所以multiArray和multiArray[0]的值相同。
  • 我们知道解引用一个指针(在指针前使用*)或者在数组名后使用带下标的[]运算符,得到引用对象代表的值multiArray 代表该数组首元素( multiArray[0] ) 的值,而 multiArray[0] 本身是一个int类型值的地址,所以*multiArray就是表示该数组首元素的地址值。即,与multiArray,multiArray[0]的值同为multiArray[0][0]的地址值。

2.既然,multiArray,multiArray[0], *multiArray的值相同,为什么multiArray+1,multiArray[0]+1,*multiArray+1的值不同呢???

  • multiArray是一个内含2个int类型值的数组的地址,所以multiArray指向一个8字节的数据对象,因此multiArray+1,它所指向的地址加8字节(十六进制中,38+8=40)
  • 而multiArray[0]指向一个4字节的数据对象,multiArray[0]+1,其值加4(十六进制中,38+4得3c)
  • *multiArray指向一个4字节的数据对象,与multiArray[0]同理,其值相同。

3.为什么multiArray[0][0], *multiArray[0],**multiArray的值相等??

  • 因为对二维数组解引用一次,相当于获取到了一维数组的地址,两次解引用才能得到二维数组的值 可以用*,也可以用[]来解引用。所以multiArray[0][0],*multiArray[0],**multiArray的值都为一个具体的int数值

4.*(*(multiArray+2)+1)=3是什么意思??

  • multiArray ⬅️表示二维数组首元素的地址(每个元素都是内含两个int类型元素的一维数组)
  • multiArray+2 ⬅️表示二维数组的第三个元素的地址
  • *(multiArray+2) ⬅️表示二维数组的第三个元素的首元素的地址
  • *(multiArray+2)+1 ⬅️表示二维数组的第三个元素的第二个元素的地址
  • ((multiArray+2)+1)=3 ⬅️表示二维数组的第三个元素的第二个元素的值,即multiArray[3][2]的值

http://www.niftyadmin.cn/n/4479898.html

相关文章

C语言字符串的输出与输入学习笔记

文章目录字符串的输入与输入1.字符串初始化1⃣️&#xff1a;用足够的空间的数组存储字符串&#xff1a;2⃣️&#xff1a;省略数组初始化声明中的大小2.数组与指针1⃣️&#xff1a;指针创建字符串2⃣️&#xff1a;数组与指针的区别3⃣️&#xff1a;使用指针的优缺点3.scanf…

C语言fgets()与fputs()详解

文章目录fgets()与fputs()1⃣️fgets()优缺点&#xff1a;2⃣️fgets()返回值&#xff1a;3⃣️fgets()操作实例&#xff1a;3⃣️fgets()操作进阶&#xff1a;fgets()与fputs() fgets()函数的第二个参数指明了读入字符的最大数量。如果该参数为n&#xff0c;那么fgets函数将读…

深入了解JVM—什么是虚拟机

我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的&#xff0c;而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地&#xff0c;Mac OSX 系统上软件安装包则是 dmg 后缀&#xff0c;同样无法在 Windows 系统上安装。 为什么不同系统上的软件无法安装&#xff0c…

Java问题:”接口内部创建类“与”类内部创建接口“分别有什么用

两种形式&#xff0c;到底各自都有什么用处&#xff1f;&#xff1f; class A {interface B {} }interface C {class D {} } 文章目录一.接口内部创建类1⃣️.用法12⃣️.用法23⃣️.如何创建对象及调用方法二.类内部创建接口一.接口内部创建类 1⃣️.用法1 如果一个类的功能…

Java函数式编程-控制结构更具函数式风格

在看这篇文章前推荐阅读&#xff1a;《Java函数式编程之最细致的lambda表达式讲解》与《Java函数式编程之Java8四大函数接口》 文章目录如何使标准的控制结构更具函数式风格&#xff1f;进阶一&#xff1a;进阶二&#xff1a;如何使标准的控制结构更具函数式风格&#xff1f; …

Haskell--“$“在Haskell中的作用

$是可以代替括号的一种符号 例如&#xff0c;下面的代码 Prelude> take 1 $ filter even [1..10] [2]如果我们去掉$会怎么样呢&#xff1f; Prelude> take 1 filter even [1..10]<interactive>:3:1: error:• Couldnt match expected type ‘(Integer -> B…

Sidecar功能中--如何交换Ipad与Mac的位置

Mac新系统Catalina的正式上线&#xff0c;更强大的生态系统更是吸引眼球&#xff0c;其中的SIdecar随航功能使得iPad与Mac形成更强大的Apple生态链&#xff0c;使得Mac与ipad同时办公效率倍增。 有的小伙伴可能会遇到这样的情况&#xff1a; 想让Mac位于Ipad的右侧&#xff0c…

计算机中 空间局限性(Spatial Locality)与时间局限性(Temporal Locality)

空间和时间局部性描述了程序如何访问数据&#xff08;或指令&#xff09;的两个不同特征。 定义&#xff1a; 如果在时间上被引用的事物在空间上也接近&#xff08;相邻的存储器地址&#xff0c;磁盘上的邻近扇区等&#xff09;&#xff0c;则引用序列被认为具有空间局部性(S…