【发布时间】:2012-02-06 11:02:55
【问题描述】:
共有三种结构;数组a 和b 和指针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 我不明白这是怎么编译的:
char *c=*(a+1);我认为右侧表达式的类型是char*,因此取消引用会产生char,不是char*。 -
a本身,在该表达式中,衰减为指向其第一个元素的指针(指向&a[0])。(&a[0]) + 1与&(a[1])相同。应用间接运算符给a[1]: 一个指向char 的指针。然后将该指针分配给c,另一个指向 char 的指针。
标签: c arrays char pointer-arithmetic