c - p 是一个指向结构的指针,所有这些代码片段都做了什么?

标签 c function struct structure function-pointers

++p->i 
p++->i
*p->i
*p->i++
(*p->i)++
*p++->i

我不明白上面的这些语句,我写了一个小测试程序来理解它们。

#include <stdio.h>

struct my_structure {
    int i;
};

void main() {
    struct my_structure variable = {20};
    struct my_structure *p = &variable;

    printf("NAME: %d\n", ++p->i);
    printf("NUMBER: %d\n", p++->i);
    printf("RANK: %d", *p->i++);
    printf("name: %d\n", *p->i++);
    printf("number: %d\n", (*p->i)++);
    printf("rank: %d", *p++->i);
}

这是我注释完最后四个 print 语句后得到的输出:

NAME: 21
NUMBER: 21

取消注释代码并编译后我得到:

test.c: In function 'main':
test.c:14:24: error: invalid type argument of unary '*' (have 'int')
printf("RANK: %d", *p->i++);
                    ^~~~~~~
test.c:15:26: error: invalid type argument of unary '*' (have 'int')
printf("name: %d\n", *p->i++);
                      ^~~~~~~
test.c:16:29: error: invalid type argument of unary '*' (have 'int')
printf("number: %d\n", (*p->i)++);

                         ^~~~~
test.c:17:24: error: invalid type argument of unary '*' (have 'int')
printf("rank: %d", *p++->i);

最佳答案

首先,一些提醒:

p++ 计算出 p 的当前值,并且作为副作用将 1 添加到 p。如果 p 是一个指针,它被设置为指向序列中的下一个对象。

++p 的计算结果为 p + 1 的当前值,并且作为副作用将 1 添加到 p。同样,如果 p 是一个指针,它被设置为指向序列中的下一个对象。

++的后缀形式和->运算符有相同的优先级,并且比+的一元(前缀)形式有更高的优先级+*。因此,像++p->i这样的表达式被解析为++(p->i)p->i++被解析如(p->i)++*p->i被解析为*(p->i)等。

有了这个……

表达式

++p->i

被解析为

++(p->i)

并计算 p->i 的当前值加 1,并且作为 副作用 更新 p->i

表达式

p++->i

被解析为

(p++)->i

并评估当前的 p->i,然后更新 p 以指向序列中的下一个 struct 对象。

表达式

*p->i

被解析为

*(p->i)

因为 -> 的优先级高于一元 *。一元 * 的操作数必须是指针类型,但是 p->i 是一个整数,所以编译器会在这个表达式上 yak。

表达式

*p->i++

被解析为

*((p->i)++)

同样,编译器会对这个表达式大吼大叫,因为 * 的操作数不是指针类型。

表达式

(*p->i)++

被解析为

(*(p->i))++

同样,p->i 没有指针类型,所以编译器会发脾气。

表达式

*p++->i

被解析为

*((p++)->i)

再一次,更多的 yakkage。

关于c - p 是一个指向结构的指针,所有这些代码片段都做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747225/

相关文章:

c - 带有指向它的指针的结构声明

c# - 当声明为函数的返回值时,C# 结构是否曾经装箱?

c - fopen() 在 c 中第二次使用时崩溃

c - 是否有可能在c中这样的结构声明

javascript - React中如何在函数中调用函数(auth、路由)

java - 调用随机函数

c++ - 返回节点指针的函数

c - 使用 system() 命令重命名 C 中的文件的语法错误

c++ - 我无法使用 FindWindowEx() 来查找控件

c++ - 包含的函数隐藏了重载的虚函数