指针和const
const指针(常量指针):
int * const :
int * const:
指针是一个对象,而引用不是,引用是所指对象的别名。
1. 所以指针的用法可以像其他对象类型一样,允许把指针本身定义为一个常量。
2. 常量指针必须初始化,一旦初始化完成,它的值(也就是它所放在指针中的地址就不能改变)
3. 而它解引用的值可以随着它所指向地址中值的变化而变化。
下面我们通过例子来更好的理解一下:
1. 常量指针必须初始化:
#include <iostream>
using namespace std;
int main()
{
int * const p;
return 0;
}
2. 常量指针一旦初始化完成,它的值,也就是它所放在指针中的地址就不能变
#include <iostream>
using namespace std;
int main()
{
int i = 10;
int j = 20;
int * const p = &i;
p = &j;//p就是一个常量,所以不能给p赋值
return 0;
}
3. 常量指针 解引用*的值 可以随着它所指向地址中的值的变化而变化
#include <iostream>
using namespace std;
int main()
{
int i = 10;
int* const p = &i;
i = 20;
printf("p = %d \n",*p);
return 0;
}
指向常量的指针(const int * 和 int const *)
1. 两者的作用是一样的,都是一个指向常量的指针。
2. 可以不用先初始化,即指针没有指向任何内容。
3. 指针指向的内容是一个常量(即地址),可以通过改变常量(地址)中的值来改变指针解引用的值。但是不能直接解引用指针来改变值,因为这里的指针是一个常量。
4. 也可以将另外一个常量赋值给指针,来改变指针所指向内容的值。
1. 可以先不用初始化
(这里就是和int * const 的不同,常量指针必须初始化,之后所指向的内容就不能改变)
#include <iostream>
using namespace std;
int main()
{
const int * p;//未初始化
int i = 10;
p = &i;
printf(" p = %d \n",*p);
return 0;
}
2. 指针指向的内容是一个常量(即地址),可以通过改变常量(地址)中的值来改变指针解引用的值。但是不能直接解引用指针来改变值,因为这里的指针是一个常量。(这里的用来同常量指针,即它们三个的相同之处)
#include <iostream>
using namespace std;
int main()
{
int i = 10;
const int * p = &i;
*p = 20;//不能直接解引用指针来改变值
printf(" p = %d \n",*p);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int j = 20;
const int * p = &j;
j = 30;
printf(" p = %d \n",*p);
return 0;
}
3. 也可以将另外一个常量赋值给指针,来改变指针所指向内容的值。
(这里就是和常量指针的不同之处,常量指针只能指向一个地址,而指向常量的指针可以指向不同的常量(地址),可以改变)
#include <iostream>
using namespace std;
int main()
{
int i = 10;
int j = 20;
const int * p = &i;
p = &j;
j = 30;
printf(" p = %d \n",*p);
return 0;
}
上面就是我对指针和const的理解,我觉得还是较为全面的。下面还有一种类型,就是两者合并起来的 指向常量对象的常量指针。
指向常量对象的常量指针:
#include <iostream>
using namespace std;
int main()
{
const int j = 20;
const int * const p = &j;
j = 30;//变量j是常量,不能赋值
printf(" p = %d \n",*p);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
const int i = 10;
int j = 20;
const int * const p = &i;
p = &j;
printf(" p = %d \n",*p);
return 0;
}