const struct single pointer
In this section, you are going to learn
What is
const struct ABC
?What is
struct ABC const
?What is
const struct ABC *p = &a;
?What is
struct ABC const *p = &a;
?What is
struct ABC *const p = &a;
?What is
const struct ABC *const p = &a;
?
Inorder to answer above questions, let us remember a very simple rule
Anything after
const
keyword CAN NOT be changed
Is it that simple ?
Yes. Let us see how do we apply above rule to answer the questions
Step 1 : Consider the statement
struct ABC
{
int x;
int y;
};
const struct ABC a = { .x = 10, .y = 20 };
Step 2 : Remove all keywords after
const
const a = { .x = 10, .y = 20 };
Step 3 : Remove everything before
const
const a = { .x = 10, .y = 20 };
Step 4 : Remove assignment
const a;
Step 5 : Now apply the rule. Anything after
const
keyword CAN NOT be changed
We see
a
afterconst
Means, variable
a
CAN NOT be changed again in next line
struct ABC
{
int x;
int y;
};
const struct ABC a = { .x = 10, .y = 20 };
a.x = 100; // --> This is invalid
a.y = 200; // --> This is invalid
struct ABC
{
int x;
int y;
};
const struct ABC a = { .x = 10, .y = 20 };
struct ABC b = { .x = 100, .y = 200 };
a = b; // --> This is invalid
Step 1 : Consider the statement
const struct ABC *p = &a;
Step 2 : Remove all keywords after
const
const *p = &a;
Step 3 : Remove everything before const
const *p = &a;
Step 4 : Remove assignment
const *p;
Step 5 : Now apply the rule. Anything after
const
keyword CAN NOT be changed
We see
*p
afterconst
Means,
*p
CAN NOT be changed again in next line
struct ABC
{
int x;
int y;
};
struct ABC a = { .x = 10, .y = 20 };
const struct ABC *p = &a;
p->x = 100; // --> This is invalid
p->y = 200; // --> This is invalid
Step 6 : Bonus point !
*p
andp
are different. Means you can changep
From Step 4, we derived that “const *p”
Means only
*p
is const and CAN NOT be changedBut remember
p
is entirely differentThere is nothing which says
p
is constantHence
p
can still be changedSee below example
struct ABC a , b;
const struct ABC *p = &a;
p = &b; // --> This is valid
Step 1 : Consider the statement
struct ABC *const p = &a;
Step 2 : Remove all keywords after
const
struct ABC *const p = &a;
Step 3 : Remove everything before const
const p = &a;
Step 4 : Remove assignment
const p;
Step 5 : Now apply the rule. Anything after
const
keyword CAN NOT be changed
We see
p
afterconst
Means,
p
CAN NOT be changed again in next line
struct ABC a, b;
struct ABC *const p = &a;
p = &b; // --> This is invalid
Step 6 : Bonus point !
*p
andp
are different. Means you can change*p
From Step 4, we derived that “const p”
Means only
p
is const and CAN NOT be changedBut remember
*p
is entirely differentThere is nothing which says
*p
is constantHence
*p
can still be changedSee below example
struct ABC a, b;
struct ABC *const p = &a;
p->x = 100; // --> This is valid
p->y = 200; // --> This is valid
There are two occurences of
const
keywordHence, let us apply the same rules two times
Step 1 : Consider the statement
const struct ABC *const p = &a;
Step 2 : Remove all keywords after first const
const *p = &a;
Step 3 : Remove everything before first const
const *p = &a;
Step 4 : Remove assignment
const *p;
Step 5 : Now apply the rule. Anything after const keyword CAN NOT be changed
*p CAN NOT be changed
Step 1 : Consider the statement
const struct ABC *const p = &a;
Step 2 : Remove all keywords after second const
const struct ABC *const p = &a;
Step 3 : Remove everything before second const
const p = &a;
Step 4 : Remove assignment
const p;
Step 5 : Now apply the rule. Anything after const keyword CAN NOT be changed
p CAN NOT be changed
Both p and *p CAN NOT be changed
struct ABC a, b;
const struct ABC *const p = &a;
p->x = 100; // --> This is invalid
p->y = 200; // --> This is invalid
p = &b; // --> This is invalid
Statement |
Meaning |
---|---|
const struct ABC a; |
|
struct ABC const a; |
|
const struct ABC *p; |
|
struct ABC const *p; |
|
struct ABC *const p; |
|
const struct ABC *const p; |
|
Current Module
Previous Module
Next Module
Other Modules