2012-01-09 57 views
4

有三种结构;阵列ab和指针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。有人可以善待并分解它吗?

+0

'c - * a'是指针之间的差异。它在表达式中被转换(以实现定义的方式)为int。 'b + int - 2'是基本指针算术。 – pmg 2012-01-09 23:09:26

+0

@pmg我不明白的是如何编译:'char * c = *(a + 1);'我认为右侧表达式是'char *'类型,因此解除引用会产生一个'char',而不是'char *'。 – 2012-01-09 23:16:49

+0

'a'本身在该表达式中衰减为指向其第一个元素的指针(到'&a [0]')。 '(&a [0])+ 1'与'&(a [1])'相同。应用间接运算符给出'a [1]':指向char的指针。该指针然后被分配给'c',另一个指向char的指针。 – pmg 2012-01-09 23:20:30

回答

8
  • b+(c-*a)-2&b[(c-*a)-2]相同。换句话说,如果(c-*a)-2是字符串b的偏移量,则puts(b+(c-*a)-2)将从(c-*a)-2偏移量处的位置开始打印字符串b
  • c分配*(a+1),或*(&(一个[1])),或简单地a[1],它指向"big"
  • 计数您的图上的平方找到c-*a的值(其为5)
  • b[5-2]"ing"

免责声明:如果任何人试图在我的公司在这样的代码来检查,他将不再为我们工作。

+0

+1为“我会解释它,但请不要这样写”:) – 2012-01-09 23:34:40

+1

抱歉在此处标记,但为什么'b +'编译为'&b []' – quicksort 2012-01-09 23:42:24

+0

@quicksort数组初始元素的地址'&b [0]'与指针'b'的值相同,而'b'又与'b + 0'相同。根据指针运算的规则,将'n'加到'b'与将'n'偏移量处的值的地址乘以b的基本元素'b'的大小相同,即'b' [N]'。 – dasblinkenlight 2012-01-10 00:55:46