about "void" and "void *"

/* void.c by vinco at 2011-09-09
*   i386-Red Hat-gcc-4.1.2 
*   http://blog.csdn.net/xuyunzhang/
*   
*/

#include<stdio.h>
#include<string.h>
typedef struct stu
{
	int age;
	char name[32];
	
} STU;

int main()
{
	float *pFt;
	int *pInt;
	void *pVd;
	void *pVd1 = pVd;
	
	STU stu = {24, "vinco" };
	STU *pStu = &stu;
	STU *pStu1 = NULL;
	//void data; //1. "error: variable or field data declared void"
	
	//pFt = pInt;// 2. "warning: assignment from incompatible pointer type"
	pFt = (float *)pInt;

	pVd1 ++; // equivalent to (char* )pVd1 ++;
	printf("sizeof(void *) = %d, ( pVd1 - pVd)/sizeof(char) = %d\n", sizeof(void *), ( pVd1 - pVd)/sizeof(char) );
	pVd1 += 1;
	(char* )pVd1 ++;
	//(char* )pVd1 += 1; //"error: invalid lvalue in assignment"
	
	pVd = pInt;
	pInt = pVd; // all right !!!, somebody said it's not !
	pInt = (int *)pVd;

	pVd = pStu;
	pStu1 = pVd;//equivalent to "pStu1 = (STU *)pVd;" all right !!! somebody said it's not !

	printf("pStu->age = %d, pStu->name = %s \n", pStu->age, pStu->name );
	printf("pStu1->age = %d, pStu1->name = %s \n", pStu1->age, pStu1->name );
	// 3. printf("pVd->age = %d, pVd->name = %s \n", pVd->age, pVd->name );
	
	
}

make  an run it

[vinco@IPPBX-Server ctest]$ make void
cc     void.c   -o void
[vinco@IPPBX-Server ctest]$ ./void
sizeof(void *) = 4, ( pVd1 - pVd)/sizeof(char) = 1
pStu->age = 24, pStu->name = vinco 
pStu1->age = 24, pStu1->name = vinco 



analysis:

 void /void *
 I. to define the return type of a function ;
 eg:
     void func();
     void* func();
 II. to define the formal parameter of a function ;
 eg:
    int func(void );
    int func(void * p);
------------------------------------------

1. can not define "void" type data
   "void data;"
   ("error: variable or field data declared void") ;
  
2. be careful when assignment a point of type one with another type;
    float *pFt;
    int *pInt;
    pFt = pInt;
   
"warning: assignment from incompatible pointer type" ;
 
3.
   pVd = pStu;
   printf("pVd->age = %d, pVd->name = %s \n", pVd->age, pVd->name );
   "error: request for member age/name in something is not a structure or union" ;

   code modified as below will be ok:

printf("((STU *)pVd)->age = %d, ((STU *)pVd)->name = %s \n", ((STU *)pVd)->age, ((STU *)pVd)->name );

 

4. "pVd1 ++;" equivalent to "(char* )pVd1 ++;"
     the increasement is just one byte(GNU support it)
    
5.
"(char* )pVd1 ++;" is ok in GNU
     (char* )pVd1 += 1; ("error: invalid lvalue in assignment")is unsupported in GNU

你可能感兴趣的:(function,struct,float,byte,structure)