关于数组指针

About array pointer

如何从这个数组指针得到'l'?

char *p[3][2] = {"abc", "defg", "hi", "jklmno", "pqrstuvw", "xyz"};

喜欢

printf("%c\n",*((*p)) + 2);

让我们使用完整的 brace-enclosed 声明来使您的数组初始值设定项更清晰

char *p[3][2] = {{"abc", "defg"}, {"hi", "jklmno"}, {"pqrstuvw", "xyz"}};

现在你可以看到 p[1] 是数组 {"hi", "jklmno"}.
然后你想得到第二个字符串,即 p[1][1] 然后是第三个字符:p[1][1][2].

这是一个 运行 示例:https://ideone.com/Jd9GWI

如果我没理解错的话,您将使用指针从字符串文字 "jklmno" 中输出字母 'l'。

此文字在索引为 1 的行中,在索引为 1 的列中。

因此,要使用下标运算符访问文字,您可以编写表达式 p[1][1],它会生成指向字符串文字第一个字符的指针。现在要获取字符串文字的字符 'l',您可以编写表达式 p[1][1][2].

printf( "%c\n", p[1][1][2] );

现在让我们使用不带下标运算符的指针来做同样的事情。

表达式中使用的数组指示符被转换为指向其第一个元素的指针。

因此在表达式中使用的数组指示符 p 被转换为指向数组第一行的 char * ( * )[2] 类型的指针。

要获取指向数组第二行的指针,您应该编写 p + 1.

要获取行本身,您必须取消引用指针

*( p + 1 )

此表达式的类型为 char *[2]

但同样,由于此表达式是 one-dimensional 数组的指示符,然后在表达式中使用,它被转换为指向其第一个元素的指针,类型为 char **.

要访问指向行中第二个元素的指针,您可以使用指针算法

*( p + 1 ) + 1

要获取指向的元素(字符串文字),您必须取消引用指针

*( *( p + 1 ) + 1 )

此表达式的类型为 char * 并指向字符串文字的第一个字符 "jklmno"

要获得指向字符串文字的第三个字符的指针,您必须使用此表达式

*( *( p + 1 ) + 1 ) + 2

现在您需要取消引用指针以输出指向的字母 'l'

*( *( *( p + 1 ) + 1 ) + 2 )

所以函数调用看起来像

printf( "%c\n", *( *( *( p + 1 ) + 1 ) + 2 ) );

将其与之前显示的函数调用进行比较

printf( "%c\n", p[1][1][2] );

考虑到如果你有一个像

这样的数组
T a[N];

其中 T 是某种类型,然后使用下标运算符访问数组的 i-th 元素,您可以编写表达式 a[i]。在幕后,这个表达式是使用像 *( a + i ) 这样的指针算法计算的。由于加法运算符的交换性质,这个表达式也可以写成 *( i + a ).. 所以使用下标运算符你可以写出等价于表达式 a[i] 的表达式 i[a]

来自 C 标准(6.5.2.1 数组下标)

2 A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).

因此表达式

*( *( *( p + 1 ) + 1 ) + 2 )

可以改写成

*( 2 + *( 1 + *( 1 + p ) ) )

对应喜欢

2[1[1[p]]]

以及函数的调用printf

printf( "%c\n", p[1][1][2] );

也可以像这样重写(虽然你不应该这样做使代码混淆)

printf( "%c\n", 2[1[1[p]]] );

这是一个演示程序。

#include <stdio.h>

int main() 
{
    char *p[3][2] = 
    {
        { "abc", "defg" }, 
        { "hi", "jklmno" },
        { "pqrstuvw", "xyz" }
    };
    
    printf( "%c\n", 2[1[1[p]]] );
}   

它的输出是

l