指针和多维数组

简介: 指针和多维数组

指针和多维数组

指针和多维数组有什么关系?为什么要了解它们的关系?处理多维数组的函数要用到指针,所以在使用这种函数之前,先要更深入地学习指针。至于第 1 个问题,我们通过几个示例来回答。为简化讨论,我们使用较小的数组。假设有下面的声明:

int zippo[4][2]; /* 内含int数组的数组 */

然后数组名zippo是该数组首元素的地址。在本例中,zippo的首元素是一个内含两个int值的数组,所以zippo是这个内含两个int值的数组的地址。下面,我们从指针的属性进一步分析。

因为zippo是数组首元素的地址,所以zippo的值和&zippo[0]的值相同。而zippo[0]本身是一个内含两个整数的数组,所以zippo[0]的值和它首元素(一个整数)的地址(即&zippo[0][0]的值)相同。简而言之,zippo[0]是一个占用一个int大小对象的地址,而zippo是一个占用两个int大小对象的地址。由于这个整数和内含两个整数的数组都开始于同一个地址,所以zippo和zippo[0]的值相同。给指针或地址加1,其值会增加对应类型大小的数值。在这方面,zippo和zippo[0]不同,因为zippo指向的对象占用了两个int大小,而zippo[0]指向的对象只占用一个int大小。因此, zippo + 1和zippo[0] + 1的值不同。

引用一个指针(在指针前使用*运算符)或在数组名后使用带下标的[]运算符,得到引用对象代表的值。因为zippo[0]是该数组首元素(zippo[0][0])的地址,所以*(zippo[0])表示储存在zippo[0][0]上的值(即一个int类型的值)。与此类似,*zippo代表该数组首元素(zippo[0])的值,但zippo[0]本身是一个int类型值的地址。该值的地址是&zippo[0][0],所以*zippo就是&zippo[0][0]。对两个表达式应用解引用运算符表明,**zippo与*&zippo[0][0]等价,这相当于zippo[0][0],即一个int类型的值。简而言之,zippo是地址的地址,必须解引用两次才能获得原始值。地址的地址或指针的指针是就是双重间接(double indirection)的例子。

显然,增加数组维数会增加指针的复杂度。现在,大部分初学者都开始意识到指针为什么是 C 语言中最难的部分。认真思考上述内容,看看是否能用所学的知识解释下面程序清单中的程序。该程序显示了一些地址值和数组的内容。

 

#include <stdio.h>
功能:zippo的相关信息 
int main(void)
{
  int zippo[4][2] = { { 2, 4 }, { 6, 8 }, { 1, 3 },{ 5, 7 } };
  printf("zippo = %p,  zippo + 1 = %p\n", zippo, zippo+ 1);
  printf("zippo[0] = %p, zippo[0] + 1 = %p\n", zippo[0],zippo[0] + 1);
  printf("*zippo = %p, *zippo + 1 = %p\n", *zippo, *zippo + 1);
  printf("zippo[0][0] = %d\n", zippo[0][0]);
  printf("*zippo[0] = %d\n", *zippo[0]);
  printf("**zippo = %d\n", **zippo);
  printf("zippo[2][1] = %d\n", zippo[2][1]);
  printf("*(*(zippo+2) + 1) = %d\n", *(*(zippo + 2) + 1));
  return 0;
}
相关文章
|
2月前
|
存储 算法 C语言
通过指针引用多维数组
通过指针引用多维数组
11 0
|
5月前
|
存储 编译器 C语言
C语言进阶教程(多维指针和多维数组)
C语言进阶教程(多维指针和多维数组)
44 0
|
5月前
|
BI
多维数组元素的指针访问方式
以二维数组为例介绍多维数组的指针访问方式。
27 0
|
6月前
|
人工智能 编译器 测试技术
一次性搞清数组指针、指针数组---从多维数组的本质上刨析(让你顿悟版)
一次性搞清数组指针、指针数组---从多维数组的本质上刨析(让你顿悟版)
16 0
|
12月前
指针和多维数组的关系(C Primer Plus第六版)
指针和多维数组的关系(C Primer Plus第六版)
39 0
|
人工智能 C++
通过 指针 引用 多维数组 详解
一:回顾多维数组地址知识 二:二维数组的有关指针 三:指向数组元素的指针变量 四:用指向数组的指针作为函数参数
96 0
|
存储 C语言 C++
C多级指针与多维数组
C多级指针与多维数组
25179 2
C多级指针与多维数组
|
C语言
【C 语言】数组 ( 多维数组做函数形参退化为指针过程 | int array[2][3] -> int array[][3] -> int (*array)[3] )
【C 语言】数组 ( 多维数组做函数形参退化为指针过程 | int array[2][3] -> int array[][3] -> int (*array)[3] )
139 0
【C 语言】数组 ( 多维数组做函数形参退化为指针过程 | int array[2][3] -> int array[][3] -> int (*array)[3] )
|
C语言
【嵌入式开发】C语言 指针数组 多维数组(二)
【嵌入式开发】C语言 指针数组 多维数组(二)
63 0
|
存储 C语言
【嵌入式开发】C语言 指针数组 多维数组(一)
【嵌入式开发】C语言 指针数组 多维数组(一)
75 0
【嵌入式开发】C语言 指针数组 多维数组(一)