有关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;  
} 
输出结果:


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

C#编程中 readonly与const的区别

  • 2010年04月06日 16:57
  • 149KB
  • 下载

c#中const与readonly区别

  • 2013年11月14日 09:34
  • 997B
  • 下载

标准c++的类型转换符之间的区别(static_cast,dynamic_cast,const_cast,reinterpret_cast)(转载)

C 风格(C-style)强制转型如下:  (T) expression // cast expression to be of type T  函数风格(Function-style)强制转...
  • oldmtn
  • oldmtn
  • 2012年04月10日 17:46
  • 553

static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别

转自:http://patmusing.blog.163.com/blog/static/13583496020103243210628/C-style cast举例: int i; double d...

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

js中关于const、let、var的区别使用

【转】static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别

C-style cast举例: int i; double d; i = (int) d; 上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整...
  • petersq
  • petersq
  • 2012年07月07日 19:47
  • 111

var const let 三者之间的区别

1.const定义的变量不可以修改,而且必须初始化。 1 const b = 2;//正确 2 // const b;//错误,必须初始化 3 console.log('函数外const定义b...

cocos2d-x 关于 std::string 与 const char* 之间转换的奇怪问题

//先存储一个string类型数据 CCUserDefault::sharedUserDefault()->setStringForKey("Jason", "Hello"); CCU...

C++中的const关键字系列——常类型与常指针之间的纠缠

说起const这个关键字,想必大家都不会陌生了。因为在高级编程语言的范畴内,几乎都有这么一个关键字。 因为最近的一段时间内在类的设计与实现的时候,有某些需求是要用到const修饰符来修饰那些变量或是...
  • ZLhy_
  • ZLhy_
  • 2012年12月26日 18:44
  • 1654
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有关const *、* const 、const * const 之间的区别
举报原因:
原因补充:

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