C语言-void类型作为万能指针类型

简介: C语言-void类型作为万能指针类型

1. 前言

void类型在基本数据类型里是空类型无类型;

void类型常用来当做函数的返回值,函数形参声明,表示函数没有返回值,没有形参。

void类型不能用来定义变量,因为它是空类型–可以理解为空类型

void abc;  //这是错误的

但是void是可以定义指针的,void*表示万能型指针类型,可以与任何指针类型进行转换,特别是内存拷贝里用的很多。

2. 内存拷贝函数 memcpy

系统提供函数: 内存拷贝函数

#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);

**示例代码:**memcpy函数过程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char **argv)
{
  char str1[]="1234567890";
  char str2[100];
  int int_a[]={1,2,3,4,5,6,7,8,9,0};
  int int_b[10];
  int a=200;
  int b;
  int i;
  //拷贝字符串数组
  memcpy(str2,str1,sizeof(str1));
  printf("str1=%s\n",str1);
  printf("str2=%s\n",str2);
  //拷贝整数数组
  memcpy(int_b,int_a,sizeof(int_a));
  for(i=0;i<10;i++)
  {
    printf("%d ",int_a[i]);
  }
  printf("\n");
  for(i=0;i<10;i++)
  {
    printf("%d ",int_b[i]);
  }
  printf("\n");
  //拷贝变量
  memcpy(&b,&a,sizeof(a));
  printf("a=%d\n",a);
  printf("b=%d\n",b);
  return 0;
}

3. 自己编写memcpy函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void my_memcpy(void *p1,const void *p2,int cnt);
int main(int argc,char **argv)
{
  char str1[]="1234567890";
  char str2[100];
  int int_a[]={1,2,3,4,5,6,7,8,9,0};
  int int_b[10];
  int a=200;
  int b;
  int i;
  //拷贝字符串数组
  my_memcpy(str2,str1,sizeof(str1));
  printf("str1=%s\n",str1);
  printf("str2=%s\n",str2);
  //拷贝整数数组
  my_memcpy(int_b,int_a,sizeof(int_a));
  for(i=0;i<10;i++)
  {
    printf("%d ",int_a[i]);
  }
  printf("\n");
  for(i=0;i<10;i++)
  {
    printf("%d ",int_b[i]);
  }
  printf("\n");
  //拷贝变量
  my_memcpy(&b,&a,sizeof(a));
  printf("a=%d\n",a);
  printf("b=%d\n",b);
  return 0;
}
/*
内存拷贝函数
*/
void my_memcpy(void *p1,const void *p2,int cnt)
{
  char *str1=(char*)p1;
  char *str2=(char*)p2;
  int i;
  for(i=0;i<cnt;i++)
  {
    *str1=*str2;
    str1++;
    str2++;
  }
}

4. 内存初始化函数: memset

memset函数常用于内存空间初始化,可以给空间赋初始值。

#include <string.h>
//void *memset(void *s, int c, size_t n);
//函数功能: 将指定空间赋值为指定的值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char **argv)
{
  int int_b[10];
  int b;
  int i;
    //memset(void *s, int c, size_t n);
  memset(int_b,0,sizeof(int_b));
  //拷贝整数数组
  for(i=0;i<10;i++)
  {
    printf("%d ",int_b[i]);
  }
  printf("\n");
  //拷贝变量
  memset(&b,0,sizeof(int_b));
  printf("b=%d\n",b);
  return 0;
}

5. 自己编写memset

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void my_memset(void *p,int c,int n);
int main(int argc,char **argv)
{
  int int_b[10];
  int b;
  int i;
    //memset(void *s, int c, size_t n);
  my_memset(int_b,0,sizeof(int_b));
  //拷贝整数数组
  for(i=0;i<10;i++)
  {
    printf("%d ",int_b[i]);
  }
  printf("\n");
  //拷贝变量
  my_memset(&b,0,sizeof(int_b));
  printf("b=%d\n",b);
  return 0;
}
void my_memset(void *p,int c,int n)
{
  char *str=(char*)p;
  int i;
  for(i=0;i<n;i++)
  {
    *str=c;
    str++;
  }
}

6. 读写int类型数据到文件

在文件读写中,经常需要向文件里读写自定义数据。

#include <stdio.h>
#include <string.h>
int write_file();
int read_file();
int main(int argc,char **argv)
{
    write_file();
    read_file();
    return 0;
}
int write_file()
{
    int cnt;
    int a=123;
    /*1. 打开文件*/
    FILE *fp=fopen("test.txt","wb");
    if(fp==NULL)
    {
        printf("文件打开失败.\n");
        return -1;
    }
    /*2. 写入数据*/
    cnt=fwrite(&a,1,sizeof(a),fp);
    printf("成功写入%d字节",cnt);
    /*3. 关闭文件*/
    fclose(fp);
    return 0;
}
int read_file()
{
    int cnt;
    int a;
    /*1. 打开文件*/
    FILE *fp=fopen("test.txt","rb");
    if(fp==NULL)
    {
        printf("文件打开失败.\n");
        return -1;
    }
    /*2. 读取数据*/
    cnt=fread(&a,1,sizeof(a),fp);
    printf("成功读取%d字节\n",cnt);
    printf("a=%d\n",a);
    /*3. 关闭文件*/
    fclose(fp);
    return 0;
}


目录
相关文章
|
2月前
|
存储 C语言
【C语言】“void” 如何在 C 语言中开创无限可能
`void`是C语言中的一个特殊关键字,具有多种用途。它可以表示没有返回值的函数、没有参数的函数参数列表、以及通用指针类型等。
109 5
|
2月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
182 9
|
2月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
65 7
|
2月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
124 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
3月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
92 2
|
3月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
72 1
|
编译器 C语言 开发者
【C 语言】数据类型本质 ( void 关键字作用 | 数据类型封装 | 作为 参数 或 返回值 代表无 | void* 指针赋值与被赋值 | void 类型变量不存在 )
【C 语言】数据类型本质 ( void 关键字作用 | 数据类型封装 | 作为 参数 或 返回值 代表无 | void* 指针赋值与被赋值 | void 类型变量不存在 )
304 0
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
36 3

热门文章

最新文章