我对如何阅读通用指针语法感到困惑,尤其是当它开始涉及数组,双星号,三星号等时。
例如:
char** a = ...;
*ptr = &a[1];
您将如何阅读?遍历逻辑,ptr
的最终数据类型将是什么?
编辑:这不是功能代码,它更多是为了展示对指针的理解。
答案 0 :(得分:0)
首先,a
的类型为char**
,或“指向字符的指针的指针”。根据您的上下文,在概念上也可以将其视为指向c字符串或c字符串数组的指针。
a[1]
将a
视为一个数组,并获取索引1中的项目(第二个项目,因为第一个为0)。此值的类型为char*
(指向字符或数组的指针),位于a
指向的值之后。
&a[1]
为您提供了对a[1]
的引用。这意味着它将为您提供一个指向包含char**
的内存的指针值(在这种情况下为a[1]
)。
*ptr =
取消引用ptr
位置,并将其设置为表达式右侧的值。由于&a[1]
的类型为char**
,因此*ptr
的类型可能也是 的类型char**
,尽管可能不是(这可能是不希望的)
如果*ptr
的类型为char**
,则ptr
的类型为char***
。根据上下文和您要完成的工作,此代码的语义可能会有所不同,但是我最好的猜测是a
是一个字符串数组,并且ptr
设置为指向数组的第二个元素。请记住,数组的第二个元素是一个指针,ptr
并不指向该指针指向的对象,而是指针本身的实际位置。
下面是带有字符串列表的伪编码说明:
a = ["apple", "pear", "banana"]
运行代码后...
ptr = ["pear", "banana"]
ptr
所指向的对象与a
相同,而它们只是a
列表的“子视图”