AKA - 对指针的这种迷恋是什么?
只使用了ActionScript,Java和C#这样的现代面向对象语言,我并不真正理解指针的重要性以及它们的用途.我在这里错过了什么?
我是否必须返回该对象然后再添加一个新对象?或者我可以直接增加?
Integer temp = myMap.get(key);
temp++;
myMap.put(key, temp);
Run Code Online (Sandbox Code Playgroud)
没有办法做到这一点(这不起作用):
myMap.get(key)++;
Run Code Online (Sandbox Code Playgroud) 传递指针参数,在C++中传递值?因为我看到指针的任何更改都不会反映在方法之外.我通过解除引用指针所做的更改会被反映出来.
在这种情况下,使用指针指向函数的参数是否可以接受/标准过程来修改函数中的指针值?
我正在尝试实现一个指针数组,以便我可以遍历元素.但是我不确定如何正确地做到这一点:
TYPE(domain),POINTER :: d01,d02,d03
TYPE(domain),DIMENSION(:),POINTER :: dom
...
dom(1) => d01
dom(2) => d02
dom(3) => d03
...
Run Code Online (Sandbox Code Playgroud)
然后:
...
IF(ASSOCIATED(dom(2),d02))THEN
...
Run Code Online (Sandbox Code Playgroud)
编译器(x86-64 Linux -tp istanbul-64上的pgf90 10.6-0 64位目标)给出了以下错误消息:
PGF90-S-0074-Illegal number or type of arguments to associated - keyword argument pointer (test_ptr.f90: 10)
0 inform, 0 warnings, 1 severes, 0 fatal for MAIN
Run Code Online (Sandbox Code Playgroud)
据我所知,如何对指针数组进行子集化是有问题的.两个dom(2)和d02是秩0(标量指针).实现这个的正确方法是什么?
谢谢.
以下函数无法编译:
std::unique_ptr<int> foo()
{
int* answer = new int(42);
return answer;
}
std::unique_ptr<int> bar()
{
return new int(42);
}
Run Code Online (Sandbox Code Playgroud)
我觉得这有点不方便.std::unique_ptr<T>(T*)明确的理由是什么?
我在@jsantander评论中链接到的论坛帖子中读到了这个说法:
请记住,当您将指针指定或比较为零时,会在幕后发生一些特殊的魔法,以便为给定指针使用正确的模式(实际上可能不为零).这就是为什么之类的东西的原因之一
#define NULL (void*)0是邪恶的-如果比较char*到NULL那个魔法已明确(可能不知不觉)关闭,无效结果可能发生.只是为了清楚:Run Code Online (Sandbox Code Playgroud)(my_char_ptr == 0) != (my_char_ptr == (void*)0)
所以我理解它的方式,对于一个架构,其中NULL指针,比如0xffff代码if (ptr),将比较ptr 0xffff而不是0.
这是真的吗?它是用C++标准描述的吗?
如果为true,则意味着即使对于具有非零NULL指针值的体系结构,也可以安全地使用0.
编辑
作为额外的澄清,请考虑以下代码:
char *ptr;
memset(&ptr, 0, sizeof(ptr));
if ((ptr == (void*)0) && (ptr != 0)) {
printf("It can happen.\n");
}
Run Code Online (Sandbox Code Playgroud)
这就是我理解这个论坛帖子的主张.
在结构上包含全局命名空间限定符时,尝试使用指向数据成员的指针时遇到编译错误.我已将代码缩减为以下内容,其工作原理如下:
namespace foo {
using sausage = int;
struct bar { sausage baz; };
}
auto chuckle(foo::bar barry, ::foo::sausage foo::bar::*paul) {
return barry.*paul;
}
int main() {
return chuckle(foo::bar{5}, &foo::bar::baz);
}
Run Code Online (Sandbox Code Playgroud)
如果我现在将全局命名空间限定符添加到bar参数中的结构chuckle:
auto chuckle(foo::bar barry, ::foo::sausage ::foo::bar::*paul) {
// ^~ added ::
return barry.*paul;
}
Run Code Online (Sandbox Code Playgroud)
...然后它不再编译并失败并出现以下错误:
10 : <source>:10:37: error: 'foo::sausage' is not a class, namespace, or enumeration
auto chuckle(foo::bar barry, ::foo::sausage ::foo::bar::*paul) {
^~~~~~~
10 : <source>:10:57: error: expected …Run Code Online (Sandbox Code Playgroud) 我知道 C 编译器不需要对 的位表示使用全零NULL,但标准要求它们* *NULL在布尔上下文/比较中使评估为假。因此,下面程序中的第二个 printf将始终输出false.
但我想知道的是:在系统中NULL是*不*全零,将指针值*是*全部为零也值为false布尔上下文/比较?换句话说,将在第一个 printf在下面不断输出的程序true?
或者以稍微不同的方式提问:我可以依靠calloc生成一个在布尔上下文/比较中始终评估为 false 的指针值吗?这个问题的第一个答案用于memset清除long*named的位y,然后继续说这y==0是 UB 因为y可能是“陷阱表示”(无论是什么)。 calloc也只是清除位,所以也许o->p第一个 printf也是UB?
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct { void * p; } obj;
int main() {
obj * o = calloc(sizeof(obj), 1);
assert(o); // assume successful …Run Code Online (Sandbox Code Playgroud) 例如:
#include <stdio.h>
void why_cant_we_switch_him(void *ptr)
{
switch (ptr) {
case NULL:
printf("NULL!\n");
break;
default:
printf("%p!\n", ptr);
break;
}
}
int main(void)
{
void *foo = "toast";
why_cant_we_switch_him(foo);
return 0;
}
gcc test.c -o test
test.c: In function 'why_cant_we_switch_him':
test.c:5: error: switch quantity not an integer
test.c:6: error: pointers are not permitted as case values
Run Code Online (Sandbox Code Playgroud)
只是好奇.这是技术限制吗?
人们似乎认为只有一个常量指针表达式.这是真的吗?举例来说,这里是在Objective-C(一种常见的范例是真的是仅含有C除了NSString,id并且nil,这仅仅是一个指针,所以它仍然是相关的-我只是想指出,有是,事实上,一个共同的使用它,尽管这只是一个技术问题):
#include <stdio.h>
#include <Foundation/Foundation.h>
static NSString * const kMyConstantObject = @"Foo";
void why_cant_we_switch_him(id ptr) …Run Code Online (Sandbox Code Playgroud)