Questions tagged «pointers»

“指向”存储在内存中的另一个值的数据类型。指针变量包含某个其他实体(变量或函数或其他实体)的内存地址。此标记应用于涉及使用指针而不是引用的问题。使用指针的最常见的编程语言是C,C ++,Go和汇编语言。使用特定的语言标签。其他有用的标记是描述指针用法的方法,函数,结构等。

18
删除指针后将其设为NULL是一种好习惯吗?
我首先要说的是,使用智能指针,您将永远不必为此担心。 以下代码有什么问题? Foo * p = new Foo; // (use p) delete p; p = NULL; 这是由另一个问题的答案和评论引起的。尼尔·巴特沃思(Neil Butterworth)的一则评论产生了一些反对意见: 在C ++中,删除后将指针设置为NULL并不是普遍的好习惯。有时候,这是一件好事,有时却是毫无意义的,并且会掩盖错误。 在很多情况下它无济于事。但是以我的经验,这不会伤害。有人启发我。

11
Java中的函数指针
这可能是常见且琐碎的事情,但我似乎很难找到具体答案。在C#中,有一个委托的概念,它与C ++中的函数指针紧密相关。Java中是否有类似的功能?鉴于缺少指针,最好的方法是什么?需要明确的是,我们在这里谈论头等舱。


16
指针澄清的指针
我在按照本教程讲解关于指针的工作方式。 让我引用相关段落: 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?
142 c  pointers 

23
如何向初学者解释C指针(声明与一元运算符)?
最近,我很高兴向C编程初学者介绍了指针,并偶然发现了以下困难。如果您已经知道如何使用指针,这似乎根本就不是问题,但是请尝试以清晰的心态看下面的示例: int foo = 1; int *bar = &foo; printf("%p\n", (void *)&foo); printf("%i\n", *bar); 对于绝对的初学者来说,输出结果可能令人惊讶。在第2行中,他/她刚刚声明* bar为&foo,但是在第4行中,结果表明* bar实际上是foo而不是&foo !! 您可能会说,造成混淆的原因是*符号的含糊之处:在第2行中,它用于声明指针。在第4行中,它用作一元运算符,用于获取指针指向的值。两种不同的东西,对不对? 但是,这种“解释”根本没有帮助初学者。它指出了细微的差异,从而引入了一个新概念。这不是正确的教学方法。 那么,克尼根和里奇如何解释呢? 一元运算符*是间接或取消引用运算符;当应用于指针时,它访问指针指向的对象。[…] 指针ip的声明int *ip旨在用作助记符;它表示该表达式*ip是一个int。变量声明的语法模仿可能出现该变量的表达式的语法。 int *ip应该读成“ *ip会返回int”?但是,为什么声明之后的赋值不遵循该模式呢?如果初学者想初始化变量怎么办?int *ip = 1(读取:*ip将返回int和,int则返回1)将无法正常工作。概念模型似乎并不连贯。我在这里想念什么吗? 编辑:它试图在这里总结答案。
141 c  pointers 

16
delete []如何知道它是一个数组?
好吧,我想我们都同意,根据所传递的内容,未定义以下代码所发生的情况, void deleteForMe(int* pointer) { delete[] pointer; } 指针可能是各种不同的事物,因此delete[]对它执行无条件的操作是不确定的。但是,假设我们确实在传递数组指针, int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } 我的问题是,在这种情况下,指针是一个数组,谁知道呢?我的意思是,从语言/编译器的角度来看,它不知道arr数组指针还是指向单个int的指针。哎呀,它甚至不知道是否arr是动态创建的。但是,如果我改为执行以下操作, int main() { int* num = new int(1); deleteForMe(num); return 0; } 操作系统足够聪明,只能删除一个int,而不会通过删除超出该点的其余内存来进行某种“杀戮狂潮”(与strlen和非\0终止字符串进行对比),它将一直持续到点击0)。 那么记住这些事情是谁的工作呢?操作系统是否在后台保留某种类型的记录?(我的意思是,我意识到我在开始这篇文章时首先说的是发生的事情是不确定的,但事实是,“杀人狂潮”的情况没有发生,因此在实际世界中有人会记住。)



6
Visual Studio如何处理删除的指针,为什么?
我正在阅读的一本C ++书指出,当使用delete操作符删除指针时,指向该位置的内存将被“释放”,并且可以覆盖。它还指出,指针将继续指向相同的位置,直到将其重新分配或设置为为止NULL。 但是在Visual Studio 2012中;事实并非如此! 例: #include <iostream> using namespace std; int main() { int* ptr = new int; cout << "ptr = " << ptr << endl; delete ptr; cout << "ptr = " << ptr << endl; system("pause"); return 0; } 当我编译并运行该程序时,将得到以下输出: ptr = 0050BC10 ptr = 00008123 …


10
在C ++中传递对指针的引用
据我所知,没有理由不应该允许我将引用传递给C ++中的指针。但是,我这样做的尝试失败了,我也不知道为什么。 这就是我在做什么: void myfunc(string*& val) { // Do stuff to the string pointer } // sometime later { // ... string s; myfunc(&s); // ... } 我收到此错误: 无法将参数1从'std :: string *'转换为'std :: string *&'
130 c++  pointers  reference 

10
指针表达式:* ptr ++,* ++ ptr和++ * ptr
最近,我遇到了一个我自己无法理解的问题。 这三个表达式实际上是什么意思? *ptr++ *++ptr ++*ptr 我试过里奇。但不幸的是,他无法按照他对这3项操作的讲述进行操作。 我知道它们都是为了增加指针/指向的值而执行的。我还可以猜测,关于评估的优先级和顺序可能有很多事情。就像先递增指针,然后获取该指针的内容一样,先获取内容,然后递增指针,等等。如您所见,我对它们的实际操作并不清楚,我想尽快清除。但是当我有机会在程序中应用它们时,我真的迷失了。例如: int main() { const char *p = "Hello"; while(*p++) printf("%c",*p); return 0; } 给我这个输出: ello 但是我希望它能打印出来Hello。最后一个要求-请提供示例,说明每个表达式在给定代码段中的工作方式。大多数时候,只有一小段理论飞过我的脑海。
128 c++  c  pointers  increment 


9
Python中的指针?
我知道Python没有指针,但是有办法提高产量 2,而不是 >>> a = 1 >>> b = a # modify this line somehow so that b "points to" a >>> a = 2 >>> b 1 ? 这是一个例子:我想要form.data['field']和form.field.value始终具有相同的值。并非完全必要,但我认为这会很好。 例如,在PHP中,我可以这样做: <?php class Form { public $data = []; public $fields; function __construct($fields) { $this->fields = $fields; foreach($this->fields as &$field) …
124 python  pointers 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.