Questions tagged «pointers»

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

7
C ++通过引用传递数组
允许通过引用传递数组吗? void foo(double& *bar) 似乎我的编译器说不。为什么?通过引用传递数组的正确方法是什么?还是可以解决?我有一个数组参数,我的方法应修改该参数,然后再检索。另外,我可以使该数组成为一个类成员,可以很好地工作,但是它对我代码的其他部分有很多缺点(我想避免)。 感谢致敬。


15
什么时候整数<->指针强制转换正确?
民间传说说: 类型系统存在是有原因的。整数和指针是不同的类型,在大多数情况下,整数和指针之间的转换是不当行为,可能表示设计错误,应避免使用。 即使执行了这样的强制转换,也不应假设整数和指针的大小(强制void*转换int为使代码在x64上失败的最简单方法),而不int应该使用intptr_t或uintptr_tfrom stdint.h。 知道这一点,什么时候执行这样的转换真正有用? (注意:对于可移植性的价格,较短的代码并不算作“实际有用”。) 我知道一种情况: 一些无锁的多处理器算法利用了一个事实,即2个字节以上的指定指针具有一定的冗余性。例如,它们然后将指针的最低位用作布尔标志。对于具有适当指令集的处理器,这可以消除对锁定机制的需要(如果指针和布尔标志是分开的,则这是必要的)。 (注意:这种做法甚至可以通过java.util.concurrent.atomic.AtomicMarkableReference在Java中安全地进行) 更多的东西?
77 c++  c  pointers  casting 


3
为什么指向“易失性”的指针(例如“ volatile int * p”)有用?
volatile告诉编译器不要优化引用,以便每次读/写操作都不会使用寄存器中存储的值,而是进行真正的内存访问。我可以理解它对于某些普通变量很有用,但不了解它如何volatile影响指针。 volatile int *p = some_addr; int a = *p; // CPU always has to load the address, then does a memory access anyway, right? 如果声明为,有什么区别int *p = some_addr?
77 c  pointers  volatile 

5
什么时候在C#/。NET中使用指针?
我知道C#使程序员能够在不安全的上下文中访问和使用指针。但是什么时候需要? 在什么情况下使用指针变得不可避免? 是否仅出于性能原因? 同样,为什么C#通过不安全的上下文公开此功能,并从中删除所有托管的优势?从理论上讲,可以使用指针而不损失托管环境的任何优势吗?

23
为什么不对C ++中的所有内容使用指针?
假设我定义了一些类: class Pixel { public: Pixel(){ x=0; y=0;}; int x; int y; } 然后使用它编写一些代码。为什么要执行以下操作? Pixel p; p.x = 2; p.y = 5; 来自Java世界,我总是写: Pixel* p = new Pixel(); p-&gt;x = 2; p-&gt;y = 5; 他们基本上做同样的事情,对不对?一个在堆栈上,另一个在堆栈上,因此以后我必须将其删除。两者之间有根本区别吗?为什么我要优先选择另一个?
75 c++  pointers  stack  heap 


12
指针与普通指针的对比
指针的目的是保存特定变量的地址。然后,以下代码的内存结构应类似于: int a = 5; int *b = &amp;a; ......内存地址......值 a ... 0x000002 ................... 5 b ... 0x000010 ..... .............. 0x000002 好的。然后假设现在我要保存指针* b的地址。然后我们通常将双指针** c定义为 int a = 5; int *b = &amp;a; int **c = &amp;b; 然后,内存结构如下所示: ......内存地址......值 a ... 0x000002 ................... 5 b ... 0x000010 ..... .............. 0x000002 c …
74 c  pointers 

18
检查指针是否分配了内存
我们可以检查传递给函数的指针是否在C中分配了内存吗? 我在C中编写了自己的函数,该函数接受字符指针-buf [指向缓冲区的指针]和大小-buf_siz [缓冲区大小]。实际上,在调用此函数之前,用户必须创建一个缓冲区并为其分配buf_siz的内存。 由于用户可能会忘记做内存分配,而只是将指针传递给我的函数,因此我想检查一下。所以有什么办法可以检查我的函数,以查看传递的指针是否确实分配了buf_siz的内存量。 EDIT1:似乎没有标准库可以检查它..但是有没有脏东西可以检查它.. ?? EDIT2:我确实知道我的函数将由优秀的C程序员使用...但是我想知道是否可以检查..如果我们愿意听.. 结论:因此,无法检查某个指针是否在函数中分配了内存
74 c  pointers 

16
用Java复制对象
我了解到,当您在Java中修改变量时,它不会更改它所基于的变量 int a = new Integer(5); int b = a; b = b + b; System.out.println(a); // 5 as expected System.out.println(b); // 10 as expected 我为对象假设了类似的事情。考虑这个课程。 public class SomeObject { public String text; public SomeObject(String text) { this.setText(text); } public String getText() { return text; } public void setText(String text) …

7
我可以使用NULL代替0值吗?
我可以使用NULL指针替代值0吗? 或这样做有什么问题吗? 例如,例如: int i = NULL; 代替: int i = 0; 作为实验,我编译了以下代码: #include &lt;stdio.h&gt; int main(void) { int i = NULL; printf("%d",i); return 0; } 输出: 0 确实,它给了我这个警告,它本身是完全正确的: warning: initialization makes integer from pointer without a cast [-Wint-conversion] 但结果仍然相同。 我是否会由此陷入“不确定行为”? 可以这样使用NULL吗? NULL在算术表达式中用作数字值有什么问题吗? 在这种情况下,C ++的结果和行为是什么? 我已阅读的答案是什么NULL之间的区别,“\ 0”和0大约之间的区别是什么NULL,\0以及0是的,但我没有从那里简洁的信息,如果是很允许的,也是正确的使用NULL作为在赋值和其他算术运算中使用的值。

17
为什么引用在C ++中不可重定位
C ++引用具有两个属性: 他们总是指向同一个对象。 它们不能为0。 指针相反: 它们可以指向不同的对象。 它们可以是0。 为什么在C ++中没有“不可为空的,可重定位的引用或指针”?我想不出为什么引用不可重新引用的充分理由。 编辑: 问题经常出现,因为当我要确保“关联”(在这里避免使用“引用”或“指针”一词)永远不会无效时,我通常会使用引用。 我认为我从来没有想过“太棒了,这个引用总是指向同一个对象”。如果引用是可重新定位的,则仍然可以得到如下所示的当前行为: int i = 3; int&amp; const j = i; 这已经是合法的C ++,但毫无意义。 我这样重申我的问题: “'引用是对象'设计的背后原理是什么?为什么认为引用始终是同一对象而不是仅在声明为const时有用?” 干杯,菲利克斯

5
函数指针的解除引用如何发生?
为什么以及如何取消引用函数指针只是“什么都不做”? 这就是我在说的: #include&lt;stdio.h&gt; void hello() { printf("hello"); } int main(void) { (*****hello)(); } 从这里的评论: 函数指针取消引用就可以了,但是生成的函数指示符将立即转换回函数指针 从这里的答案: 取消引用(按照您的想法)函数的指针意味着:访问CODE内存,因为它就像是DATA内存。 不能以这种方式取消对函数指针的引用。相反,它被称为。 我将使用“取消引用”和“调用”的名称。没关系。 无论如何:C的设计方式使得函数名称标识符以及变量保存函数的指针都具有相同的指向CODE存储器的地址。并且它允许通过在标识符或变量上使用call()语法跳转到该内存。 函数指针的取消引用到底如何工作?


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.