int value =5;
void testPointer( int* pa, int* pb) {
*pa = *pb 5;
*pb = value;
value = 10;
}
How can I distingush both from each other? I dont get it
CodePudding user response:
A unary *
always indicates a dereference.
This may feel familiar and intuitive in an expression: *pb 5
means to get the value pb
points to and add five. In contrast, you may find a declaration less intuitive; what does *
mean in int *pa
?
The way to think of this is that a declaration gives a picture of how something will be used. The declaration int *pb
says *pb
will be used as an int
. In other words, when we get the value pb
points to, it is an int
. The *
in a declaration represents the same thing that happens in an expression: dereferencing the pointer.
Kernighan and Ritchie tell us this in The C Programming Language, 1978, page 90:
The declaration of the pointer
px
is new.
int *px;
is intended as a mnemonic; it says the combination
*px
is anint
, that is, ifpx
occurs in the context*px
, it is equivalent to a variable of the typeint
. In effect, the syntax of the declaration for a variable mimics the syntax of expressions in which the variable might appear.
As a more involved example, consider int (*p)[];
. This tells us that (*p)[]
is an int
. Since []
is used to access array elements, this means (*p)
must be an array of int
. And that means p
must be a pointer to an array of of int
. Just like *
, []
does not have a reversed meaning in declarations. It does not mean “is an array of” instead of “access an element of”; it is still an image of how the thing will be used in an expression.
CodePudding user response:
When specifying a type, for example inside a declaration, the *
means "pointer". Otherwise, the *
means "dereference" or "multiplication" (depending on the context).
For example, when initializing a variable inside a declaration, all *
before the =
means "pointer", and all *
after the =
means "dereference" or "multiplication":
int i = 80;
int *p = &i; // In this case, * means "pointer"
int j = *p; // In this case, * means "dereference", so j gets the value 80