在《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]
?
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
这是planets
1)的第一个元素,即指向字符串常量的指针Mercury
。
当您访问0
日这个指针的元素字符串文字,你会得到一封信M
。
其他值i
- 1
,2
...,相同7
。
这意味着,planets[i][0]
将导致第一个字符i
个的字符串planets
数组。
您也可以这样查看:
planets[i][0] -> (*(planets[i] + 0)) -> (*(*(planets + i)+0))
(*(*(planets + i)+0))
将导致字符串的i
第一个字符。
另外,planets
是8
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)。
的类型的planets
是char *[8]
即planets
是阵列8
char *
。当我们在表达式中使用它时,它将转换为char **
。指针的大小可以是4
字节,也可以是字节,或者8
基于基础平台/体系结构的其他值。
假设指针的大小为8
字节(64
位架构),并且planets
数组的基址为100
。
当我们这样做时planets + 1
,该表达式的结果将是数组108
第二个元素的planets
地址,而当我们取消引用该地址时,我们将得到"Venus"
字符串文字指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句