Tag: 指针

指针指针的指针

我正在关注这个教程如何指针指针工作。 让我引用有关的一段话: int i = 5, j = 6, k = 7; int *ip1 = &i, *ip2 = &j; 现在我们可以设置 int **ipp = &ip1; ipp指向ip1 ,指向i 。 *ipp是ip1 , **ipp是i或5.我们可以用我们熟悉的方框和箭头符号来说明情况,如下所示: 如果那我们说 *ipp = ip2; 我们已经改变了由ipp指向的指针(即ip1 )以包含ip2的副本,以便它( ip1 )现在指向j : 我的问题是:为什么在第二张图片中, ipp仍然指向ip1而不是ip2 ?

如何向初学者解释C指针(声明与一元运算符)?

我最近很高兴地解释了一个C编程初学者的指针,并偶然发现了以下困难。 如果你已经知道如何使用指针,可能看起来并不是一个问题,但是试着用清晰的头脑来看下面的例子: int foo = 1; int *bar = &foo; printf("%p\n", (void *)&foo); printf("%i\n", *bar); 对于绝对的初学者来说,输出可能是令人惊讶的。 在第二行他/她刚刚宣布*酒吧是&富,但在第4行,结果是*酒吧实际上是富而不是&富! 你可能会说,这个混淆源于*符号的模糊性:在第2行中,它被用来声明一个指针。 在第4行中,它被用作一个一元运算符,它获取指针指向的值。 两个不同的东西,对吧? 然而,这个“解释”根本没有帮助初学者。 它通过指出一个微妙的差异来引入一个新的概念。 这不可能是教它的正确方法。 那么Kernighan和Ritchie怎么解释呢? 一元运算符*是间接或解引用运算符; 当应用于指针时,它访问指针指向的对象。 […] 指针ip, int *ip的声明是用作助记符的; 它表示*ipexpression式是一个int。 variables声明的语法模仿variables可能出现的expression式的语法 。 int *ip应该像“ *ip将返回一个int ”读取? 但是,为什么宣布后的任务不遵循这种模式呢? 如果初学者想要初始化variables呢? int *ip = 1 (读取: *ip将返回一个int并且int是1 )将无法按预期工作。 概念模型看起来并不一致。 我在这里错过了什么? 编辑: 它试图总结这里的答案 。

我应该在使用static_cast或reinterpret_cast时将void *转换为任何内容

static_cast和reinterpret_cast似乎都能很好地将void *转换为另一个指针types。 有一个很好的理由相互赞成吗?

指针与参数和返回值中的值

在Go中有各种方法来返回struct值或其片。 对于我见过的个人来说: type MyStruct struct { Val int } func myfunc() MyStruct { return MyStruct{Val: 1} } func myfunc() *MyStruct { return &MyStruct{} } func myfunc(s *MyStruct) { s.Val = 1 } 我了解这些之间的差异。 第一个返回结构的副本,第二个指向函数中创build的结构值的指针,第三个需要传入一个现有结构并覆盖该值。 我已经看到所有这些模式都被用在不同的环境中,我想知道最佳实践是什么。 你什么时候用哪个? 例如,第一个可以适用于小型结构(因为开销很小),第二个适用于大型结构。 第三,如果你想要非常有效的内存,因为你可以很容易地重用调用之间的单个结构实例。 什么时候使用哪种最佳实践? 同样,关于切片的同样的问题: func myfunc() []MyStruct { return []MyStruct{ MyStruct{Val: 1} } } func myfunc() []*MyStruct { return […]

为什么“这个”是一个指针而不是一个参考?

我正在阅读这个问题的答案C + +的利弊,并阅读评论时有这个疑问。 程序员经常发现,“this”是指针而不是引用。 另一个困惑是为什么“你好”是不是types的std ::string,但计算为一个字符常量*(指针)(在数组到指针转换后) – 约翰内斯Schaub评论时间70年01月01日原作者: 这只表明它不使用与其他(以后)语言相同的约定。 – le dorfier 08年12月22日在3:35 尽pipe如此,我将这个“这个”称为一个非常微不足道的问题。 哎呀,感谢在我的未定义行为的例子中发现了一些错误。 :)虽然我不明白什么信息大小与第一个任何东西有关。 一个指针是根本不允许指向外部分配的内存 – – Jalf 12年12月22日在4:18 这是一个不断沉着? – yesraaj 12年12月22日在6:35 如果方法是const int getFoo()const,则这可以是常量。 < – 在getFoo范围内,“this”是常量,因此是只读的。 这可以防止错误,并为调用者提供一定程度的保证,使对象不会改变。 – 道格T. 08年12月22日在16:42 你不能重新分配“这个”。 即你不能做“this =&other”,因为这是一个右值。 但是这是T *types,而不是T型常量。 即它是一个非常量的指针。 如果你在一个const方法,那么它是一个指向const的指针。 T常量。 但指针本身是nonconst – Johannes Schaub – litb 08年12月22日在17:53 想想这个是这样的:#define this(this_ + 0),编译器创build“this_”作为指向对象的指针,并使“this”成为关键字。 你不能指定“this”,因为(this_ […]

我应该存储整个对象还是指向容器中的对象的指针?

从头开始devise一个新的系统。 我将使用STL来存储特定的长寿命对象的列表和地图。 问题:我应该确保我的对象有复制构造函数,并将对象的副本存储在我的STL容器中,还是自己pipe理生命期和范围通常更好一些,只是将指向这些对象的指针存储在我的STL容器中? 我意识到这在细节方面有些短暂,但是如果存在,我正在寻找“理论”更好的答案,因为我知道这两种解决scheme都是可能的。 玩指针的两个非常明显的缺点:1)我必须在STL之外的范围内自己pipe理这些对象的分配/释放。 2)我不能在堆栈上创build一个临时对象并将其添加到我的容器中。 还有什么我失踪?

为什么是x != x != x ?

我正在学习一点C ++,我正在用指针来对抗。 我明白,我可以通过声明3级指针: int *(*x)[5]; 所以*x是指向int指针的5个元素的指针。 我也知道x[0] = *(x+0); , x[1] = *(x+1)等等。 那么,给出上面的声明,为什么是x[0] != x[0][0] != x[0][0][0] ?

为什么C ++库和框架从不使用智能指针?

我在几篇文章中读到几乎永远不会使用原始指针。 相反,他们应该总是包装在智能指针内,无论是范围还是共享指针。 不过,我注意到像Qt,wxWidgets这样的框架和Boost这样的库不会返回也不会期望智能指针,就好像它们根本不使用它们一样。 相反,他们返回或期待原始指针。 这有什么理由吗? 当我编写公共API时,我应该远离智能指针吗?为什么? 只是想知道为什么在许多重大项目似乎避免使用智能指针。

unique_ptr和shared_ptr之间的区别

可能重复: pimpl:shared_ptr或unique_ptr 智能指针(boost)解释 有人可以解释shared_ptr和unique_ptr之间的区别吗?

在C中通过引用传递

如果C不支持通过引用传递一个variables,为什么这个工作? #include <stdio.h> void f(int *j) { (*j)++; } int main() { int i = 20; int *p = &i; f(p); printf("i = %d\n", i); return 0; } 产量 $ gcc -std = c99 test.c $ a.exe 我= 21