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

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


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

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: const char* 与 char const* 在语义上是相同的,都表示一个指向字符常量的指针,该指针指向的字符不能被修改。它们的区别在于 const 关键字的位置不同。 const char* 表示指向字符常量的指针,即指针所指向的字符是常量,不能通过该指针修改字符的值。例如: ``` const char* str = "hello"; // str指向的字符常量不能修改 ``` char const* 与 const char* 意义相同,但是 const 关键字出现在 char 关键字之前,表示 char 关键字所指向的字符是常量。例如: ``` char const* str = "world"; // str指向的字符常量不能修改 ``` 因为它们的意义相同,所以在 C/C++ 中,const char* 与 char const* 可以互换使用。 ### 回答2: const char*和char const*的区别在于它们的修饰方式不同。 const char*表示指向字符常量的指针,这意味着指针变量所指向的字符值不能被修改,但是可以通过指针变量修改其指向。 char const*与const char*的含义相同,也表示指向字符常量的指针,但是表达的方式不同,将const关键字放在char前面,表示指针变量本身是常量,即无法修改指针的指向。 总结来说,const char*和char const*都表示指向字符常量的指针,但是const char*表示指针指向的字符值不能被修改,而char const*表示指针本身是常量,无法修改指针的指向。 简单示例: const char* str1 = "Hello"; // str1是指向字符常量的指针,不能通过str1修改指针所指向的字符值 char const* str2 = "World"; // str2是指向字符常量的指针,不能通过str2修改指针所指向的字符值 str1 = "Hi"; // 可以通过str1修改指针的指向,使其指向新的字符常量 //str2 = "Bye"; // 不可以通过str2修改指针的指向,因为str2本身是常量 ### 回答3: const char* 和 char const* 是表示指向字符常量的指针的两种写法,它们在语义上没有区别。其中 const char* 表示指针指向一个字符常量,即指针所指向的值是不可更改的;而 char const* 同样表示指针指向一个字符常量,也意味着指针所指向的值是不可更改的。 虽然它们在语义上没有区别,但实际上更常用的是使用 const char* 形式。这是因为在 C 语言中,const 关键字的位置通常放在类型修饰符前面,比如 int const* 表示指向整型常量的指针。而 C++ 语言中则可以使用两种写法。 无论是使用 const char* 还是 char const*,都可以用于声明指向字符串常量的指针。例如,以下代码片段中的两行声明具有相同的含义: ```cpp const char* str1 = "Hello"; char const* str2 = "World"; ``` 这两个指针都指向一个不可更改的字符串常量,即指针所指向的内容不能被修改。+例如,以下代码将导致编译错误: ```cpp const char* str = "Hello"; str[0] = 'h'; // 错误:不能修改指针所指向的字符常量 ``` 总之,const char* 和 char const* 表示相同的含义,都是指向字符常量的指针,不同的写法只是为了适应不同的语法要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值