常变量、常量指针和指针常量

2015/05/27 C和C++基础

常变量(常量)

比如:

const int n=20;    //声明时必须同时赋值初始化
int const n=20;

因为有了const修饰的n,我们不再把它称为变量,而称为常变量,简称常量,代表20这个数。同时n不能在别的地方重新赋值。声明定义常变量时必须同时进行初始化。同时,以上两行代码是完全等价的,因为主要是看const修饰谁。无论const放在int前面还是后面,最终修饰的都是n。

常量指针(常指针)

常量指针就是我们说的指向常量的指针,顾名思义,它是用来指向常量的,意为常变量的指针,简称为常指针。

#include <iostream>

using namespace std;

int main(){
	const int i=5;     //定义一个int型常变量
	const int *p;      //定义一个int型常指针
	p=&i;              //用常指针指向常变量
	cout<<*p<<endl;
	system("pause");
}

我们不能使用普通指针变量来指向常变量,必须用常量指针来指向常变量,原因也很容易理解,我们用普通指针指向常变量之后,有可能就会进行改变常变量数值的操作,这样做是不被允许的:

#include <iostream>

using namespace std;

int main(){
	const int i=5;    //定义一个常变量
	int *p;           //定义了一个int型指针 
	p=&i;             //使用一般的指针指向常变量会报错
	cout<<*p<<endl;
	system("pause");
}

用常指针也是可以指向一般变量的,不过不可以通过常指针来更改一般变量的值,但是可以通过一般变量的变量名来修改变量的值。

#include <iostream>

using namespace std;

int main(){
	int i=5;             //定义一个一般变量
	const int *p;        //定义了一个常指针 
	p=&i;                //可使用常指针指向一般变量 
	cout<<*p<<endl;
	i=10;                //可通过一般变量的变量名来修改值
	cout<<*p<<endl; 
	*p=12;               //通过常指针来更改一般变量的值会报错
	int j=15;
	p=&j;                //可以在任意时候重新赋值一个新的内存地址
	cout<<*p<<endl; 
	system("pause");
}

首先const修饰的是整个*p,所以*p是常量,是不能被赋值的,其次p的前面并没有用const修饰,因此p是一个普通的指针变量(常指针可被认为一般指针变量),能被赋值重新指向另一个内存地址。

const int *p;
int const *p;

以上两行代码完全等价,都是声明定义常指针p,因为const都是修饰*p。

小结:常指针可以指向常变量和一般变量,但是都不能通过指针改变它指向的变量的值。同时不用普通指针变量指向常变量。

指针常量

指针常量是指的指针本身就是一个常变量,一经赋初值就不可以被更改。意为指针的常变量,上面已经说过,只有常指针才可以指向常变量,所以指针常量只可以指向一般变量,而且一旦赋给了初值,就不可以再更改。

定义方法:

类型名 * const 指针常量名=变量地址;

因为指针是常变量所以它在定义的时候就应该赋初值。

#include <iostream>

using namespace std;

int main(){
	int i=5;             //定义一个一般变量
	int * const p=&i;    //定义了一个指针常量 必须同时赋值初始化
	cout<<*p<<endl; 
	//通过指针来改变指向的变量的值 其实指向的地址空间不变 空间的内容却变了
	*p=30;               
	cout<<*p<<endl;
	system("pause");
}

因为p有了const的修饰,所以p是一个指针常量,也就是说p值是不可修改的,因为整个*p的前面没有const的修饰,因此*p是变量而不是常量,我们可以通过*p来修改它所指向的内存i的值。

特殊情形:

#include <iostream>

using namespace std;

int main(){
	int n=5;
	const int * const p=&n;              
	cout<<*p<<endl;
	n=10;
	cout<<*p<<endl;
	system("pause");
}

p的值不能改,也不能通过*p修改n的值,因为无论是p还是*p,都被const修饰了。但是n的值可以改,因为n就是普通变量。

Search

    Post Directory