有三种结构;阵列a
和b
和指针c
:使用指针算术(包括数组,整数和指针)打印C中的字符串
c --------------------------.
|
V
___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
a --> | a | \0| \0| \0| \0| b | i | g | \0| \0| r | i | d | e | \0|
´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´
___ ___ ___ ___ ___ ___ ___
b --> | F | l | y | i | n | g | \0|
´´´ ´´´ ´´´ ´´´ ´´´ ´´´ ´´´
这是代码:
int main(){
char a[3][5]={"a", "big", "ride"};
char b[]="Flying";
char *c=*(a+1);
puts(b+(c-*a)-2);
return 0;
}
现在我无法理解的是表达b+(c-*a)-2
。有人可以善待并分解它吗?
'c - * a'是指针之间的差异。它在表达式中被转换(以实现定义的方式)为int。 'b + int - 2'是基本指针算术。 – pmg 2012-01-09 23:09:26
@pmg我不明白的是如何编译:'char * c = *(a + 1);'我认为右侧表达式是'char *'类型,因此解除引用会产生一个'char',而不是'char *'。 – 2012-01-09 23:16:49
'a'本身在该表达式中衰减为指向其第一个元素的指针(到'&a [0]')。 '(&a [0])+ 1'与'&(a [1])'相同。应用间接运算符给出'a [1]':指向char的指针。该指针然后被分配给'c',另一个指向char的指针。 – pmg 2012-01-09 23:20:30