C语言难点解析之void *类型指针转换成二级指针的操作
2018-02-26 23:27
811 查看
在群里看到小伙伴贴了一段代码如下:
![](http://img.blog.csdn.net/20180226173232105)
P为void *类型的指针,并且使用calloc分配好了内存,第二个红框内的内容该怎么理解呢?
我的理解是,这里先将p强转成类型为Base的二级指针,然后“*”表示解这个二级指针(取P的值),由于p是个二级指针,(const Base **) p就是P指向的之前calloc分配的那块内存首地址,*(const Base **) p的值为之前malloc分配内存的值,*(const Base **)p = base ;就是将base的值赋给malloc分配的内存的值。所以最后*p 里保存的是base的值。
下面写个demo验证下我的想法:#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a = 100;
void *p = malloc(sizeof(int));
*(int **)p = &a;
printf("the addr of a is %p\n",&a);
printf(" *p is %p\n",(unsigned int *)*(int *)p);
//(*(int *)p) 正好是&a的值,这个值是地址,所以还需要再强转成int*型,最后再用*取值
printf(" **p is %d\n",*((int *)(*(int *)p)));
return 0;
}
结果如下:
P为void *类型的指针,并且使用calloc分配好了内存,第二个红框内的内容该怎么理解呢?
我的理解是,这里先将p强转成类型为Base的二级指针,然后“*”表示解这个二级指针(取P的值),由于p是个二级指针,(const Base **) p就是P指向的之前calloc分配的那块内存首地址,*(const Base **) p的值为之前malloc分配内存的值,*(const Base **)p = base ;就是将base的值赋给malloc分配的内存的值。所以最后*p 里保存的是base的值。
下面写个demo验证下我的想法:#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a = 100;
void *p = malloc(sizeof(int));
*(int **)p = &a;
printf("the addr of a is %p\n",&a);
printf(" *p is %p\n",(unsigned int *)*(int *)p);
//(*(int *)p) 正好是&a的值,这个值是地址,所以还需要再强转成int*型,最后再用*取值
printf(" **p is %d\n",*((int *)(*(int *)p)));
return 0;
}
结果如下:
相关文章推荐
- C语言学习6 :指针的定义,指针类型要合法,指针要初始化,指针做函数参数,数组和指针的通用性,指针+1所代表的空间,void * 指针,交换函数中的指针,数组和字符型指针区别,字符型指针的应用,使用指针完成字符操作函数
- 从"void*"到指向非"void"的指针的转换要求显式类型转换错误
- C/C++语言中的void及void指针类型
- 关于内存和指针操作,数据类型转换本质的理解
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- C/C++语言中的void及void指针类型 (转)
- C语言学习8:malloc返回的void*类型指针不可以做更改,free双重释放,二维数组的初始化和打印,a和a[0]和a[0][0]的区别,数组指针(*p)[3],指针数组*a[10],动态内存分配版约瑟夫环,动态分配版去空格和逗号处理,二级指针与二维数组互用
- Swift 3.0中C语言指针类型在Swift编程语言中如何操作
- [C语言教程]指针转换方式实现C语言的指针操作安全代码
- C/C++语言中的void及void指针类型
- 关于内存和指针操作,数据类型转换本质的理解
- C/C++语言中的void及void指针类型
- C语言指针转换为intptr_t类型
- C++学习笔记(十一):void*指针、类型转换和动态内存分配
- 技巧:用 C 语言实现程序的多态性: C中只有两种类型int 和void *, 万能指针void *
- 关于void编程规范、void*(指针)、(void*)类型转换的详解
- void空类型指针仅传地址无指向操作
- 关于内存和指针操作,数据类型转换本质的理解
- 从“void*”到指向非“void”的指针的转换要求显式类型转换错误
- void*(指针)的类型转换-专讲