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


目录
相关文章
|
9月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
166 0
|
11月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
346 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
11月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1264 9
|
11月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
333 7
|
12月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
指针进阶(C语言终)
指针进阶(C语言终)
|
12月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1044 13
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
475 4
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
160 0
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下