标签: pointers

在Objective-C中有两个星号**是什么意思?

我明白有一个星号*是指针,有两个**是什么意思?

我从文档中偶然发现了这个:

- (NSAppleEventDescriptor *)executeAndReturnError:(NSDictionary **)errorInfo
Run Code Online (Sandbox Code Playgroud)

pointers objective-c

14
推荐指数
1
解决办法
9788
查看次数

在C中分配矩阵

我想分配一个矩阵.

这是唯一的选择:

int** mat = (int**)malloc(rows * sizeof(int*))

for (int index=0;index<row;++index)
{
    mat[index] = (int*)malloc(col * sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)

c malloc pointers matrix

14
推荐指数
3
解决办法
7万
查看次数

Java中的函数指针数组

我已经阅读了这个问题,我仍然不知道是否有可能继续指向方法Java中的数组,如果任何人知道,如果这是可能的,或者不是这将是一个真正的帮助.我正试图找到一个优雅的解决方案,保持一个字符串列表和相关的功能,而不会写出数百个'if'的混乱.

干杯

java arrays pointers function

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

指针默认值.?

看,

  typedef struct jig 
   { 
         int *a;
         int *b;
   }temp;
Run Code Online (Sandbox Code Playgroud)

现在第1阶段:

temp *b;
b= (temp*)malloc(sizeof(temp));

if(b->a != NULL)
    printf("a is not null\n");
else
    printf("a is null\n");
if(b->b != NULL)
    printf("b is not null\n");
else
    printf("b is null\n");
Run Code Online (Sandbox Code Playgroud)

输出是:

a is null
b is null
Run Code Online (Sandbox Code Playgroud)

现在第2阶段:

temp b;

if(b.a != NULL)
    printf("a is not null\n");
else
    printf("a is null\n");
if(b.b != NULL)
    printf("b is not null\n");
else
    printf("b is null\n");
Run Code Online (Sandbox Code Playgroud)

输出是:

a is not null
b is not null …
Run Code Online (Sandbox Code Playgroud)

c pointers

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

将Objective-C对象作为void*指针传递给函数

我有一个功能:

  myFunction (MyProc callback, void * ref)
Run Code Online (Sandbox Code Playgroud)

从Objective-C类中调用此函数.该函数传递一个指向回调(类中的函数)和引用的指针.引用是必要的,因为回调是静态调用的,因此没有上下文.ref可用于为回调提供上下文.

我希望能够传递Objective-C类作为参考.所以问题是:

如何将NSObject转换为void*以及如何将void*转换为NSObject.

提前致谢.

pointers casting objective-c callback

14
推荐指数
2
解决办法
1万
查看次数

在通过参考传递参数时可以放置&符号"&"?

在我看到的示例中,参数通过以下方式通过引用传递:

void AddOne(int &y)
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我看到以下语法:

void AddOne(int& y)
Run Code Online (Sandbox Code Playgroud)

我想知道它是否相同或第二种情况与第一种情况有所不同.

c++ pointers reference declaration

14
推荐指数
1
解决办法
4962
查看次数

在C中重用释放的指针

本网站上有很多关于在使用后释放指针的问题,并且进一步将它们设置为NULL.争论很激烈,主题看似平分.例如:这个问题.一般来说,我对释放指针很困惑.

想象一下,你有一个指向一些内存空间的指针.使用空格后,释放指针但不要将其设置为NULL.稍后,你有另一个指针调用malloc(),或者一些模拟,并且它被分配了内存,包括先前释放的内存(原始指针仍然指向).如果这个新指针写入此内存块,会发生什么?直觉上什么都不会发生,但前面提供的链接中的OP写道它会使程序崩溃.


所以我的问题是:

  1. 给定一个释放指针,是什么阻止您将指针重新分配给新的内存位置?为什么重用已释放的指针是"坏"的做法?如果调用free(ptr)只将此内存返回给操作系统,为什么不能将指针重新分配给其他内存位置并重新使用?

    char *ptr = malloc(sizeof(*ptr)); //first allocation
    free(ptr); //release memory 
    ptr = NULL; 
    ptr = malloc(sizeof(*ptr)); //reallocate
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为什么要写入以前释放的内存块,仍然有原始指针,导致程序崩溃? - 请参阅上面链接的问题的第一篇文章的第一段(如果我误解了本段的意图,请解释,因为不明确是否再次使用该指针来写入内存或创建新指针.)

c free pointers

14
推荐指数
1
解决办法
9052
查看次数

是否允许编译器回收释放的指针变量?

有人声称

编译器可以自由地将指针变量重用于其他目的之后 realloc 被释放,所以你不能保证它具有与之前相同的价值

void *p = malloc(42);
uintptr_t address = (uintptr_t)p;
free(p);

// [...] stuff unrelated to p or address

assert((uintptr_t)p == address);
Run Code Online (Sandbox Code Playgroud)

可能会失败.

C11附件J.2读

使用指向通过调用free或realloc函数释放的空间的指针的值(7.22.3)[ 未定义 ]

但附件当然不是规范性的.

附件L.3(规范性的,但可选的)告诉我们,如果

使用指向通过调用free或realloc函数解除分配的空间的指针的值(7.22.3).

结果被允许是关键的未定义行为.

这证实了这一说法,但我希望从标准本身而不是附件中看到适当的引用.

c free pointers standards-compliance compiler-optimization

14
推荐指数
1
解决办法
877
查看次数

将nil接口转换为Golang中某些东西的指针?

在下面的代码片段中,尝试将nil接口转换为某个东西的指针失败,并出现以下错误: interface conversion: interface is nil, not *main.Node

type Nexter interface {
    Next() Nexter
}

type Node struct {
    next Nexter
}

func (n *Node) Next() Nexter {...}

func main() {
    var p Nexter

    var n *Node
    fmt.Println(n == nil) // will print true
    n = p.(*Node) // will fail
}
Run Code Online (Sandbox Code Playgroud)

点击此处播放链接:https://play.golang.org/p/2cgyfUStCI

为什么这会完全失败?这完全有可能

n = (*Node)(nil)
Run Code Online (Sandbox Code Playgroud)

,所以我想知道如何从nil接口开始实现类似的效果.

pointers interface go

14
推荐指数
1
解决办法
2万
查看次数

是否创建了一个超出非数组指针结尾的指针,该指针不是从C++ 17中的一元运算符和未定义行为派生的?

C++ 17标准似乎说如果指针指向数组元素,则只能将一个整数添加到指针中,或者,作为特殊异常,指针是一元运算符的结果&:

8.5.6 [expr.add]描述对指针的添加:

当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型.如果表达式P指向具有n个元素的数组对象 x的元素x [i] ,则表达式P + J和J + P(其中J具有值j)指向(可能是假设的)元素x [i + j]如果0≤i+j≤n; 否则,行为未定义.

该引言包括一个非规范的脚注:

为此目的,不是数组元素的对象被认为属于单元素数组; 见8.5.2.1

引用8.5.2.1 [expr.unary.op]讨论一元运算&符:

一元&运算符的结果是指向其操作数的指针...出于指针运算(8.5.6)和比较(8.5.9,8.5.10)的目的,一个不是数据元素的对象,其地址被采用以这种方式被认为属于具有T类型的一个元素的数组.

非规范性脚注似乎有些误导,因为它引用的部分描述了一元运算符结果的特定行为&.似乎没有任何东西允许其他指针(例如来自非数组new)被认为是单元素数组.

这似乎表明:

void f(int a) {
    int* z = (new int) + 1; // undefined behavior
    int* w = &a + 1; // ok
}
Run Code Online (Sandbox Code Playgroud)

这是对C++ 17所做更改的疏忽吗?我错过了什么吗?是否有理由认为"单元素数组规则"仅针对一元运算符提供&

注意:如标题中所述,此问题特定于C++ 17.C标准和C++标准的早期版本包含不再存在的明确的规范性语言.像这样的老问题模糊不清楚.

c++ arrays pointers language-lawyer c++17

14
推荐指数
1
解决办法
292
查看次数