【问题标题】:Printing a string in C with pointer arithmetic including arrays, integers and pointers在 C 中使用指针算法打印字符串,包括数组、整数和指针
【发布时间】:2012-02-06 11:02:55
【问题描述】:

共有三种结构;数组ab 和指针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


【解决方案1】:
  • b+(c-*a)-2&b[(c-*a)-2] 相同。换句话说,如果(c-*a)-2 是字符串b 的偏移量,puts(b+(c-*a)-2) 将从(c-*a)-2 偏移量的位置开始打印字符串b
  • c 被赋值为*(a+1),或者*(&(a[1])),或者简单的a[1],它指向"big"
  • 数一下图表上的方块,找出c-*a 的值(它是5)
  • b[5-2]"ing"

免责声明:如果有人试图在我公司签入此类代码,他将不再为我们工作。

【讨论】:

  • +1 表示“我会解释,但请不要这样写”:)
  • 不好意思在这里打标签,但是为什么'b+'编译成'&b[]'
  • @quicksort 数组初始元素&b[0]的地址与指针b的值相同,而指针b+0的值又与b+0相同。根据指针算法的规则,将n 加到b 与从基址b 中取出一个偏移量为n 乘以b 元素大小的值的地址相同,即@987654342 @.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多