了解结构的新手,特别是涉及访问结构成员的地址或值。
我不确定我在这里使用语言,但我有:
到目前为止,我有......
&(*(b+i))->s = (*(*(a+i)+j)).s * (*(x+k)).s
但是我收到编译错误
error: lvalue required as left operand of assignment
编辑:
我的结构
typedef struct num{
int s;
}num_t;
我的功能参数
void calc(int n, int m, num_t **a, num_t *x, num_t *b)
此外,问题是否正确?
EDIT2:格式
答案 0 :(得分:1)
假设我正确理解了您的问题,问题与运算符优先级有关。如上所述,赋值的左操作数相当于:
&((*(b + i))->s)
换句话说,您尝试为变量的地址赋值,因为->
(指向成员的指针)运算符的优先级高于&
的地址。 )运营商。你想要的是
(&(*(b + i)))->s
但是,这是非常不必要的,因为->
运算符扩展为*
解引用运算符和.
成员运算符,因此您得到
(*(&(*(b + i)))).s
外部*
取消引用和&
引用运算符,在这种情况下,有效地"取消"彼此出局。所以,您可以将其重写为
(*(b + i)).s
最后(并且此规则可以应用于其他两个指针表达式),这基本上是访问一个数组元素,因此将其写为
更清晰b[i].s
所以,你的最终陈述应该是这样的
b[i].s = a[i][j].s * x[k].s;
这更清晰,更有效地表达了语句的意图,这在编程中一直很重要。