根据ISO C ++,取消引用空指针是未定义的行为。 我的好奇心是,为什么? 为什么标准决定宣布它未定义的行为? 这个决定背后的理由是什么? 编译器依赖? 似乎没有,因为根据C99标准,据我所知,这是明确的。 机器依赖? 有任何想法吗?
指针的值是一个variables的地址。 在int指针增加1后,为什么int pointer值增加了4个字节。 在我看来,我认为指针增量后指针的值(variables地址)只增加1个字节。 testing代码: int a = 1, *ptr; ptr = &a; printf("0x%X\n", ptr); ptr++; printf("0x%X\n", ptr); 预期产出: 0xBF8D63B8 0xBF8D63B9 其实输出: 0xBF8D63B8 0xBF8D63BC 编辑 : 另外一个问题 – 如何访问一个int占用的4个字节?
我已经看过谷歌的答案,但我不满意。 我的逻辑: Java使用内存位置,它只是在幕后,你无法看到或访问它(据我所知,可能有访问它们的方式,我不知道)。 我的困惑/问题: 在像Java这样的编程语言中没有指针的目的是什么,专门为在任何系统上使用互联网而devise的,还是像c ++这样的使用指针的编程语言? 编辑 你们中的许多人都在说“保持简单”。 如果是这样的话,为什么像c++这样的stream行编程语言仍然使用指针呢?
通过指针的内存访问被认为比通过数组的内存访问更有效率。 我正在学习C,上面的内容在K&R中有说明。 具体他们说 任何可以通过数组下标来实现的操作也可以用指针来完成。 指针版本通常会更快 我使用visual C ++拆分了下面的代码(Mine是一个686处理器,我禁用了所有的优化)。 int a[10], *p = a, temp; void foo() { temp = a[0]; temp = *p; } 令我惊讶的是,我发现通过指针访问内存需要3条指令才能通过数组访问内存。 以下是相应的代码。 ; 5 : temp = a[0]; mov eax, DWORD PTR _a mov DWORD PTR _temp, eax ; 6 : temp = *p; mov eax, DWORD PTR _p mov ecx, […]
我刚刚开始学习Objective-C,来自VB .Net和C#.Net背景。 我理解指针的用法,但是在Objective-C的例子中,我看到星号被放置在几个不同的地方,并且尽可能地search,我还没有find答案。 我尝试的每一个search都会提供关于指针的各种解释(我真的不需要),但没有提到星号不同位置的原因/效果。 以下是我见过的一些例子: NSString *string; NSString * string; (NSString *) string; NSString* string; 星号的这些不同的位置是什么意思? 我相信这是一个简单的答案,但是令人沮丧的是无法在任何Apple教程和参考文档中find它,或者到目前为止在线。 有人能结束我的痛苦,并回答这个令人困惑的问题吗? 谢谢!
在最近的Slashdot访谈中, Linus Torvalds给出了一个例子,说明一些人如何以某种方式使用指针,表明他们不知道如何正确使用它们。 不幸的是,由于我是他所谈论的人之一,我也不了解他的例子: 我见过很多人通过跟踪“prev”条目来删除单链表条目,然后删除条目,做类似 if (prev) prev->next = entry->next; else list_head = entry->next; 每当我看到这样的代码,我只是去“这个人不明白指针”。 可悲的是,这很常见。 理解指针的人只是使用“指向入口指针的指针”,并用list_head的地址初始化它。 然后当他们遍历列表,他们可以删除条目,而不使用任何条件,只是做 *pp = entry->next 有人可以提供更多的解释,说明为什么这种方法更好,以及如何在没有条件陈述的情况下工作?
目前,我正在尝试创build一个使用CUDAfunction的Java应用程序。 CUDA和Java之间的连接工作正常,但我有另一个问题,并想问,如果我的想法是正确的。 当我从Java调用本地函数时,我将一些数据传递给它,函数计算一些东西并返回结果。 是否有可能,让第一个函数返回一个引用(指针)这个结果,我可以传递给JNI并调用另一个函数,进一步计算结果? 我的想法是通过将数据保留在GPU内存中,并将参考传递给GPU,从而减less将数据复制到GPU以及从GPU复制数据的开销,以便其他function可以使用它。 尝试一段时间后,我想我自己,这应该是不可能的,因为应用程序结束后(在这种情况下,当C函数终止)指针被删除。 它是否正确? 或者我只是在C坏了看到解决scheme? 编辑:好,扩大一点问题(或者更清楚地说):当函数结束时,由JNI原生函数分配的内存是否被释放? 或者我仍然可以访问它,直到JNI应用程序结束或当我手动释放它? 感谢您的input :)
我注意到有些人使用下面的符号来声明指针variables。 (a) char* p; 代替 (b) char *p; 我用(b)。 符号(a)的理性是什么? 符号(b)对我更有意义,因为字符指针本身不是一个types。 相反,types是字符,variables可能是一个指向字符的指针。 char* c; 这看起来像有一个types的char *,variablesc是这种types。 但实际上,types是char和* c(由c指向的内存位置)是该types的(char)。 如果你一次声明多个variables,这个区别就变得很明显了。 char* c, *d; 这看起来很奇怪。 c和d都是指向一个字符的指针。 在这之后,下一个看起来更自然。 char *c, *d; 谢谢。
点( . )运算符用于访问结构的成员,而C中的箭头运算符( -> )用于访问由所讨论的指针引用的结构的成员。 指针本身没有任何可以用点运算符访问的成员(实际上它只是一个描述虚拟内存中的位置的数字,所以它没有任何成员)。 所以,如果我们只是定义了点运算符,如果指针(编译器在编译时已知的信息)上使用它,就会自动解引用指针。 那么为什么语言创作者决定通过添加这个看似不必要的操作符来使事情更加复杂呢? 什么是大devise决定?
例: bool isHeapPtr(void* ptr) { //… } int iStack = 35; int *ptrStack = &iStack; bool isHeapPointer1 = isHeapPtr(ptrStack); // Should be false bool isHeapPointer2 = isHeapPtr(new int(5)); // Should be true /* I know… it is a memory leak */ 为什么,我想知道这一点: 如果我有一个类的成员指针,我不知道指针对象是否新分配。 然后,我应该使用这样的实用程序来知道是否必须delete指针。 但: 我的devise还没有制定。 所以,我将这样编程,我总是要delete它。 我要避免垃圾程序