void main(){
char a[2][30]={"Don't walk in front of me..", "I am not follow"};
printf("%c%c", *(a[0]+9), *(*(a+0)+5));
}
程序的输出是
k
答案 0 :(得分:3)
一些基于示例的说明...
c数组可以通过两种方式访问:
作为数组:
char a[10] = "0123456789";
printf("%c", a[5]); // prints "5"
作为指针:
char a[10] = "0123456789";
printf("%c", *(a + 5)); // prints "5"
在第二个示例中,我们只引用a
作为指向字符串加5开头的指针。
这也可以用于2d,3d等数组:
char a[2][10] = {"012", "abc"};
printf("%c", *(*(a + 0)+1)); // prints "1"
printf("%c", *(*(a + 1)+1)); // prints "b"
您可以混合使用两种方法:
printf("%c", *(a[0] + 1); // prints "1"
printf("%c", *(a + 1)[1]; // prints "b"
仅出于完整性考虑(可以将其视为访问数组值的“常规”方式):
printf("%c", a[0][1]; // prints "1"
printf("%c", a[1][1]; // prints "b"
答案 1 :(得分:2)
输出不是k
而是k[WHITESPACE]
。
在C语言中,所有变量都是数字。指针也是如此。
%c
*(a[0] + 9)
a[0]
是一个指针,因此对应于第a[0]
个存储字节的数字。如果将其添加9,则会再增加9个字节。
a[0]
指向"Don't walk in front of me"
的第一个字符:D
然后,如果您在a[0]
上加上9,则会获得字符串中第十个字符的地址:k
*()
表示您不想要a[0] + 9
的值(0x hexNumber ),而是值由寻址的{{1 }}:k(107)
a[0] + 9
%c
*(*(a+0)+5))
是*(a + 0)
所指向的值:a + 0
a[0]
:我真的应该重新解释一下吗?希望这能回答您的问题!
答案 2 :(得分:0)
char a[2][30]
这告诉程序在堆栈上制作2x30个字符的2D数组。它只是一个连续的60 chars
块,但是允许程序使用a [2] [3]这样的符号时知道您要访问的正确位置。
{"Don't walk in front of me..", "I am not follow"};
这是所谓的“用于字符和宽字符数组的字符串文字初始值设定项”。数组将填充这些字符串文字的内容(末尾包含'\0'
)。请注意,这不会填满所有60个字符,空终止符之后的其余字符也将填满'\0'
。
printf("%c%c",
这将打印在调用的以下参数中指定的两个字符。
*(a[0]+9)
这将获取第一个字符串的地址,将9
添加到其中,从而获取k
中walk
的地址。然后将其取消引用,从而得出char k
。
*(*(a+0)+5));
这做的事情非常相似,只是写成a[0]
而不是*(a+0)
。您只需要添加9
而不是5
,而不是'k'
就可以得到' '
(单词Don't
和{{ 1}})。
这就是打印walk
的方式(这是"k "
和一个空格,而不仅仅是k
。)
答案 3 :(得分:0)
您可以这样编写char
数组a
:
char a[2][30]={{"Don't walk in front of me.."}, //a[0][30]
// 0123456789 - *(a[0]+9) is a[0][9] is `k`
// 012345 - *(*(a+0)+5) is is a[0][5] is ' '
{"I am not follow"}}; //a[1][30]
因此,输出将为k
,后跟空格。您可能看不到控制台上的空间。