Questions tagged «pointers»

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

5
C中* ptr + = 1和* ptr ++之间的区别
我刚开始研究C,在做一个有关将指针传递为函数参数的示例时,我发现了一个问题。 这是我的示例代码: #include <stdio.h> #include <string.h> #include <stdlib.h> int* allocateIntArray(int* ptr, int size){ if (ptr != NULL){ for (int i = 0; i < size; i++){ ptr[i] = i; } } return ptr; } void increasePointer(int** ptr){ if (ptr != NULL){ *ptr += 1; /* <----------------------------- This is line 16 …

11
为什么链表使用指针而不是将节点存储在节点内部
之前,我在Java中广泛使用链表,但是我对C ++还是很陌生。我正在使用这个在项目中提供给我的节点类 class Node { public: Node(int data); int m_data; Node *m_next; }; 但是我有一个问题回答得不是很好。为什么有必要使用 Node *m_next; 指向列表中的下一个节点,而不是 Node m_next; 我了解使用指针版本更好。我不会争辩事实,但是我不知道为什么会更好。关于指针如何更好地进行内存分配,我没有一个明确的答案,我想知道这里是否有人可以帮助我更好地理解这一点。

21
为什么地址零用于空指针?
在C(或C ++)中,如果指针的值为零,则它是特殊的:建议释放它们的内存后将指针设置为零,因为这意味着再次释放该指针并不危险;当我调用malloc时,如果无法获取内存,它将返回一个值为零的指针;我if (p != 0)一直在确保传递的指针有效,等等。 但是由于内存寻址从0开始,难道不是0像其他地址一样有效吗?在这种情况下,如何使用0来处理空指针?为什么负数不为null? 编辑: 一堆好答案。我将总结一下我的内心理解后所表达的答案中的内容,并希望如果我误会,社区会纠正我。 像编程中的所有其他内容一样,它是一种抽象。只是一个常数,与地址0无关。C++ 0x通过添加关键字来强调这一点nullptr。 它甚至不是地址抽象,它是C标准所指定的常数,并且编译器可以将其转换为其他数字,只要确保它永远不等于“真实”地址即可,如果0不等于,则等于其他空指针。平台使用的最佳价值。 如果不是早期的抽象,那么系统将使用地址0,而程序员无法使用该地址。 我承认,我的负面建议是有点疯狂的头脑风暴。如果对地址使用带符号的整数会造成一点浪费,这意味着除了空指针(-1或其他值)以外,值空间在构成有效地址的正整数和刚刚浪费的负数之间平均分配。 如果任何数字始终可以用数据类型表示,那么它就是0。(可能也是1。我认为一位整数(如果是无符号的,则为0或1),或者如果签名则只是有符号的位,或者是两位整数将会是[-2,1]。但是您可以将0设为null,将1设为内存中唯一可访问的字节。) 我脑子里仍然有一些未解决的事情。指向特定固定地址的堆栈溢出问题指针告诉我,即使空指针的0为抽象,也不一定需要其他指针值。这导致我发布了另一个堆栈溢出问题,我是否想访问地址零?。
121 c++  c  memory  pointers 


10
创建一个指向二维数组的指针
我需要一个指向静态二维数组的指针。怎么做? static uint8_t l_matrix[10][20]; void test(){ uint8_t **matrix_ptr = l_matrix; //wrong idea } 我收到各种错误,例如: 警告:从不兼容的指针类型分配 下标值既不是数组也不是指针 错误:无效使用弹性数组成员
119 c  arrays  pointers 


9
C指针:指向固定大小的数组
这个问题出现在C语言专家那里: 在C中,可以如下声明一个指针: char (* p)[10]; ..基本上表明该指针指向10个字符的数组。像这样声明一个指针的整洁之处在于,如果尝试为p分配一个大小不同的数组的指针,则会出现编译时错误。如果您尝试将简单的char指针的值分配给p,也会给您带来编译时错误。我在gcc上尝试过,似乎可以在ANSI,C89和C99上使用。 在我看来,像这样声明一个指针将非常有用-特别是在将指针传递给函数时。通常,人们会这样写这样的函数原型: void foo(char * p, int plen); 如果期望使用特定大小的缓冲区,则只需测试plen的值。但是,不能保证将p传递给您的人确实会在该缓冲区中为您提供有效的内存位置。您必须相信调用此函数的人在做正确的事情。另一方面: void foo(char (*p)[10]); ..将强制调用方为您提供指定大小的缓冲区。 这似乎很有用,但我从未在任何遇到过的代码中看到过像这样声明过的指针。 我的问题是:人们为什么不声明这样的指针有什么理由?我没有看到明显的陷阱吗?
118 c  pointers  size 



10
free(ptr)其中ptr为NULL会损坏内存吗?
理论上我可以说 free(ptr); free(ptr); 这是内存损坏,因为我们要释放已经释放的内存。 但是如果 free(ptr); ptr=NULL; free(ptr); 由于操作系统将以不确定的方式运行,因此我无法对此进行实际的理论分析。无论我在做什么,这是不是内存损坏? 释放NULL指针是否有效?

3
为什么此代码段错误在64位体系结构上却在32位体系结构上能正常工作?
我遇到了以下C难题: 问:为什么以下程序在IA-64上出现段错误,但在IA-32上却可以正常工作? int main() { int* p; p = (int*)malloc(sizeof(int)); *p = 10; return 0; } 我知道int64位计算机上的大小int可能与指针的大小不同(可能是32位,而指针可能是64位)。但是我不确定这与上面的程序有什么关系。有任何想法吗?

6
是什么使这种指针的使用无法预测?
我目前正在学习指针,我的教授提供了以下代码作为示例: //We cannot predict the behavior of this program! #include <iostream> using namespace std; int main() { char * s = "My String"; char s2[] = {'a', 'b', 'c', '\0'}; cout << s2 << endl; return 0; } 他在评论中写道,我们无法预测程序的行为。究竟是什么使得它不可预测?我认为没有错。
108 c++  pointers 

2
值接收器与指针接收器
对于我而言,目前尚不清楚,在这种情况下,我想使用值接收器而不是始终使用指针接收器。 回顾一下文档: type T struct { a int } func (tv T) Mv(a int) int { return 0 } // value receiver func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver 该文档还说:“对于基本类型,切片和小型结构之类的类型,值接收器非常便宜,因此,除非该方法的语义要求使用指针,否则值接收器是高效且清晰的。” 首先,它说“非常便宜”,但问题是它比指针接收器便宜。因此,我做了一个小的基准测试(基于要点的代码),向我展示了,即使对于只有一个字符串字段的结构,指针接收器也更快。结果如下: // Struct one empty string property BenchmarkChangePointerReceiver 2000000000 0.36 ns/op BenchmarkChangeItValueReceiver 500000000 3.62 …
107 function  pointers  go 

2
“ <类型>是接口的指针,而不是接口”的困惑
亲爱的开发人员, 我遇到了这个问题,对我来说似乎有点奇怪。看一下这段代码: package coreinterfaces type FilterInterface interface { Filter(s *string) bool } type FieldFilter struct { Key string Val string } func (ff *FieldFilter) Filter(s *string) bool { // Some code } type FilterMapInterface interface { AddFilter(f *FilterInterface) uuid.UUID RemoveFilter(i uuid.UUID) GetFilterByID(i uuid.UUID) *FilterInterface } type FilterMap struct { mutex …
104 pointers  go  interface 

2
如何在Go中执行文字* int64?
我有一个带有*int64字段的结构类型。 type SomeType struct { SomeField *int64 } 在代码的某个时刻,我想声明一个字面值(例如,当我知道值应该为0或指向0时,您就知道我的意思了) instance := SomeType{ SomeField: &amp;0, } ...除非这不起作用 ./main.go:xx: cannot use &amp;0 (type *int) as type *int64 in field value 所以我尝试这个 instance := SomeType{ SomeField: &amp;int64(0), } ...但是这也不起作用 ./main.go:xx: cannot take the address of int64(0) 我该怎么做呢?我唯一能想到的解决方案是使用占位符变量 var placeholder int64 placeholder = 0 …
103 pointers  go  struct  literals 

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.