void **

#include <stdint.h>

int main()

{

void *mem;

void *block;

char test[100] = {1 , 2 , 3};

int block_count = 20, block_size = 5;

mem = (void *)&test;

printf("test:%p \n", &test);

while (--block_count != 0U) {

block = &((uint8_t *)mem)[block_size];

printf("block:%p \n", block);

*((void **)mem) = block;

printf("*((void **)mem):%p \n", *((void **)mem));

mem = block;

printf("mem:%p \n", mem);

}

*((void **)mem) = NULL;

printf("Hello, World!(%d) (%d) (%d) \n", *((uint8_t *)(mem)), *((uint8_t *)(mem-1)), *((uint8_t *)(mem-2)));

return 0;

}

///////////////////////////////

test:0x7fffb8033170

block:0x7fffb8033175

*((void **)mem):0x7fffb8033175

mem:0x7fffb8033175

block:0x7fffb803317a

*((void **)mem):0x7fffb803317a

mem:0x7fffb803317a

block:0x7fffb803317f

*((void **)mem):0x7fffb803317f

mem:0x7fffb803317f

block:0x7fffb8033184

*((void **)mem):0x7fffb8033184

mem:0x7fffb8033184

block:0x7fffb8033189

*((void **)mem):0x7fffb8033189

mem:0x7fffb8033189

block:0x7fffb803318e

*((void **)mem):0x7fffb803318e

mem:0x7fffb803318e

block:0x7fffb8033193

*((void **)mem):0x7fffb8033193

mem:0x7fffb8033193

block:0x7fffb8033198

*((void **)mem):0x7fffb8033198

mem:0x7fffb8033198

block:0x7fffb803319d

*((void **)mem):0x7fffb803319d

mem:0x7fffb803319d

block:0x7fffb80331a2

*((void **)mem):0x7fffb80331a2

mem:0x7fffb80331a2

block:0x7fffb80331a7

*((void **)mem):0x7fffb80331a7

mem:0x7fffb80331a7

block:0x7fffb80331ac

*((void **)mem):0x7fffb80331ac

mem:0x7fffb80331ac

block:0x7fffb80331b1

*((void **)mem):0x7fffb80331b1

mem:0x7fffb80331b1

block:0x7fffb80331b6

*((void **)mem):0x7fffb80331b6

mem:0x7fffb80331b6

block:0x7fffb80331bb

*((void **)mem):0x7fffb80331bb

mem:0x7fffb80331bb

block:0x7fffb80331c0

*((void **)mem):0x7fffb80331c0

mem:0x7fffb80331c0

block:0x7fffb80331c5

*((void **)mem):0x7fffb80331c5

mem:0x7fffb80331c5

block:0x7fffb80331ca

*((void **)mem):0x7fffb80331ca

mem:0x7fffb80331ca

block:0x7fffb80331cf

*((void **)mem):0x7fffb80331cf

mem:0x7fffb80331cf

Hello, World!(0) (255) (184)

03-29
### 关于 `void` 关键字的用法和含义 在 C 和 C++ 中,`void` 是一种特殊的关键字,表示“无类型”。它主要用于以下几个场景: #### 1. 函数返回值为空 当函数不返回任何值时,可以将其声明为 `void` 类型。这意味着调用该函数不会得到任何返回值。 ```c void printMessage() { printf("This function does not return any value.\n"); } ``` 上述代码定义了一个名为 `printMessage` 的函数[^3],它的作用仅仅是打印一条消息到控制台,并没有任何返回值。 #### 2. 表示指针指向未知数据类型 `void*` 被用来创建通用指针,它可以指向任意类型的对象。然而,在实际使用之前,必须先将 `void*` 显式转换为目标类型。 ```c int number = 42; void* genericPointer = &number; // 将 void* 转换回 int* printf("The value is: %d\n", *(int*)genericPointer); ``` 这里展示了如何通过 `void*` 来存储不同类型的数据地址并随后访问它们的内容[^4]。 #### 3. 定义没有参数的函数原型 尽管现代标准推荐使用 `(void)` 形式来明确指出某个函数不需要接收任何参数,但在某些情况下也可以简单写成 () 。不过为了提高可读性和避免潜在错误,建议总是显式写出 `(void)`。 ```c void noParameters(void) { printf("This function takes no arguments."); } ``` 此例子中的 `noParameters()` 不接受任何形式的输入参数[^5]。 #### 4. 创建空类型结构体或者联合体成员 有时我们可能希望初始化一个完全不含字段的结构体实例;此时就可以利用带有零长度数组作为最后一个成员变量的技术实现这一目的——即所谓的柔性数组成员(Flexible array member),而在此之前则需借助于 `struct {}` 或者 `union {}` 结合 `void` 实现类似效果。 ```c typedef struct { size_t length; char data[]; } DynamicString; DynamicString* createString(size_t len){ DynamicString *str = malloc(sizeof(DynamicString)+len+1); str->length=len; memset(str->data, '\0', len+1); return str; } free(createString(10)); ``` 虽然上面的例子并没有直接涉及到 `void`,但是其背后原理涉及到了灵活运用内存布局的知识点,这与理解 `void` 如何参与复杂数据结构构建密切相关[^6]。 --- ### 总结 综上所述,`void` 在 C/C++ 编程语言里扮演着不可或缺的角色,无论是用于指定函数行为还是辅助操作各种形式的数据都显得尤为重要。掌握好这些基本概念有助于编写更加健壮高效的程序代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值