【C代码】对 void* 的理解

在理解 void* 前,复习一下C的数据类型、void的用法、指针的用法。


 

数据类型


void 类型

在C语言中, void也是数据类型:不确定的类型。

void虽然是数据类型,但不能用来定义一个void变量,  如:void test=10;   // 编译时会报错,

void类型,有3个作用 ;

  • 限定函数返回值, 如:  void GetTime(shot t);   // 这里的void表示:函数不能返回值
  • 限定函数参数,     如:shot GetValue(void);   // 这里的void表示:函数不接受参数传入
  • 声明无类型指针,  如:void* pStrint;               //  void *可以接受任何类型的赋值

指针 类型

每一次看到指针这个简称,必须想起它的大名:指针类型,这样更容易理解。

  • 指针类型,它和数组、结构体等是数据类型中的其中一个派生成员, ;
  • 指针类型与其它数据类型的区别, 指针定义后在内存中占4个字节, 这4个字节存储的是某数据段的地址值,  而如int类型也占的4字节, 但存储的是直接的数据值;
  • 指针的大小是4个字节,因为STM32的内存地址是32位4字节. 在win的64位系统中, 指针是占8个字节.
  • char* strTemp  = “星期天有空吗,一起去玩吧?";  
    // strTemp 的大小是4个字节,不管所指向的数据是什么,有多大, 反正它只是负责某数据的地址。
  • 指针用法
  • // 定义一个数组,在内存开辟一段空间,然后用指针指向它,方便做数据处理 
    char  A[4096];
    char* p=A;     
    
    p++;                // 等同于&A[1]
    *p++;               // 等同于 A[1]+1
    
    int Time = (int*)p; // 等同于 Time= A[4]<<24 | A[3]<<16 | A[2]<<8 | A[1]
    
    while(*p!=0)        // 等同于 A[1]!=0
    {
        ...
    }
    
    // 其实, 不用指针也可以完成上面的各种操作, 但用指针更简洁

void* 作为参数类型

void* 是一种无类型指针,任何类型指针都可以转为void*,它无条件接受各种类型.

void* pTest;      // 定义一个void指针

pTest++;          // 错误; 因为指针还不确定知道其指向数据类型大小,对它++无法确定要加多少个字节
if(*pTest==0);    // 错误;

(char*)pTest++;         // 正确
if(*((int*)pTest)==0);  // 正确

void*基本用于函数、接口。

典型的,如内存操作函数 memcpy和 memset,函数原型分别为:

void * memcpy(void *dest, const void *src,size_tlen);
void * memset ( void * buffer, int c, size_t num );

int  TestINT[100];                       // 传入int类型数据
memset ( TestINT, 0, 100*sizeof(int) );  // 将TestINT清0, 

char TestChar[50];                       // 传入char类型数据
memset(TestChar, 0, 50);                 // 将TestChar清0


void* 作为返回类型

  • void  作为返回类型里,作用是限定函数不能返回任何值。
  • void* 作为返回类型时, 作用是函数可以返回任何类型的值,可以是int,char, 也可以是struct;
void* SUM(char a, char b)
{
    return a+b;
}

int main(void)
{
    int   V1 = SUM(1,2);
    char  V2 = SUM(1,2);
    float V3 = SUM(1,2);
    int*  V4 = SUM(1,2);
}

特别注意

void* SUM(char A, char B);     // 这里是指函数可以返回任何类型的值

void (*SUM)(char A, char B);   // 这个是函数指针,和void* 是完全没一丁点关系联系的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章