通过 指针 引用 多维数组 详解

简介: 一:回顾多维数组地址知识二:二维数组的有关指针三:指向数组元素的指针变量四:用指向数组的指针作为函数参数

目录


一:回顾多维数组地址知识


二:二维数组的有关指针


三:指向数组元素的指针变量


四:用指向数组的指针作为函数参数


首先简单来讲,指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。下面将进行详细介绍。


一:回顾多维数组地址知识

(以二维数组为例)


int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};

1.1


a是数组名,a数组包括3行3列,可以理解为有三个行元素,而且每个行元素又是一个一维数组,其实数组在内存中真实存在的状态是连续的,并不分行列,但为了我们更好的理解,才想象成了有行有列的。即二维数组是由一维数组组成的,如 a数组是由3个一维数组组成的。


 1.2


还是以上面为例,a代表二维数组首元素地址(首行)起始地址,那么 a+1代表什么呢?


a+1 其实代表第二行首元素地址,也就是a[1] 的地址。这里的加一是表示越过这一行的地址。如果说 a 的地址为1000,则 a+1 的地址为1000+4*3=1012 (第0行有3个整形数据)。


  以此类推:a+2 也就是a[2] 的地址也就是1000+4*6=1024


那么第0行第1列的元素地址如何来表示呢?


因为从上可得知,a[0]是一维数组名,所以一维数组名+1不就是该一维数组中第一个元素么。这里的加一是表示越过这一个数据的地址,写为a[0]+1 地址值也就是 1000+4=1004 (1个整形据)。


 以此类推:a[0]+0 , a[0]+1 , a[0]+2 等就代表着 a[0][0] , a[0][1] , a[0][2] 的元素地址。


二:二维数组的有关指针

如下表所示:


表示形式 含义 值

a 二维数组名,即首元素地址(0行起始地址) 2000

a[0]


*(a+0)


*a


第0行第0列元素地址 2000

a+1


&a[1]


第1行元素起始地址 2012

a[1]


*(a+1)


第1行第0列元素a[1][0]地址 2012

a[1]+2


*(a+1)+2


&a[1][2]


第1行第2列元素a[1][2]地址 2020

*(a[1]+2)


*(*(a+1)+2)


a[1][2]


第1行第2列元素a[1][2]值 元素值

总结:记住最重要的一点 a[i] 与 *(a+i)是一样的。


三:指向数组元素的指针变量

如:


#include <stdio.h>

int main()

{

int a[3][3] = { 1,2,3,4,5,6,7,8,9 };

int* p;

p = a[0];

for (p; p < a[0] + 9; p++)

{

 printf("%5d", *p);

 if( p[0] % 3 == 0)

  printf("\n");

}

return 0;

}


结果:


   1    2    3

   4    5    6

   7    8    9

D:\VS\Project4\x64\Debug\Project4.exe (进程 1240)已退出,代码为 0。

按任意键关闭此窗口. . .

分析:


p是一个指针变量,类型为 int * 型,其可以指向一般的整型变量,也可以指向整形的数组元素。


通过指针的方式将二维数组的值来依次输出。(用指向元素的指针变量输出二维数组各元素值)。


四:用指向数组的指针作为函数参数

作用:用指针变量作形参,用来接受实参数组名传递来的地址。


 如:


#include <stdio.h>

void test(int* p)

{

int* a = p;

for (p; p < a+ 9; p++)

{

 printf("%5d", *p);

 if (p[0] % 3 == 0)

  printf("\n");

}

}

int main()

{

int a[3][3] = { 1,2,3,4,5,6,7,8,9 };

int* p;

p = a[0];

test(p);

return 0;

}


结果:


   1    2    3

   4    5    6

   7    8    9

D:\VS\Project4\x64\Debug\Project4.exe (进程 13920)已退出,代码为 0。

按任意键关闭此窗口. . .

分析:当p作为实参进行传递时,一定要保证形参的类型与实参类型一致。


用此种方法一样可以打印出来。(指向指针变量的指针变量)诠释了指向数组的指针作为函数参数。




目录
相关文章
|
8月前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
106 1
|
9月前
|
算法 C语言
通过指针引用数组
通过指针引用数组
70 1
|
7月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
47 3
|
8月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
78 5
|
8月前
|
存储 安全 编译器
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
C++进阶之路:何为引用、内联函数、auto与指针空值nullptr关键字
61 2
|
8月前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
9月前
|
C语言
在引用数组元素时指针的运算
在引用数组元素时指针的运算
65 0
|
9月前
|
C语言
通过指针引用数组元素
通过指针引用数组元素
56 0
|
9月前
|
C语言
通过指针引用多维数组
通过指针引用多维数组
34 0