标签: pointers

指针和参考文献之间的真正区别是什么?

AKA - 对指针的这种迷恋是什么?

只使用了ActionScript,Java和C#这样的现代面向对象语言,我并不真正理解指针的重要性以及它们的用途.我在这里错过了什么?

c pointers reference

29
推荐指数
6
解决办法
5982
查看次数

什么是近,远和巨大的指针?

任何人都可以用适当的例子向我解释这些指针......当这些指针被使用时?

c c++ x86 pointers x86-16

29
推荐指数
3
解决办法
2万
查看次数

增加HashMap中的整数

我是否必须返回该对象然后再添加一个新对象?或者我可以直接增加?

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)

java pointers reference hashmap

29
推荐指数
5
解决办法
4万
查看次数

传递指针参数,在C++中传递值?

传递指针参数,在C++中传递值?因为我看到指针的任何更改都不会反映在方法之外.我通过解除引用指针所做的更改会被反映出来.

在这种情况下,使用指针指向函数的参数是否可以接受/标准过程来修改函数中的指针值?

c++ pointers function pass-by-value

29
推荐指数
2
解决办法
3万
查看次数

指针数组

我正在尝试实现一个指针数组,以便我可以遍历元素.但是我不确定如何正确地做到这一点:

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(标量指针).实现这个的正确方法是什么?

谢谢.

arrays fortran pointers fortran90

29
推荐指数
1
解决办法
6184
查看次数

为什么unique_ptr <T>(T*)是显式的?

以下函数无法编译:

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*)明确的理由是什么?

c++ pointers type-conversion unique-ptr c++11

29
推荐指数
2
解决办法
1589
查看次数

表达式"(ptr == 0)!=(ptr ==(void*)0)"真的可以吗?

我在@jsantander评论中链接到的论坛帖子中读到了这个说法:

请记住,当您将指针指定或比较为零时,会在幕后发生一些特殊的魔法,以便为给定指针使用正确的模式(实际上可能不为零).这就是为什么之类的东西的原因之一#define NULL (void*)0是邪恶的-如果比较char*NULL那个魔法已明确(可能不知不觉)关闭,无效结果可能发生.只是为了清楚:

(my_char_ptr == 0) != (my_char_ptr == (void*)0)
Run Code Online (Sandbox Code Playgroud)

所以我理解它的方式,对于一个架构,其中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)

这就是我理解这个论坛帖子的主张.

c++ pointers

29
推荐指数
4
解决办法
2083
查看次数

使用全局命名空间限定符和指向数据成员的指针

在结构上包含全局命名空间限定符时,尝试使用指向数据成员指针时遇到编译错误.我已将代码缩减为以下内容,其工作原理如下:

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++ pointers

29
推荐指数
1
解决办法
1032
查看次数

当 NULL 不是全零位时,全零位指针值是否也是“假”?

我知道 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)

c null pointers undefined-behavior language-lawyer

29
推荐指数
2
解决办法
1505
查看次数

为什么不切换指针?

例如:

#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)

c pointers switch-statement

28
推荐指数
6
解决办法
2万
查看次数