Questions tagged «pointers»

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


16
何时使用引用与指针
我了解指针与引用的语法和一般语义,但是我应该如何确定何时在API中使用引用或指针多少合适? 自然,有些情况需要一个或另一个(operator++需要一个引用参数),但是总的来说,我发现我更喜欢使用指针(和const指针),因为语法很清楚地表明,变量是以破坏性方式传递的。 例如下面的代码: void add_one(int& n) { n += 1; } void add_one(int* const n) { *n += 1; } int main() { int a = 0; add_one(a); // Not clear that a may be modified add_one(&a); // 'a' is clearly being passed destructively } 使用指针,总是(更)明显的是怎么回事,所以对于API和诸如此类的情况,其中最关注清晰度的指针不是比引用更合适吗?这是否意味着仅在必要时才使用引用(例如operator++)?两者之间是否存在性能问题? 编辑(已过时): 除了允许使用NULL值和处理原始数组外,选择还取决于个人喜好。我接受了下面引用Google的C ++样式指南的答案,因为他们提出的观点是“引用可能会造成混淆,因为引用具有值语法但具有指针语义。” 由于清理不应该为NULL的指针参数需要进行额外的工作(例如,add_one(0)将在运行时调用指针版本并在运行时中断),因此从可维护性的角度来看,使用必须在存在对象的引用是有意义的,尽管这很遗憾。失去语法清晰度。
381 c++  pointers  reference 

11
在JavaScript中删除对象
我对JavaScript的delete运算符有些困惑。采取以下代码: var obj = { helloText: "Hello World!" }; var foo = obj; delete obj; 执行完这段代码后,objis null,但foo仍指的是一个完全像的对象obj。我猜这个对象是foo指向相同的对象。 这使我感到困惑,因为我希望编写会delete obj删除obj指向内存中的对象,而不仅仅是变量obj。 这是因为JavaScript的垃圾回收工作在保留/释放的基础,所以,如果我没有指向对象的任何其他变量,它会从内存中清除? (顺便说一下,我的测试是在Safari 4中完成的。)

17
为什么要使用指针?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我知道这是一个非常基本的问题,但是在用高级语言编写了一些项目之后,我才开始进行一些基本的C ++编程。 基本上我有三个问题: 为什么在普通变量上使用指针? 我应该在何时何地使用指针? 如何将指针与数组一起使用?
356 c++  c  pointers 

4
指针与参数和返回值中的值
在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 } 我了解两者之间的区别。第一个返回该结构的副本,第二个返回指向在函数内创建的结构值的指针,第三个期望传入现有结构并覆盖该值。 我已经看到所有这些模式都可以在各种情况下使用,我想知道关于这些的最佳实践是什么。什么时候使用?例如,第一个可能适用于小型结构(因为开销很小),第二个适用于较大的结构。第三,如果您想提高内存效率,因为您可以轻松地在调用之间重用单个结构实例。有什么最佳实践,何时使用? 同样,关于切片的相同问题: func myfunc() []MyStruct { return []MyStruct{ MyStruct{Val: 1} } } func myfunc() []*MyStruct { return []MyStruct{ …
327 pointers  go 

15
将2D数组传递给C ++函数
我有一个函数,希望将可变大小的2D数组作为参数。 到目前为止,我有这个: void myFunction(double** myArray){ myArray[x][y] = 5; etc... } 我在代码的其他地方声明了一个数组: double anArray[10][10]; 但是,打电话myFunction(anArray)给我一个错误。 传递数组时,我不想复制该数组。对数组所做的任何更改myFunction都应更改的状态anArray。如果我理解正确,我只想将指向2D数组的指针作为参数传递。该函数还需要接受不同大小的数组。因此,例如[10][10]和[5][5]。我怎样才能做到这一点?


11
NULL,'\ 0'和0有什么区别?
在C中,似乎有零各个值之间的差- NULL,NUL和0。 我知道ASCII字符的'0'计算结果为48或0x30。 该NULL指针通常定义为: #define NULL 0 要么 #define NULL (void *)0 另外,似乎还有一个NUL性格'\0'值得评价的人物0。 是否有时这三个值不能相等? 在64位系统上也是如此吗?
309 c  pointers  null 


9
C中的指针:何时使用“&”号和星号?
我只是从指针开始,我有点困惑。我知道&是指变量的地址,*可以在指针变量的前面使用它来获取指针所指向的对象的值。但是,当您使用数组,字符串或使用变量的指针副本调用函数时,情况会有所不同。很难在所有这些内部看到一种逻辑模式。 什么时候应该使用&和*?
298 c  pointers 


11
什么时候应该在C ++中使用new关键字?
我使用C ++已有很短的时间了,而且我一直在想new关键字。简而言之,我应该使用它吗? 1)使用新关键字... MyClass* myClass = new MyClass(); myClass->MyField = "Hello world!"; 2)没有新关键字... MyClass myClass; myClass.MyField = "Hello world!"; 从实现的角度看,它们似乎没有什么不同(但是我敢肯定它们是...)。但是,我的主要语言是C#,当然第一种方法是我习惯的。 困难似乎是方法1与std C ++类一起使用更困难。 我应该使用哪种方法? 更新1: 最近,我将new关键字用于超出范围(即从函数返回)的大型数组的堆内存(或free store)。在使用堆栈之前,该堆栈导致一半的元素在范围之外损坏,切换到堆使用情况可确保元素完好无损。好极了! 更新2: 我的一个朋友最近告诉我,使用new关键字有一个简单的规则;每次键入时new,请键入delete。 Foobar *foobar = new Foobar(); delete foobar; // TODO: Move this to the right place. 这有助于防止内存泄漏,因为您始终必须将删除项放在某个位置(例如,将其剪切并粘贴到析构函数或其他方法时)。


3
为什么C中的箭头(->)运算符存在?
点(.)运算符用于访问结构的成员,而->C语言中的箭头运算符()用于访问所讨论的指针引用的结构的成员。 指针本身没有任何可通过点运算符访问的成员(实际上,它只是一个数字,描述了虚拟内存中的位置,因此它没有任何成员)。因此,如果我们将点运算符定义为在指针上使用时自动取消引用该指针(编译器在编译时知道的信息afaik),则将不会有歧义。 那么,为什么语言创建者决定通过添加此看似不必要的运算符来使事情变得更复杂?重大的设计决定是什么?
264 c  pointers  dereference 

12
C中的箭头运算符(->)用法
我正在读一本叫做《 21天自学C》的书(我已经学过Java和C#,所以我的步伐要快得多)。我正在阅读有关指针的章节,->(箭头)运算符没有解释就出现了。我认为它用于调用成员和函数(类似于.(点)运算符,但用于指针而不是成员)。但是我不确定。 我可以得到一个解释和一个代码示例吗?
257 c  pointers  syntax 

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.