【3-1-28】void类型指针和空指针详解

1:void 指针声明

void main300()
{
char ch = 'A';
int num = 100;
double db = 10.9;
//错误如下,因为*p不明确从地址开始,前进几个字节,所以出错
/*void *p;
p = &ch;
p = #
p = &db;
*p = 10;
printf("%d",*p);*/
//正确如下
void *p;
p = &ch;//空指针类型可以指向任何类型的数据,包含他们的地址
p = #
p = &db;
*((double *)p) = 10.3;//强制转换成double类型的指针,为什么要进行类型转换呢?明确从地址开始,前进几个字节
printf("%f\n",*((double *)p));
system("pause");
}

2:void 指针用途

//void 可以接收任何类型指针的赋值,任何指针都可以赋值给空类型的指针,
用于保存地址


void main301()
{
void *p;
char *p1;
int *p2;
double *p3;


system("pause");
}

3:学习函数memset

//memset返回值就是一个空类型,作用是对内存没意义字节进行挨个挨个赋值
void main302()
{

char str[30]="china is great";//定义一个字符串
int num[5] = {1,2,3,4,5};
float fl[5] = {1.0,2.0,3.0,4.0,5.0};
for (int i = 0; i < 5; i++)
{
printf("%d,%f\n", num[i], fl[i]);
}
//准备操作字符数组和整数数组
//举例:把前面5个字符(china)全部赋值为A,
memset(str,'A',5);//从str这个地址开始,把5个字节全部赋值为字符A,作用是从str的首地址开始,前进5个字节,进行赋值
printf("%s\n",str);//结果是:AAAAA is great
//如何把数组清0,对20的字节全部赋值为0,对于数组清0
memset(num,0,20);//传入数组的地址num,5个元素,每个元素4个字节,一共20个字节
memset(fl, 0, 20);//对20的字节全部赋值为0,对于数组清0,5个元素20个字节
//输出数组每个元素的值
for (int i = 0; i < 5;i++)
{
printf("%d,%f\n",num[i],fl[i]);
}
//结果是5个0,实现了对数组清0,从这个首地址开始
system("pause");
}

4:学习函数malloc

空类型的指针可以转换为任何类型的指针,一个类型的指针包含了3个信息,地址,步长,内容如何解析

//malloc,分配内存函数,它的返回值就是1个void指针类型,
void main303()
{
//需要它占用100M内存,需要malloc函数
malloc(1024*1024*100);//传递参数
void *p = malloc(30);//30个字节内存,malloc返回值是一个void 指针类型
//怎么用它呢?进行类型转换
int *px = (int *)p;//空类型指针可以转换为任何类型的指针
float *py = (float *)p;//float类型的转换


for (int i = 0; i < 5;i++)
{
px[i]=i;
printf("%d,%f\n",px[i],py[i]);
}

system("pause");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值