请,如果有人知道这是什么问题告诉我
#include"stdio.h"
void main() {
int a = 10;
int* p = &a;
void** q = &p;
printf("memory address=%d\n",(int*)*q);
}
这是编译器错误:
警告:从不兼容的指针初始化 类型[-Wincompatible-指针类型] 无效** q =&p;
ptr3.c:7:25:警告:格式为'%d'的类型为'int'的参数,但是 参数2的类型为'int '[-Wformat =] printf(“内存 地址=%d \ n“,(int )* q); 〜^ ~~~~~~~~~ %ls
编译器是否想说我不能使用int
指针指向void
类型的指针?
答案 0 :(得分:1)
编译器是否想说我不能使用 空指针?
void ** q
的类型为void **
,而int * p
的类型为int *
。因此,以下行:void ** q = &p;
由于类型不兼容,因此向编译器发出警告。
如果您将&p
强制转换为void *
,则问题中的警告将消失:void ** q = (void *)&p;
此行:printf("memory address=%d\n",(int*)*q);
也应引起编译器警告,因为(int *)*q
的类型为int *
,但是%d
格式说明符期望的是int
。如果您使用格式说明符%p
,则该警告也会消失。