const, pointers, typedefs and stars [duplicate]
Possible Duplicate:
what is the difference between const int*, const int * const, int const *
Hello everyone,
I wonder if somebody can provide some clarity on the syntax for typedefs when pointers are involved in relation to: - meaning of the position of star; - meaning of the position of const; - interaction between teh two.
I get an idea on what's happening with const and star after I wrote the example below but I got that code simply by trial and error and would like to have a more theoretical explanation from someone knowledgeable.
Thanks
#include <iostream>
using namespace std;
int main() {
int paolo = 10;
// POINTERS
typedef int* PointerToInt1;
typedef int *PointerToInt2;
// POINTERS TO CONST
typedef const int* PointerToConstInt1;
typedef const int *PointerToConstInt2;
typedef int const* PointerToConstInt3;
typedef int const *PointerToConstInt4;
// qualifying with const twice
// ignored - simply gets you a warning
typedef const int const* PointerToConstInt5;
typedef const int const *PointerToConstInt6;
// CONST POINTERS
typedef int *const ConstPointerInt1;
typedef int* const ConstPointerInt2;
// CONST POINTERS TO CONST
typedef const int *const ConstPointerToConstInt1;
// POINTERS
开发者_运维知识库 int *ip1 = &paolo;
int* ip2 = &paolo;
PointerToInt1 ip3 = &paolo;
PointerToInt2 ip4 = &paolo;
// POINTERS TO CONST
PointerToConstInt1 ip11;
PointerToConstInt2 ip12 = &paolo;
PointerToConstInt3 ip13;
PointerToConstInt4 ip14 = &paolo;
PointerToConstInt3 ip15;
PointerToConstInt4 ip16 = &paolo;
/*
// POINTERS TO CONST
//ALL ERROR
*ip11 = 21; *ip12 = 23;
*ip13 = 23; *ip14 = 23;
*ip15 = 25; *ip16 = 23;
*/
// CONST POINTERS
// ERROR - No initialiser
// ConstPointerInt1 ip21;
// ConstPointerInt2 ip22;
int me = 56;
int you = 56;
ConstPointerInt1 ip21 = &me;
ConstPointerInt1 ip22 = &me;
*ip21 = 145;
*ip22 = 145;
// ERROR - No initialiser
// ConstPointerToConstInt1 ip31;
// ERROR - Cant change eobjected pointed at
ConstPointerToConstInt1 ip31 = &me;
// ip31 = &you;
// ERROR - Cant change the value of objected pointed at
ConstPointerToConstInt1 ip33 = &me;
// *ip31 = 54;
cout << *ip1 << *ip2 << *ip4 << endl;
cout << *ip11 << *ip12 << *ip13 << *ip14 << *ip15 << *ip16 << endl;
return 1;
}
I am not knowledgeable but will give a try to answer.
There is no need of multiple typedef
statements for a type.
// POINTERS TO CONST
typedef const int* PointerToConstInt1;
typedef const int *PointerToConstInt2; // Above two represent the same
typedef int const* PointerToConstInt3;
typedef int const *PointerToConstInt4; // 3 & 4 represent the same
Space doesn't really matter here.
int* ptr ;
int *ptr ; // Both mean the same.
const int*
means pointer can point to a different location but the value in the location it is pointing at cannot be changed.
int* const
means a const pointer. It cannot point to a different location but can change the value in the location it is pointing at. Since it is a constant pointer it must be initialized while declaration.
const int* const
means a constant pointer to a constant value. It can neither point to different location nor change the value in the location it is pointing at. So, it must be initialized while declaration.
ConstPointerToConstInt1 ip31; // Error : No initialization
ConstPointerToConstInt1 ip31 = &me;
ip31 = &you; // Error: Trying to modify the pointer to point to a different location
ConstPointerToConstInt1 ip33 = &me;
*ip31 = 54; // Error: Trying to change the value it is pointing at.
If you understand the above errors, const int*
and int* const
can be easily understood. Hope it helps !
For general rules on using const
, there are billions of questions here on StackOverflow. For instance: const usage with pointers in C.
Regarding typedefs, the rule for writing a typedef is the same for writing a variable declaration; the only difference is that you prefix it with typedef
, and replace the name of the variable with the name of the typedef! (With a few exceptions, which are typically fixed with parentheses). So, for instance:
char *flaps;
becomes:
typedef char *flaps_type;
精彩评论