标签: dereference

为什么解除引用运算符(*)也用于声明指针?

我不确定这是否是一个正确的编程问题,但它总是困扰我,我想知道我是否是唯一的.

在最初学习C++时,我理解了引用的概念,但指针让我感到困惑.你为什么问?因为你如何声明一个指针.

考虑以下:

void foo(int* bar)
{
}


int main()
{
    int x = 5;
    int* y = NULL;

    y = &x;
    *y = 15;     
    foo(y);

}
Run Code Online (Sandbox Code Playgroud)

该函数foo(int*)将int指针作为参数.由于我已经声明y为int指针,我可以传递y给foo,但是当我第一次学习C++时,我将*符号与解除引用相关联,因此我认为int需要传递一个解引用.我会试图通过*y进入foo,这显然是行不通的.

用一个单独的运算符来声明指针会不会更容易?(或用于解除引用).例如:

void test(int@ x)
{
}
Run Code Online (Sandbox Code Playgroud)

c++ syntax pointers notation dereference

53
推荐指数
6
解决办法
6195
查看次数

C编程:解除指向不完整类型错误的指针

我有一个结构定义为:

struct {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} stasher_file;
Run Code Online (Sandbox Code Playgroud)

以及指向这些结构的指针数组:

struct stasher_file *files[TOTAL_STORAGE_SIZE];
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我正在指向结构并设置其成员,并将其添加到数组中:

 ...
 struct stasher_file *newFile;
 strncpy(newFile->name, name, 32);
 newFile->size = size;
 newFile->start = first_free;
 newFile->popularity = 0;
 files[num_files] = newFile;
 ...
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:取消引用指向不完整类型的指针

每当我试图访问里面的成员newFile.我究竟做错了什么?

c struct dereference

40
推荐指数
4
解决办法
21万
查看次数

在函数调用中使用多个星号有什么用?

我想不出函数调用中多个星号的任何实际用法:

void foo(int a, char b)
{

}

int main(void)
{
    (**************foo)(45, 'c');

    //or with pointer to function:
    void (*ptr)(int, char) = foo;
    (******ptr)(32, 'a');
}
Run Code Online (Sandbox Code Playgroud)

为什么在C和C++中都允许这个东西?

c c++ function-pointers function-call dereference

36
推荐指数
3
解决办法
2141
查看次数

取消引用指针会复制它吗?

是否取消引用指针并将其传递给通过引用获取其参数的函数会创建该对象的副本?

c++ pointers dereference

35
推荐指数
3
解决办法
1万
查看次数

如何理解C中的指针星*?

我正在努力使用指针符号*,我发现它在声明和表达式中的使用方式非常混乱.

例如:

int *i; // i is a pointer to an int
Run Code Online (Sandbox Code Playgroud)

但是语法背后的逻辑是什么?*之前的*是什么意思?我们来看下面的例子.请纠正我错在哪里:

char **s;
char *(*s); // added parentheses to highlight precedence
Run Code Online (Sandbox Code Playgroud)

这就是我失去轨道的地方.parantheses之间的*s意味着:s是一个指针?但指针是什么?括号外的*是什么意思:指向s指向的指针?

所以这个意思是:指向s指向的指针是指向char的指针?

我不知所措.*符号在声明和表达式中的解释是否不同?如果是这样,它的解释方式有何不同?我哪里错了?

c pointers dereference

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

当解除引用运算符(*)过载时,*this的使用是否受到影响?

例如,

class Person{
        string name;
    public:
        T& operator*(){
            return name;
        }
        bool operator==(const Person &rhs){
            return this->name == rhs.name;
        }
        bool operator!=(const Person &rhs){
            return !(*this == rhs); // Will *this be the string name or the Person?
        }
}
Run Code Online (Sandbox Code Playgroud)

如果*this最终提领this的string,而不是一个Person,是有维持的使用一种解决方法*作为类外引用操作?

如果我*不放弃而不放弃使用,那将是一个很大的障碍*this.

c++ pointers operator-overloading this dereference

27
推荐指数
2
解决办法
2054
查看次数

C#Namespace Alias限定符(::) vs解除引用运算符(.)

快速而简单的问题.我有点理解命名空间别名限定符的作用,它用于访问命名空间中的成员,但解除引用操作符也是如此.我对这种情况的不同感到困惑,为什么你会使用一个而不是另一个,或者他们各自如何完成同样的事情.

using colAlias = System.Collections;

namespace myns
{
    class TestApp
    {
        static void Main()
        {
            colAlias.Hashtable test = new colAlias.Hashtable();
            colAlias::Hashtable test1 = new colAlias::Hashtable();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# namespaces global dereference

26
推荐指数
2
解决办法
2907
查看次数

为什么打印指针打印与打印取消引用指针相同?

来自Rust指南:

要取消引用(获取引用的值而不是引用本身)y,我们使用星号(*)

所以我做到了:

fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}", x, *ptr_y);
}
Run Code Online (Sandbox Code Playgroud)

即使没有明确的解引用,这也给了我相同的结果(x = 1; y = 1):

fn main() {
    let x = 1;
    let ptr_y = &x;
    println!("x: {}, ptr_y: {}", x, ptr_y);
}
Run Code Online (Sandbox Code Playgroud)

为什么?不应该ptr_y打印内存地址并*ptr_y打印1?是否有某种自动解除引用或者我错过了什么?

pointers dereference rust

26
推荐指数
2
解决办法
6537
查看次数

在Delphi/Free Pascal中:是一个运算符还是它只是表示一个指针类型?

在Delphi/Free Pascal中:是一个运算符还是它只是表示一个指针类型?

示例代码

program Project1;

{$APPTYPE CONSOLE}

var
    P: ^Integer;

begin
    New(P);

    P^ := 20;
    writeln(P^); // How do I read this statement aloud? P is a pointer?

    Dispose(P);

    readln;
end
Run Code Online (Sandbox Code Playgroud)

delphi pascal pointers dereference

25
推荐指数
1
解决办法
9798
查看次数

为newtypes实现Deref被认为是一种不好的做法吗?

我经常使用newtype模式,但我厌倦了写作my_type.0.call_to_whatever(...).我很想实现这个Deref特性,因为它允许编写更简单的代码,因为我可以使用我的newtype,好像它在某些情况下是底层类型,例如:

use std::ops::Deref;

type Underlying = [i32; 256];
struct MyArray(Underlying);

impl Deref for MyArray {
    type Target = Underlying;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn main() {
    let my_array = MyArray([0; 256]);

    println!("{}", my_array[0]); // I can use my_array just like a regular array
}
Run Code Online (Sandbox Code Playgroud)

这是一种好的还是坏的做法?为什么?可能是什么缺点?

dereference rust

24
推荐指数
2
解决办法
2542
查看次数