空类型指针

malloc 查看底层源码中发现是空类型的指针,空类型的指针可以接收任意类型的指针,但是不能取出指针里的内容,如果要取出内容必须要强转。

1.验证空类型指针,可以接收任意类型指针,但不可以取值

1
2
3
4
5
6
7
void testVoidPoint() {
int a = 100;
void *p = &a;
printf("%x, %x", &a, p);
printf("%d", *p); //error: invalid use of void expression
getchar();
}

2.通过强转取值

将值强转成对应的指针类型取出

1
2
3
4
5
void testVoidPoint2() {
int a = 100;
void *p = &a;
printf("%d", *((int*)(p)));
}

3.开辟空间,证明指针即是动态数组

1
2
3
4
5
6
7
8
9
10
11
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);
}
}

4.指针与动态数组的等价比较

1
2
3
4
5
6
7
8
9
10
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