使用指针算法(包括数组、整数和指针)在C中打印字符串

使用指针算法(包括数组、整数和指针)在C中打印字符串,c,arrays,char,pointer-arithmetic,C,Arrays,Char,Pointer Arithmetic,有三种结构;数组a和b和指针c: c --------------------------. | V ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ a --> | a | \0| \0| \0| \0| b | i | g | \0| \0| r | i | d | e | \0|

有三种结构;数组
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
。有人能和蔼可亲地打破它吗?

  • b+(c-*a)-2
    &b[(c-*a)-2]
    相同。换句话说,如果
    (c-*a)-2
    是字符串
    b
    的偏移量,
    将(b+(c-*a)-2)
    (c-*a)-2
    偏移量处的位置开始打印字符串
    b
  • c
    被赋值为
    *(a+1)
    ,或*(&(a[1]),或简称为
    a[1]
    ,它指向
    “大”
  • 数一数图表上的方块,找出
    c-*a
    (它是5)的值
  • b[5-2]
    “ing”

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

c-*a
是指针之间的区别。它在表达式中转换为int(以实现定义的方式)
b+int-2
是基本的指针算法。@pmg我不明白的是它是如何编译的:
char*c=*(a+1)
我认为右侧表达式的类型是
char*
,因此取消引用它将生成
char
,而不是
char*
a
,在该表达式中,衰减为指向其第一个元素的指针(指向
&a[0]
)<代码>(&a[0])+1与
和(a[1])
相同。应用间接运算符将给出一个指向char的指针。然后,该指针被分配到
c
,这是另一个指向char.+1的指针,用于“我会解释它,但请不要这样写”:)很抱歉在这里加上标记,但是为什么“b+”会编译为“&b[]”。数组初始元素
&b[0]
的快速排序地址与指针
b
的值相同,这又与
b+0
相同。根据指针算术的规则,将
n
添加到
b
等同于从基
b
获取偏移量
n
乘以b元素大小的值的地址,即
b[n]