``` void *p1 char *pc=p1```为什么不写成 void *p1 char*pc=*p1
时间: 2024-09-08 12:03:52 浏览: 90
在C语言中,`void *` 类型的指针是一种特殊的指针类型,它可以指向任何类型的数据,但不能直接进行解引用操作,因为它没有具体的类型信息。`void *` 通常用于泛型指针,在进行实际操作前需要被转换为具体类型的指针。
在您给出的第一个例子中:
```c
void *p1;
char *pc = p1;
```
这里声明了一个 `void *` 类型的指针 `p1`,然后声明了一个 `char *` 类型的指针 `pc` 并将其初始化为 `p1` 的值。这里并没有进行解引用,只是将 `p1` 的值赋给了 `pc`。`pc` 现在持有 `p1` 指向的地址。
而在您给出的第二个例子中:
```c
void *p1;
char *pc = *p1;
```
这将导致编译错误,因为 `*p1` 尝试解引用 `p1`,但 `p1` 是 `void *` 类型,不能直接解引用。此外,即使 `p1` 不是 `void *` 类型,如果它没有被正确初始化,解引用一个未初始化的指针也是危险的,可能会导致运行时错误。
正确的做法是在进行解引用之前,首先确保 `void *` 类型的指针指向了正确的类型,并且已经被正确初始化。然后通过类型转换将其转换为相应的类型指针后进行解引用,例如:
```c
void *p1;
// 假设 p1 被正确初始化并指向了某个 char 类型的数据
char *pc = (char *)p1; // 进行类型转换
*pc = 'a'; // 现在可以安全地解引用并赋值
```
这样,`pc` 就指向了 `p1` 所指向的地址,并且能够通过 `pc` 来操作该地址处的数据。
阅读全文