void and void*

Source: Internet
Author: User

void and void pointer types in the C language

C language, void, void pointer
Many beginners do not know much about the pointer types of void and void in C.    Therefore, there are often some errors in the use, this article will tell you about the void and void pointer types of use methods and techniques. First, let's say the meaning of void,
void literal means "no type", void * is "untyped pointer", void * can point to any type ofData.
void almost only "annotations" and restrictionsThe role of the program, because no one ever defines a void variable, let's try to define:
void A;
This line of statement compiles with an error, prompting "illegal use of type ' void '". However, even if the compilation of void A does not go wrong, it does not have any practical significance.
Void really plays a role in:
(1) The qualification of function return;
(2) The qualification of function parameters.
It is well known that if pointers P1 and p2 are of the same type, then we can assign values directly between P1 and P2, and if P1 and P2 point to different data types, you must use the force type conversion operator to convert the pointer type to the right of the assignment operator to the type of the left pointer.
For example:
float *P1;
int *p2;
P1 = p2;
where P1 = P2 statement will compile error, prompt "' = ': cannot convert from ' int * ' to ' float * '", must be changed to:
P1 = (float *) P2;
While void * is different, pointers of any type can be assigned directly to it without forcing type conversions:
void *p1;
int *p2;
P1 = p2;
This does not mean, however, that void * can also be assigned to other types of pointers without forcing the type to convert. Because "untyped" can contain "there is a type," and "there is a type" cannot tolerate "untyped". Hehe, this truth is quite simple, we can say "men and women are people", but can not say "man is a Man" or "man is a woman." The following statement compiles an error:
int *p2;
P2 = p1;
Hint "' = ': cannot convert from ' void * ' to ' int * '".

Then, let's talk about the use of void.
The following rules are given for the use of the Void keyword:
Rule one: If the function does not return a value, it should be declared as void type.
InIn the C language, any function that does not qualify for a return value type is processed by the compiler as a return integer value. But many programmers mistakenly think of it as void type. For example:
Add (int a, int b)
{
return a + B;
}
int main (int argc, char* argv[])
{
printf (/"2 + 3 =%d/", add (2, 3));
}
The result of the program running is output:
2 + 3 = 5
This means that a function that does not add a return value description is indeed an int function.
The function does not add type description is not allowed, and sometimes the compiler will consider it as other functions, everyone in the compile time to pay attention to, for example, in the visual c++6.0 of the above add function compiler Error-free and no warning and run correctly, so can not hope that the compiler will do a strict type check.
Therefore, in order to avoid confusion, when we write a C program, we must specify its type without a leak for any function. If the function does not return a value, be sure to declare it as void type. This is both the need for good readability of the program and the requirements of programming norms. In addition, after adding the void type declaration, you can also playThe "self-explanatory" effect of the code. The code's "self-explanatory" code can annotate itself.
Rule two, if the function has no arguments, declare that its argument is void.
Let's take a look at this example
int function (void)
{
return 1;
}
It is not legal to make the following call:
function (2);
Because in C, the function argument is void means that the function does not accept any arguments.
Let's look at the compiler in Turbo C 2.0:
#include/"stdio.h/"
Fun ()
{
return 1;
}
Main ()
{
printf (/"%d/", Fun (2));
GetChar ();
}
Compiled correctly and output 1, this shows that in the C language, can be given to a function without parameters of any type of parameters, can not pass any parameters to the function without parameters, error "' Fun ': function does not take 1 parameters".
So, C, if the function does not accept any arguments, be sure to indicate that the argument is void.
Rule three, use the void pointer type with caution.
By the ANSI (American National standards Institute) standard, you cannot perform algorithmic operations on void pointers, that is, the following operations are not valid:
void * PVOID;
pvoid++; ANSI: Error
PVOID + = 1; ANSI: Error
The ANSI standard is determined because it insists that the pointer to the algorithm operation must be determined to be aware of its point to the data type size.
For example:
int *pint;
pint++;//ansi: Right
The result of pint++ is to make it grow sizeof (int).
However, the famous GNU (GNU's not UNIX abbreviation) does not assume that it specifies that the algorithm operation of Void * is consistent with char *.
The following statements are therefore correct in the GNU compiler:
Pvoid++;//gnu: Correct
PVOID + = 1;//gnu: Correct
The result of Pvoid++ 's execution was that it increased by 1.
In the actual programDesign, in order to meet the ANSI standards and improve the portability of the program, we can write this to achieve the sameThe Code of the function:
void * PVOID;
(char *) pvoid++;//ansi: correct; GNU: Correct
(char *) pvoid + = 1;//ansi: error; GNU: correct
There are some differences between GNU and ANSI, and in general, the GNU is more "open" than ANSI, providing support for more grammars. But we should be able to meet the ANSI standards as much as possible when it comes to real design.
Rule four, if the function's argument can be any type of pointer, then declare its argument to void.
Typical function prototypes, such as memory manipulation functions memcpy and memset, are:
void * memcpy (void *dest, const void *SRC, size_t len);
void * memset (void * buffer, int c, size_t num);
Thus, any type of pointer can be passed into memcpy and memset, which also truly embodies the meaning of the memory manipulation function, because the object it operates is only a piece of memory, regardless of what type of memory it is. If the parameter type of memcpy and memset is not void *, but char *, then shouting truth is strange! Such memcpy and memset are obviously not a "pure, out of the vulgar" Function!
The following code executes correctly:
Example: Memset accepts arbitrary type pointers
int Intarray[100];[page]
memset (intarray, 0, 100*sizeof (int));//Will intarray clear 0
Example: memcpy accepts arbitrary type pointers
int intarray1[100], intarray2[100];
memcpy (Intarray1, Intarray2, 100*sizeof (int));//copy Intarray2 to Intarray1
Interestingly, the memcpy and memset functions return a void * type, and the writer of standard library functions is so knowledgeable!
Rule five, void cannot represent a real variable.
The code below attempts to have void represent a real variable, so it's all the wrong code:
void A;//error
function (void a);//Error
Void embodies an abstraction in which variables in the world are "typed", such as a man who is not a man or a woman.
Void appears only for an abstract need, and it is easy to understand the void data type if you correctly understand the concept of an object-oriented "abstract base class". Just as it is not possible to define an abstract base classinstance, we cannot define a void (the "abstract data type") variable that allows us to analogy with the void.
A small void has a very rich design philosophy, as a programmer, a little more understanding of these must make us more effective and benefit.

void and void*

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.