malloc 查看底层源码中发现是空类型的指针,空类型的指针可以接收任意类型的指针,但是不能取出指针里的内容,如果要取出内容必须要强转。
void testVoidPoint() {
int a = 100;
void *p = &a;
printf("%x, %x", &a, p);
printf("%d", *p); //error: invalid use of void expression
getchar();
}
将值强转成对应的指针类型取出
void testVoidPoint2() {
int a = 100;
void *p = &a;
printf("%d", *((int*)(p)));
}
void testVoidPoint3() {
int intSize = sizeof(int); //得到4,证明 int 是 4 个字节
printf("%d\n", intSize);
int *p = (int*) malloc(20 * sizeof(int)); //一开始就使用强转,开辟 20个4字节的空间,80个字节内存
for (int i = 0; i < 20; ++i){
p[i] = i; //注意,指针本质上也可看成数组。指针的数组下标是可以动态分配的,数组不可以。
printf("%d,%x\n", &p[i], i);
}
}
void testVoidPoint4() {
int intSize = sizeof(int);
printf("%d\n", intSize);
int *p = (int*) malloc(20 * sizeof(int));
for (int i = 0; i < 20; ++i){
p[i] = i;
printf("%d,%x\n", p[i], &p[i]);
printf("%d,%x\n", *(p + i), p + i);
}
}
p[i] 等价于 *(p + i) &p[i] 等价于 p + i