有关const *、* const 、const * const 之间的区别

原创 2016年08月29日 17:10:09

1、const *:表示指针指向的值不可变,但是指针可以重新赋新地址

#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	int test1 = 1;  
	int test2 = 2;  
	const int* p = &test1;//p指针存test1变量的地址
	printf("%d ", *p);
	p = &test2;//p指针存的地址发生改变,存test2变量的地址
	printf("%d ", *p);
	*p = 3;	//企图修改p指针指向的值,由原来的2变成3
	return 0;  
}  
输出结果:

验证上述说法“指针指向的值不可变”。

如果想修改p指针指向的值可以这样:

#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	int test1 = 1;  
	int test2 = 2;  
	const int* p = &test1;//p指针存test1变量的地址
	printf("%d ", *p);
	p = &test2;//p指针存的地址发生改变,存test2变量的地址
	printf("%d ", *p);
	test2 = 3;//注意是直接操作变量test2,而不是通过p指针去修改变量的值
	printf("%d\n", *p);
	return 0;  
}

输出结果:


输出的是想要的值。

#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	int test1 = 1;  
	int test2 = 2;  
	const int* p = &test1;//p指针存test1变量的地址
	printf("%d ", *p);
	p = &test2;//p指针存的地址发生改变,存test2变量的地址
	printf("%d\n", *p);
	return 0;  
} 

输出结果:


验证上述说法“指针可以重新赋新地址”。

2、* const:表示指针表示的地址不可变,但是指针指向的值可变

#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	int test1 = 1;  
	int test2 = 2; 
	/*
	int* const p;
	p = &test1; //error: assignment of read-only variable ‘p’只能在声明的时候就给它赋初值(如下),否则还是会报错的
	*/ 
	int* const p = &test1;//p指针存test1变量的地址
	printf("%d ", *p);
	p = &test2;//企图修改p指针存的地址,由原来的test1变量的地址变成test2变量的地址
	printf("%d ", *p);
	return 0;  
}
输出结果:


验证上述说法“指针表示的地址不可变”。

#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	int test1 = 1;  
	int test2 = 2; 
	/*
	int* const p;
	p = &test1; //error: assignment of read-only variable ‘p’只能在声明的时候就给它赋初值(如下),否则还是会报错的
	*/ 
	int* const p = &test1;//p指针存test1变量的地址
	printf("%d ", *p);
	*p = 3;//修改p指针指向的值,由原来的1变成3
	printf("%d\n", *p);
	return 0;  
}
输出结果:

验证上述说法“指针指向的值可变”。
注意指针指向的是字符常量:

include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	char* const p = "hello";//p指针存字符串常量"hello"的地址
	printf("%s ", p);
	p[0] = 'H';//企图通过指针p来修改的字符串常量的值,由原来"hello"的变成"Hello"
	printf("%s\n", p);
	return 0;  
} 

输出结果:


该程序的本意是“指针指向的值可变”,所以想修改字符串的值,但是出现段错误。

出现段错误的原因是:"hello"存放在常量区,在编译的时候就确定了,通过指针只可以访问字符串常量,而不可以改变该字符串常量。

可以这样操作修改字符串的值:

#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	char str[] = "hello";	
	char* const p = str;//p指针存字符串"hello"的地址
	printf("%s ", p);
	p[0] = 'H';//通过指针p来修改的字符串的值,由原来"hello"的变成"Hello"
	printf("%s\n", p);
	return 0;  
}
输出结果:


由于char str[] = "hello",此时字符串"hello"存放在栈区,通过指针可读可修改。

3、const * const:表示指针指向的值不可变,指针表示的地址也不可变

#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	int test1 = 1;  
	int test2 = 2;
	const int* const p = &test1;//p指针存test1变量的地址
	printf("%d ", *p);
	*p = 3;//企图修改p指针指向的值
	printf("%d ", *p);
	return 0;  
}

输出结果:

验证上述说法“指针指向的值不可变”。

#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>  

int main(void)  
{  
	int test1 = 1;  
	int test2 = 2;
	const int* const p = &test1;//p指针存test1变量的地址
	printf("%d ", *p);
	p = &test2;//企图修改p指针存的地址,有原来的test1变量的地址变为test2变量的地址
	printf("%d ", *p);
	return 0;  
} 
输出结果:


验证上说法“指针表示的地址也不可变”

JS中const、let、var之间的区别

js中关于const、let、var的区别使用
  • m0_37260875
  • m0_37260875
  • 2017年02月23日 17:10
  • 2441

static和const的区别和用处

const总结   1.常对象:const 类名 对象名[()] 例如const Cdate d1(2008,8,8) d1就是常对象,对象d1中的所有成员的值都不能被修改,定义常对象必须要...
  • Damon_hoo
  • Damon_hoo
  • 2014年08月28日 20:16
  • 9064

const int & 和 int 的区别

最近看函数的返回值时总是出现这两种函数的返回值。 const int& get() {return x;} int get() {return x;} 下面就关于这两种函数...
  • yangshuolll
  • yangshuolll
  • 2015年07月07日 10:59
  • 2874

const与#define的区别

const         const 是c++中的修饰符。  c++中常用来定义常量,修饰左值。#define       宏定义语句, 在编译阶段进行替换,不做类型检查。它们之间的最大区别:1. ...
  • zhuwanglove
  • zhuwanglove
  • 2010年09月25日 15:27
  • 5652

有关static 、const等关键字概念与区别

一、static全局变量与普通的全局变量有什么区别 1.static全局变量与普通全局变量的区别是:static全局变量只初始化一次,防止在其他文件单元被引用; 2.static局部变量与普通局部...
  • yaoZyao
  • yaoZyao
  • 2015年10月06日 11:35
  • 1931

const和static const的区别

对于C/C++语言来讲, const就是只读的意思,只在声明中使用; static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用...
  • wangfei8348
  • wangfei8348
  • 2016年04月27日 15:11
  • 361

C和C++中const不同之处

C语言const 是“冒牌货”看下面程序:
  • huangshanchun
  • huangshanchun
  • 2014年11月17日 20:17
  • 1054

const,static,全局变量细节及其区别

const: 限制符号,限制某个变量所指向的内容不能通过这个对象修改。 但是可以通过其他的修改,比如: int main(){ int x=5; const int &y=x; x+...
  • u014403897
  • u014403897
  • 2015年05月22日 15:33
  • 2311

const static 与static const的使用

 查看文章  C++ static、const和static const 以及它们的初始化2010-03-29 15:30C++   static、const和static const 以及它们的初始...
  • weishan521520
  • weishan521520
  • 2010年09月20日 15:17
  • 17090

关于const int*, int const*以及int *const的区别

使用C++也有些年了,这个语言确实有诸多繁琐和变态的地方,比如这次要说明的const int*、int const*以及int *const的区别就是一例。相信不少同学都会对这其中的差异表示不解,我尝...
  • skywalker_leo
  • skywalker_leo
  • 2015年09月21日 17:01
  • 8499
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关const *、* const 、const * const 之间的区别
举报原因:
原因补充:

(最多只允许输入30个字)