菜单开关

周梦康 发表于 2017-09-28 1685 次浏览 标签 : C语言快速入门

很多时候,我们无法确定数据类型,不管是传入的参数还是返回值。

比如 java 里面 api 返回体中的数据,经常会用泛型,因为每个api返回的数据实体都不一样,无法确定。
C 语言里面也有类似的情况,所有会有泛型指针,来切换指针的类型。比如我们在堆内存上申请空间的时候,使用malloc

void * malloc(size_t size);

因为我们不知道这个内存申请完了以后用来存放什么,所以返回的是泛型指针。也就可以存放任何类型行的数据了。

实例

#include <stdio.h>

int main(int argc, char const *argv[]) {

    void *p;
    int a = 1;
    p = &a;
    printf("a: %d\n",*p);

    return 0;
}
[vagrant@10 03]$ gcc main.c
main.c: 在函数‘main’中:
main.c:8:23: 警告:提领‘void *’指针 [默认启用]
     printf("a: %d\n", *p);
                       ^
main.c:8:5: 错误:对 void 表达式的使用无效
     printf("a: %d\n", *p);
     ^
#include <stdio.h>

int main(int argc, char const *argv[]) {

    void *p;
    
    int a = 1;
    
    p = &a; // 把变量a的地址存放到p中
    printf("a: %d\n",*(int *)p); // 如果要打印出a的值,那么就需要把p指针首选转换 int 类型的指针,然后通过 * 来解引,获取真实的值

    return 0;
}

增加字符串

#include <stdio.h>

int main(int argc, char const *argv[]) {

    void *p;

    int a = 1;

    p = &a; // 把变量a的地址存放到p中
    printf("a: %d\n",*(int *)p); // 如果要打印出a的值,那么就需要把p指针首选转换 int 类型的指针,然后通过 * 来解引,获取真实的值

    char *c = "1111";

    p = c;
    printf("c: %s\n", p); // 不会报错
    printf("c: %s\n", (char *)p); // 这样更加易读

    return 0;
}

为什么不是

printf("c: %s\n", *(char *)p);

因为printf%s参数就是char *指针。

评论列表

回复 大头 2017-11-12 22:19:40
这句话 还真牛“因为printf的%s参数就是char *指针。”,之前想过一直不知道为啥
回复 周梦康 2018-02-03 12:35:43
回复大头: 哈哈哈,有收获就好。在精华中结束。