C语言--void指针参数

本文探讨了C语言中void*指针的应用及其限制,特别是如何正确使用void**进行指针操作。通过实例展示了无需类型转换即可使用的void*指针,并强调了void**参数在传递不同类型指针时需要注意的问题。
部署运行你感兴趣的模型镜像

C语言–函数的传参(pointer)

c语言中有一种通用指针,void * 类型指针,该指针在C中很常见,通常用于针对不同类型参数的函数。
例如,以下函数将对任何类型的数据清零。

void test(void *data, size_t n)
{
    memset(data, 0x00, n);
}

可以将任何类型的指针传递给test函数而不需要cast。

    int ax = 10;
    test(&ax, sizeof(ax));
    printf("ax = %d\n", ax);
    void *ptr = &ax;
    return 0;

但是, void** 是另一种情况。

void changeptr(void **ptr)
{
    *ptr = NULL;
}
    int ax = 10;
    void *ptr = &ax;
    int *iptr = ptr;
    printf("%d\n", *iptr);
    test(&ax, sizeof(ax)); 
    changeptr(&iptr);
    printf("ax = %d\n", ax);
    return 0;
warning: incompatible pointer types pass 'int **' to parameter of type 'void **'
gcc testvoid.c -o testvoid
testvoid.c: In function ‘main’:
testvoid.c:19:15: warning: passing argument 1 of ‘changeptr’ from incompatible pointer type [-Wincompatible-pointer-types]
     changeptr(&iptr);
                    ^
testvoid.c:10:6: note: expected ‘void **’ but argument is of typeint **’
void changeptr(void **ptr)

因此,对于void ** 参数必须进行强制类型转换

changeptr((void **)&iptr);

A cast is necessary here because, although a void pointer is compatible with any other type of pointer in C, a pointer to a void pointer is not.

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值