我在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标准(6.3.2.3指针)
1指向void的指针可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向void的指针,然后再返回;结果应该等于原始指针。
例如,在此代码段中
int x = 10;
void *p = &x;
赋值右侧的表达式&x
的类型为int *
。根据引用,它可以转换为赋值左侧void *
类型的指针。
1)是的,所有这些都是正确的。
2)指向数据的类型保持int
,无论指向它的指针是什么类型。 (这在形式C中称为有效类型。)在您的示例中,您返回一个void指针,这是调用者获得的类型。从你做void *ptr=&k;
及以后的那一点来看,它所指出的类型的信息都会丢失。这就是为什么void指针使用有问题的原因。
1)你是正确的2)它只是返回一个指向void *
的k
- 一个局部变量。 (任何指针都可以转换为void指针)。
你说你不应该使用返回的值是正确的,因为k
不再存在