有关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#中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)强制转...

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

C-style cast举例:  int i;  double d;  i = (int) d;   上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i...

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

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

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

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

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的区别使用

var const let 三者之间的区别

1.const定义的变量不可以修改,而且必须初始化。 1 const b = 2;//正确 2 // const b;//错误,必须初始化 3 console.log('函数外const定义b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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