天天看點

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

繼續閱讀