为什么“指向不同数组的指针数组”的表示法与传统2D数组的表示法匹配?

克拉默

在《C程序设计:现代方法》一书中,作者声明并初始化了以下指向不同字符串的指针数组:

char *planets[9] = {"Mercury", "Venus", "Earth",...,"Pluto"};

随后,作者评论:

...访问行星名称中的角色的方式与访问二维数组的元素的方式相同。planets例如,要在数组中搜索以字母M开头的字符串,我们可以使用以下循环:

for (i = 0; i < 9; i++)
  if (planets[i][0] == 'M')
    printf("%s begins with M \n", planets[i]);

我想我对2D(通常是n多维)数组有很好的理解,以及不同的表示法如何使您将表示法视为指针。例如,在名为的3D数组中3D_arr,您可以使用3D_arr[i][j]3D_arr[i]作为不同的“类似指针的”实体来导航矩阵。

但是,归根结底,这个3D数组是一个连续的大块连续内存块。

我对作者用来将指针数组导航到不同数组的说法的困惑是,我看不到与标准2D数组的连接。内存块不再是连续的,对吗?任何解释都将不胜感激。

编辑:符号planets[i]本身是否充当指针名称(然后我们随后对其进行索引)?...因此planets[i]可以认为是某个指针变量(称为alias的别名,我们真的在做什么alias[j]

HS

planets数组的内存视图如下所示:

      planets                           --
           +----+    +-+-+-+-+-+-+-+--+   |
 planets[0]|    |--->|M|e|r|c|u|r|y|\0|   |
           |    |    +-+-+-+-+-+-+-+--+   |
           +----+    +-+-+-+-+-+--+       |
 planets[1]|    |--->|V|e|n|u|s|\0|       |
           |    |    +-+-+-+-+-+--+       |
           +----+    +-+-+-+-+-+--+       |
 planets[2]|    |--->|E|a|r|t|h|\0|        > Null terminated char array (string)
           |    |    +-+-+-+-+-+--+       |
           +----+                         |
             |                            |
             |                            |
             |                            |
           +----+    +-+-+-+-+-+--+       |
 planets[7]|    |--->|P|l|u|t|o|\0|       |
           |    |    +-+-+-+-+-+--+       |
           +----+                       --

是的,你是对的。的数组的内部表示形式char *不同于的2D数组char

下面是关于如何在细节planets[i]planets[i][0]接入作品?

从C Standard#6.5.2.1开始:

下标操作符的定义[]E1[E2]相同(*((E1)+(E2)))

所以这

planets[i]

相当于

(*(planets + i))

如果i是,0那么这将导致

(*(planets + 0)) -> (*(planets)) -> *planets

这是planets1)的第一个元素,即指向字符串常量的指针Mercury

当您访问0这个指针的元素字符串文字,你会得到一封信M

其他值i- 12...,相同7

这意味着,planets[i][0]将导致第一个字符i的字符串planets数组。

您也可以这样查看:

planets[i][0] -> (*(planets[i] + 0)) -> (*(*(planets + i)+0))

(*(*(planets + i)+0))将导致字符串i一个字符

另外,planets8 char指针数组,for循环中,您正在访问它超出其范围的一个元素,该元素的行为未定义:

for (i = 0; i < 9; i++) // the loop will iterate 9 times -> i = 0 to 8
                ^^

循环条件应该是i < 8,这样它会访问planets数组,直到7指数- planets[0]planets[1],..., planets[7]

希望这可以帮助。


1)。

  • 当您访问数组时,它将转换为指向第一个元素的指针(此规则几乎没有例外)。
  • 当您增加一个指针时,它会以该指针可以指向的对象大小的步长递增

的类型的planetschar *[8]planets是阵列8 char *当我们在表达式中使用它时,它将转换为char **指针的大小可以是4字节,也可以是字节,或者8基于基础平台/体系结构的其他值。

假设指针的大小为8字节(64位架构),并且planets数组的基址100

当我们这样做时planets + 1,该表达式的结果将是数组108第二个元素的planets地址,而当我们取消引用该地址时,我们将得到"Venus"字符串文字指针。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

指针表示法与数组表示法

来自分类Dev

C ++指针与数组表示法

来自分类Dev

2D数组(指向指针的指针)

来自分类Dev

为什么要使用数组表示法而不是点表示法检查变量是否存在?

来自分类Dev

为什么在C ++中声明动态2D数组时使用指针指向?

来自分类Dev

C:指向2d数组的指针

来自分类Dev

存储指向2D数组的指针

来自分类Dev

指向2D数组的指针

来自分类Dev

2D数组作为指向char数组的指针

来自分类Dev

对象/数组元素表示法

来自分类Dev

使用数组和指针偏移表示法之间的实际区别

来自分类Dev

指向1D / 2D数组的指针的基本类型是什么,为什么需要双重解引用?

来自分类Dev

使用数组括号的循环与C中的指针表示法之间的区别是什么?

来自分类Dev

在C中交换2d数组(指向指针的指针)

来自分类Dev

2D数组不会衰减到指向指针的指针

来自分类Dev

指向指针(2D数组)的指针作为输入参数

来自分类Dev

如何创建指向2D指针数组的指针-C

来自分类Dev

2D数组不会衰减到指向指针的指针

来自分类Dev

在C中交换2d数组(指向指针的指针)

来自分类Dev

为什么取消对整数数组的指针(在2d数组中)的返回(或衰减到)指向第一个元素的指针?

来自分类Dev

使用指向指向数组的指针的指针打印2D数组

来自分类Dev

main方法中String数组的不同表示法有什么区别?

来自分类Dev

为什么车把使用点括号表示法来按索引访问数组?

来自分类Dev

为什么使用[]表示法将元素输入到静态数组

来自分类Dev

指向C中的2D数组的指针

来自分类Dev

声明指向2D枚举数组的指针

来自分类Dev

指向未知大小的现有2d数组的指针?

来自分类Dev

指向2D数组C,C ++的指针

来自分类Dev

* p的大小,其中p是指向2D数组的指针

Related 相关文章

  1. 1

    指针表示法与数组表示法

  2. 2

    C ++指针与数组表示法

  3. 3

    2D数组(指向指针的指针)

  4. 4

    为什么要使用数组表示法而不是点表示法检查变量是否存在?

  5. 5

    为什么在C ++中声明动态2D数组时使用指针指向?

  6. 6

    C:指向2d数组的指针

  7. 7

    存储指向2D数组的指针

  8. 8

    指向2D数组的指针

  9. 9

    2D数组作为指向char数组的指针

  10. 10

    对象/数组元素表示法

  11. 11

    使用数组和指针偏移表示法之间的实际区别

  12. 12

    指向1D / 2D数组的指针的基本类型是什么,为什么需要双重解引用?

  13. 13

    使用数组括号的循环与C中的指针表示法之间的区别是什么?

  14. 14

    在C中交换2d数组(指向指针的指针)

  15. 15

    2D数组不会衰减到指向指针的指针

  16. 16

    指向指针(2D数组)的指针作为输入参数

  17. 17

    如何创建指向2D指针数组的指针-C

  18. 18

    2D数组不会衰减到指向指针的指针

  19. 19

    在C中交换2d数组(指向指针的指针)

  20. 20

    为什么取消对整数数组的指针(在2d数组中)的返回(或衰减到)指向第一个元素的指针?

  21. 21

    使用指向指向数组的指针的指针打印2D数组

  22. 22

    main方法中String数组的不同表示法有什么区别?

  23. 23

    为什么车把使用点括号表示法来按索引访问数组?

  24. 24

    为什么使用[]表示法将元素输入到静态数组

  25. 25

    指向C中的2D数组的指针

  26. 26

    声明指向2D枚举数组的指针

  27. 27

    指向未知大小的现有2d数组的指针?

  28. 28

    指向2D数组C,C ++的指针

  29. 29

    * p的大小,其中p是指向2D数组的指针

热门标签

归档