任何人都可以逐步解释以下代码的工作原理吗?
#include<stdio.h>
main()
{
char s[ ]="Hello";
int i;
for(i=0;s[i];i++)
printf("%c%c%c%c\t",s[i],i[s],*(s+i),*(i+s));
}
我的输出为“HHHH eeee llll llll oooo”,但我无法理解它的工作原理。
答案 0 :(得分:3)
如果你有一个存储像这样的字符串的字符数组
char s[ ]="Hello";
然后例如表达式s[0]
从字符串中产生字符'H'
。
此表达式s[0]
等同于表达式0[s]
,*( s + 0 )
和*( 0 + s )
。
即输出你可以写的字符串的第一个字符
printf( "%c", s[0] );
或
printf( "%c", 0[s] );
或
printf( "%c", *( s + 0 ) );
或
printf( "%c", *( 0 + s ) );
来自你的程序的声明
printf("%c%c%c%c\t",s[i],i[s],*(s+i),*(i+s));
在一个陈述中展示了所有这些可能性。
来自C标准(6.5.2.1数组下标)
2后缀表达式后跟方括号[]中的表达式 是数组对象元素的下标。的的 下标运算符[]的定义是E1 [E2]与...相同 (*((E1)+(E2)))。由于适用于的转换规则 binary +运算符,如果E1是数组对象(等效于指针 到数组对象的初始元素),E2是一个整数, E1 [E2]表示E1的第E2个元素(从零开始计数)。
还要注意报价的这一部分
后缀表达式后跟方括号中的表达式 [] ...
它允许编写像i++[s]
这样的表达式,因为i++
是一个后缀表达式。
考虑以下示范程序
#include <stdio.h>
int main(void)
{
char s[] = "Hello";
int i = 0;
while ( *( s + i ) )
{
printf( "%c", i++[s] );
}
putchar( '\n' );
return 0;
}
它的输出是
Hello
答案 1 :(得分:2)
你有一个字符数组“Hello”。
对于数组中的每个字符,由i指定的索引(直到字符串结尾时字符== 0因此为false)输出由以下内容组成的字符串:
这4个操作都指向内存中的相同字节,因此字符重复4次。这是一个练习,演示了C语言如何直接访问内存以及如何操作指针,指针算法可用于访问数组的内容,相反,数组变量可用于指针算法。