【问题标题】:Type of address and pointers in cc中的地址类型和指针
【发布时间】:2018-01-17 10:11:06
【问题描述】:

我有 2 个关于 c 指针的问题。

1) 据我了解,& 返回变量的内存地址。例如:

int x=10;    
int *p=&x; 

所以我认为& 将返回x 的内存地址,并且该内存地址是int* 类型,因为x 的变量类型是int

还因为地址的类型是int*,我相信这就是只有int*(和void *)指针才能指向地址的原因(它们是相同的类型)。

对此有什么想法吗?厘米?我不知道我是否正确。

2) 关于 void 指针。我知道void* 指针可以指向任何类型的变量。例如

int x=10;
void *ptr=&x;   

现在我有一个函数:

void * foo(some parameters)
{
  // just for this example let's say that I return the address of a local variable

  // I know that is wrong to do so because when the foo ends
  // the local variables deallocate

  int k=10;
  void *ptr=&k;
  return ptr;    
}

所以我的指针是void 类型,但它指向int* 内存地址。所以ptr 将保存k 的地址,当我返回ptr 时返回k 的地址,即int* 类型。但我的函数是输入void*

这里发生了什么?

【问题讨论】:

  • 请编辑您的问题并修正代码格式和缩进。
  • 请一次只问一个问题。
  • 你展示的函数返回的指针是无效的,因为它指向函数内部的一个局部变量,而该变量的生命周期在函数结束时结束。
  • 有点话题,但是将指针返回到局部变量是个坏主意,请阅读this

标签: c pointers memory-address


【解决方案1】:

根据 C 标准(6.3.2.3 指针)

1 指向 void 的指针可以转换为指向任何 对象类型。指向任何对象类型的指针都可以转换为 指向 void 并再次返回的指针;结果应比较等于 原始指针。

例如在这段代码中,sn-p

int x = 10;
void *p = &x;

赋值右侧的表达式&x 的类型为int *。根据引用,它可能会转换为赋值左侧的void * 类型的指针。

【讨论】:

    【解决方案2】:

    1) 是的,所有这些都是正确的。

    2) 指向数据的类型保持int,不管指向它的指针是什么类型。 (这在正式的 C 中称为 有效类型。)在您的示例中,您返回一个 void 指针,这就是调用者获得的类型。从您执行void *ptr=&k; 起,它指向的类型的信息就会丢失。这就是为什么 void 指针使用起来有问题。

    【讨论】:

      【解决方案3】:

      1) 你是对的 2) 它只是返回一个指向kvoid * - 一个局部变量。 (任何指针都可以转换为 void 指针)。

      你说你不应该使用返回值是正确的,因为k 不再存在

      【讨论】:

        猜你喜欢
        • 2021-12-24
        • 2020-07-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 2013-07-12
        • 2013-11-05
        • 1970-01-01
        相关资源
        最近更新 更多