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;
}


目录
相关文章
|
7月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
138 0
|
9月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
301 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
9月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1115 9
|
9月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
270 7
|
9月前
|
存储 C语言
【C语言】“void” 如何在 C 语言中开创无限可能
`void`是C语言中的一个特殊关键字,具有多种用途。它可以表示没有返回值的函数、没有参数的函数参数列表、以及通用指针类型等。
456 5
|
10月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
C语言
C语言---指针进阶
C语言---指针进阶
|
C语言
C语言指针进阶(下)
C语言指针进阶(下)
92 1
|
编译器 C语言
C语言指针进阶(上)
C语言指针进阶(上)
131 1
|
C语言
C语言指针进阶(中)
C语言指针进阶(中)
97 0