菜单开关

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

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

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

比如 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; // 把变量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 *指针。

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表

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