c中的地址类型和指针

问题描述 投票:-4回答:3

我在c中有两个关于指针的问题。

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

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

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

另外因为地址的类型是int*,我相信这只是一个int*(和void *)指针可以指向地址的原因(它们是相同的类型)。

有什么想法吗?评论?我不知道我是否正确。

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

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

现在我有一个功能:

void * foo(some parameters)
{
  // just for this example let's say that i return tha 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*类型。

这里发生了什么?

c pointers memory-address
3个回答
1
投票

根据C标准(6.3.2.3指针)

1指向void的指针可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void的指针,然后再返回;结果应该等于原始指针。

例如,在此代码段中

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

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


1
投票

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

2)指向数据的类型保持int,无论指向它的指针是什么类型。 (这在形式C中称为有效类型。)在您的示例中,您返回一个void指针,这是调用者获得的类型。从你做void *ptr=&k;及以后的那一点来看,它所指出的类型的信息都会丢失。这就是为什么void指针使用有问题的原因。


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.