8、void 的意义

1、void 修饰函数代表没有参数和没有返回值

2、void不是实际的类型,而是一种抽象的类型。不能用void定义变量,但是可以用void 定义指针,因为指针都是固定4字节。
比如:

void a;            //error
void p[5];         //error 
void *p;           //正确

3、void 指针的意义

  • C语言规定只有相同类型的指针才能相互赋值
  • void* 类型的指针作为左值使用可以接受任意类型的指针
  • void* 类型的指针作为右值使用需要进行强制类型转换。(malloc函数)
#include <stdio.h>

void Memset(void* src, int length, int n)
{
	unsigned char* p = (unsigned char*)src;
	int i = 0;
	for (i = 0; i < length; i++)
	{
		p[i] = n;
	}
}
int main()
{
	int a[5];
	printf("sizeof(a) = %d\n", sizeof(a));         //20
	int i = 0;
	Memset(a, sizeof(a), 0);
	for (i = 0; i < 5; i++)
	{
		printf("a[%d] = %d\n", i,a[i]);
	}

	return 0;
}

Memset函数的意思就是把内存中的每一个字节都设置为一个固定的数,所以Memset函数里面的void*要强制类型转换为char*

出现的疑问:char 类型的指针指向 int 类型的数组合法吗,我这个函数的意思是不是用char类型的指针指向int类型的数组?

结果:你这里并没有指向数组的指针,如int a[5];当你使用a时,常常(除了和sizeof连用以及和&连用)a会转换为指向数组首元素的指针,因为首元素类型是int,所以a常常退化为指向int的指针。而1个int占据 了连续的4个字节的空间,比如占据100,101,102,103号地址空间。这些地址中的最小值称为该int的地址。你现在用一个char* p指向其中的100号单元。就只能修改100号单元这1个字节里面的值。而++怕也只会让p指向101号地址的1个字节。
也就是说我这里的p只是指向数组第一个字节的地址,所以p就没有指向这个数组。

int a[5];
int (*p)[5] = &a;       //这个才是指向数组a的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值