标签: dereference

499
推荐指数
5
解决办法
53万
查看次数

为什么C中的箭头( - >)运算符存在?

dot(.)运算符用于访问结构的成员,而->C中的箭头运算符()用于访问由有问题的指针引用的结构的成员.

指针本身没有任何可以使用点运算符访问的成员(它实际上只是一个描述虚拟内存中位置的数字,因此它没有任何成员).因此,如果我们只是将点运算符定义为在指针上使用指针(编译时afaik编译器已知的信息)时自动取消引用指针,则不会产生歧义.

那么为什么语言创建者决定通过添加这个看似不必要的运算符来使事情变得更复杂?什么是重大的设计决定?

c pointers dereference

253
推荐指数
3
解决办法
14万
查看次数

什么是Rust的确切自动解除引用规则?

我正在学习/试验Rust,在我用这种语言找到的所有优雅中,有一个让我感到困惑并且看起来完全不合适的特点.

在进行方法调用时,Rust会自动取消引用指针.我做了一些测试来确定确切的行为:

struct X { val: i32 }
impl std::ops::Deref for X {
    type Target = i32;
    fn deref(&self) -> &i32 { &self.val }
}

trait M { fn m(self); }
impl M for i32   { fn m(self) { println!("i32::m()");  } }
impl M for X     { fn m(self) { println!("X::m()");    } }
impl M for &X    { fn m(self) { println!("&X::m()");   } }
impl M for &&X   { fn m(self) { println!("&&X::m()");  } }
impl M for &&&X  { …
Run Code Online (Sandbox Code Playgroud)

reference dereference formal-semantics rust

152
推荐指数
2
解决办法
2万
查看次数

检查迭代器是否有效

有没有办法检查迭代器(无论是来自向量,列表,双端队列......)是否(仍)可解除引用,即未被无效?

我一直在使用try- catch,但是有更直接的方法吗?

示例:(不起作用)

list<int> l;
for (i = 1; i<10; i++) {
    l.push_back(i * 10);
}

itd = l.begin();
itd++;
if (something) {
    l.erase(itd);
}

/* now, in other place.. check if itd points to somewhere meaningful */
if (itd != l.end())
{
    //  blablabla
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl dereference

63
推荐指数
5
解决办法
7万
查看次数

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

我已经看到了很多这方面的问题,但是如果没有具体的代码,我会以不同的方式提出问题.有没有一种方法可以轻松确定导致类型不完整的原因?在我的情况下,我正在使用别人的代码,我完全确定我没有正确的标题,但是(因为计算机比人类的眼球更快更好地完成这个东西)有没有办法让编译器说出来,"嘿,你认为你在第34行有X型,但实际上已经失踪了." 错误本身仅在您分配时显示,这不是很有帮助.

c struct typedef compiler-errors dereference

61
推荐指数
4
解决办法
21万
查看次数

为什么代码会通过空指针显式调用静态方法?

我在几个旧项目中看到过这样的代码:

class Class {
    static void Method() {}
};

((Class*)0)->Method();
Run Code Online (Sandbox Code Playgroud)

此代码包含未定义的行为,因为它包括取消引用空指针(无论之后发生什么).这真的没有意义 - 演员是在那里将类型名称提供给编译器,并且编写上面代码的人可以写这个:

Class::Method();
Run Code Online (Sandbox Code Playgroud)

而后者也没关系.

为什么有人会写前代码?它是来自一些美好时光的已知成语还是什么?

c++ pointers static-members undefined-behavior dereference

57
推荐指数
1
解决办法
3033
查看次数

"引用"和"解除引用"的含义

我在互联网上阅读不同的东西并感到困惑,因为每个网站都说不同的东西.

谈到C.

我读到了*引用运算符&和解引用运算符; 或者引用意味着使指针指向变量,并且解除引用正在访问指针指向的变量的值.所以我很困惑.

我是否可以获得有关"引用和取消引用"的简单但彻底的解释?

c pointers reference dereference

56
推荐指数
5
解决办法
10万
查看次数

org.hibernate.QueryException:非法尝试取消引用集合

我正在尝试跟随hql查询执行

SELECT count(*) 
  FROM BillDetails as bd
 WHERE bd.billProductSet.product.id = 1002
   AND bd.client.id                 = 1
Run Code Online (Sandbox Code Playgroud)

但它正在显示

org.hibernate.QueryException: illegal attempt to dereference collection 
[billdetail0_.bill_no.billProductSet] with element property reference [product] 
[select count(*) from iland.hbm.BillDetails as bd where bd.billProductSet.product.id=1001 and bd.client.id=1]
    at org.hibernate.hql.ast.tree.DotNode$1.buildIllegalCollectionDereferenceException(DotNode.java:68)
    at org.hibernate.hql.ast.tree.DotNode.checkLhsIsNotCollection(DotNode.java:558)
Run Code Online (Sandbox Code Playgroud)

hibernate hql dereference jpa-2.0 jpa-2.1

56
推荐指数
1
解决办法
4万
查看次数

在C中取消引用指向0的指针

有时内存地址为0x0的数据非常有价值 - 以x86实模式IVT作为一个更为人熟知的例子:它从0x0开始并包含指向中断处理程序的指针:0x00处的双字是指向零错误处理程序的指针.

但是,C11语言标准禁止解除引用空指针[WG14 N1570 6.5.3.2],它们被定义为用0初始化的指针或用空指针[WG14 N1570 6.3.2.3] 初始化的指针,有效地禁止了第一个字节.

人们如何在需要时实际使用0x0?

c memory pointers dereference

55
推荐指数
3
解决办法
4815
查看次数

取消引用访问元素的向量指针

如果我在C++中有一个指向向量的指针:

vector<int>* vecPtr;
Run Code Online (Sandbox Code Playgroud)

我想访问向量的一个元素,然后我可以通过去除向量来做到这一点:

int a = (*vecPtr)[i];
Run Code Online (Sandbox Code Playgroud)

但是这个解除引用会不会在堆栈上创建我的矢量副本?假设向量存储10000个int,是否会通过解除引用来复制vecPtr 10000 int?

谢谢!

c++ vector dereference

54
推荐指数
2
解决办法
7万
查看次数