HP C A.06.05 Reference Manual

Data Types and Declarations
Type Qualifiers
Chapter 346
The formal definition of restricted pointer in C99 follows:
1. Let D be a declaration of an ordinary identifier that provides a means of designating an
object P as a restrict-qualified pointer to type T.
2. If D appears inside a block and does not have storage class extern, let B denote the block. If
D appears in the list of parameter declarations of a function definition, let B denote the
associated block. Otherwise, let B denote the block of main (or the block of the function
that is called at program startup in a freestanding environment).
3. In what follows, a pointer expression E is said to be based on object P if (at some sequence
point in the execution of B prior to the evaluation of E) modifying P to point to a copy of the
array object into which it formerly pointed would change the value of E. Note that based
is defined only for expressions with pointer types.
4. During each execution of B, let L be any lvalue that has &L based on P. If L is used to
access the value of the object X that it designates, and X is also modified (by any means),
then the following requirements apply:
T shall not be const-qualified.
Every other lvalue used to access the value of X shall also have its address based on P.
Every access that modifies X shall be considered also to modify P, for the purposes of
this subclause.
If P is assigned the value of a pointer expression E that is based on another restricted
pointer object P2, associated with block B2, then either the execution of B2 shall begin
before the execution of B, or the execution of B2 shall end prior to the assignment. If these
requirements are not met, then the behavior is undefined.
5. Here an execution of B means that portion of the execution of the program that would
correspond to the lifetime of an object with scalar type and automatic storage duration
associated with B.
6. A translator is free to ignore any or all aliasing implications of uses of restrict.
Table 3-2 illustrates various declarations using the const and volatile type qualifiers.
Table 3-2 Declarations using const and volatile
Declaration Meaning
volatile int vol_int; Declares a volatile int variable.
const int *ptr_to_const_int;
int const *ptr_to_const_int;
Both declare a variable pointer to a constant int.