Tag: 解引用

为什么左侧的“取消引用”和“地址”运营商?

在C(以及一些其他类C语言)中,我们有2个一元运算符用于处理指针:解引用运算符( * )和’运算符地址’( & )。 它们是一元运算符,它引入了操作顺序的不确定性,例如: *ptr->field 要么 *arr[id] 操作的顺序由标准严格定义,但从人的角度来看,这是令人困惑的。 如果*运算符是一个正确的一元运算符,则顺序很明显,不需要额外的括号: ptr*->field vs ptr->field* 和 arr*[id] vs arr[id]* 因此,运营商为什么会离开一元而不是正确,这是有充分理由的。 我想到的一件事是类型的声明。 左操作符保持在类型名称附近( char *a vs char a* ),但是有类型声明,已经破坏了这个规则,所以为什么要打扰( char a[num] , char (*a)(char)等) 。 显然,这种方法也有一些问题,比如 val*=2 对于val = val * 2或dereference并指定val* = 2这将是*=短手。 然而,这可以通过在解除引用的情况下在*和=令牌之间需要空白来容易地解决。 再一次,没有任何开创性的,因为有这样一个规则的先例( – -a vs –a )。 那么为什么他们离开而不是正确的运营商呢? 编辑:我想指出,我问了这个问题,因为C的许多更奇怪的方面都有有趣的解释,为什么它们是这样的,就像->运算符或类型声明或索引的存在一样从0开始。依此类推。 原因可能不再有效,但我认为它们仍然很有趣。

取消引用指向不完整类型的指针

我从这段代码中得到以下错误,我是C的新手并且随着我的学习而学习! cc -g -I /usr/lib/i386-linux-gnu -c anld.c anld.c: In function ‘main’: anld.c:379:11: error: dereferencing pointer to incomplete type 主.C文件 bridge_t *bridge_p = bridge_new(); //Create / init our bridge bridge_p->s = server_connect(options.server_p, options.dest_port, options.ifname_p, options.gateway_p); bridge .C文件 struct bridge { int s; }; bridge_t *bridge_new(void) { bridge_t *bridge_p; bridge_p = OPENSSL_malloc(sizeof *bridge_p); if (!bridge_p) { return […]

解除引用的指针构造的地址

在unqlite c库中,我找到了以下代码: pObj = jx9VmReserveMemObj(&(*pVm),&nIdx); 其中pVm是: typedef struct jx9_vm jx9_vm; jx9_vm *pVm 和被调用的函数声明为: jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *); 什么构造&(*pVm)用于调用而不仅仅是pVm ? &(*pVm)相当于pVm吗?