关于数组指针
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
如何从这个数组指针得到'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