const与指针

const类型的指针可以指向非const类型的对象,但const类型的对象必须由const类型的指针指定:

[cpp]  view plain copy
  1. // C++ 语言强制要求指向 const 对象的指针也必须具有 const 特性  
  2. const double d1 = 3.14;  
  3. const double *pd1 = &d1;    // ok  
  4. //double *pd2 = &d1;        // error: invalid conversion from 'const double*' to 'double*' [-fpermissive]  
  5.   
  6. int ival = 10;  
  7. int *pi1 = &ival;       // ok  
  8. const int *pi2 = &ival;     // ok,const指针可以指向非const对象  
  9.   
  10. // const类型的指针不能通过指针改变对象的值,只能通过其他方式修改  
  11. //*pi2 = 11;            // error: assignment of read-only location '* pi2'  
  12. ival = 11;  
  13. cout << *pi2 << endl;       // 11  

对于void*类型的指针也是如此:

[cpp]  view plain copy
  1. const int i = 10;  
  2. const void *vp1 = &i;   // ok  
  3. void *vp2 = &i;     // error: invalid conversion from 'const void*' to 'void*' [-fpermissive]  
  4.   
  5. const void *vp3;    // ok  
  6. int j = 9;  
  7. vp3 = &j;  

对比:const int *p1 与int *const p2:

[cpp]  view plain copy
  1. int i = 10;  
  2.   
  3. const int *p1 = &i; // 1:指向const对象的指针  
  4. int *const p2 = &i; // 2:const指针  
  5.   
  6. cout << *p1 << endl;    // 10  
  7. cout << *p2 << endl;    // 10  

1) 前者const只是限定了p1指针所指向的是const类型的对象,而非指针本身是const类型的,在定义的时候不需要初始化,允许对p1进行重新赋值,让p1重新指向一个const类型的对象,但不能通过p1去修改所指的对象的值,因为编译“自以为”现在所指向的对象是const类型的。但因为编译器没法分辨所指的对象是否为const类型的,所以可以通过变量赋值或者间接地利用非const的指针改变对象的值。

2) p2是const指针,即一经初始化,就会与对象的地址绑定在一起,不能该变,必须在定义的时候进行初始化。类似引用。但可以通过该指针去改变所指对象的值。

[cpp]  view plain copy
  1. *p2 = 11;  
  2. cout << *p2 << endl;    // ok,11  
  3.   
  4. *p1 = 11;               // error: assignment of read-only location '* p1'  
  5. cout << *p1 << endl;  

在实际的程序中,指向 const 的指针常用作函数的形参。将形参定义为指向 const 的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。


int *const p1 与 const int *const p2:

[cpp]  view plain copy
  1. int i = 1;  
  2. const int j = 2;  
  3.   
  4. const int *p1 = &j;  
  5.   
  6. // error: invalid conversion from 'const int*' to 'int*' [-fpermissive]  
  7. // 类型转换错误:p2的类型为const的指针指向int类型,但j是const int类型  
  8. //int *const p2 = &j;  
  9. int *const p2 = &i;         // ok  
  10.   
  11. const int *const p3 = &j;   // ok:p3的类型为:const指针指向const int类型对象,j是const int类型的  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个编程错误,意思是无效的转换。它通常出现在程序中,当试图将一个数据类型转换为另一个不兼容的数据类型时。这可能是因为程序员错误地使用了错误的数据类型或者没有正确地进行类型转换。要解决这个错误,需要检查代码并确保所有的数据类型转换都是有效的和正确的。 ### 回答2: "invalid conversion from"错误是编程语言中常见的错误之一。它表示在两种不兼容的类型之间进行了非法的转换。 这个错误通常发生在程序员试图将一种类型的值赋给另一种类型的变量时。例如,将一个字符串赋给一个整数变量,或者将一个整数赋给一个布尔变量。编译器会在这种情况下发出"invalid conversion from"错误。 这个错误的发生通常是因为程序员没有正确地处理类型转换。在编程语言中,有不同的方式来进行类型转换,如强制类型转换、隐式类型转换等。因此,当试图进行一个非法的类型转换时,编译器会报告这个错误。 要解决这个错误,可以采取以下一些步骤: 1. 检查代码中的变量类型,并确保它们与赋值操作相匹配。 2. 确保使用正确的类型转换语法。根据编程语言的规范,使用合适的类型转换操作符。 3. 如果存在不同的数据类型之间的转换需求,可以使用合适的函数或方法来处理这些转换。 总结来说,"invalid conversion from"错误通常是由于非法的类型转换引起的。通过检查和确保正确的变量类型以及使用正确的类型转换语法,可以解决这个错误。 ### 回答3: "error: invalid conversion from" 是一个编程错误,在编程中经常会遇到。这个错误的意思是在代码中进行了无效的转换。 在编程中,我们经常需要进行不同类型之间的转换,比如整数和浮点数之间的转换。但是有些转换是不允许的,因为它们可能会导致数据丢失或产生错误的结果。当我们进行了一个不允许的转换时,编译器就会报出这个错误。 通常,这个错误会伴随着一个具体的错误信息,指出出现错误的位置和原因。我们可以通过仔细阅读错误信息来找出问题所在,并进行相应的修正。 一种常见的错误情况是,我们将一个指针转换为一个不兼容的类型。比如,将一个整数指针转换为一个浮点数指针。这样的转换是不允许的,因为指针的类型决定了我们可以使用的操作和数据的解释方式。 另一种常见错误是将一个不匹配的类型赋值给变量或函数参数。比如,将一个字符串常量赋值给一个整数变量,或者将一个整数传递给一个期望浮点数参数的函数。这样的转换也是不允许的,因为它们可能会改变数据的含义或导致错误的操作。 为了解决这个错误,我们需要查找代码中的转换操作,并确保它们在类型兼容的情况下进行。我们可以使用类型转换操作符来明确指定转换的方式,或者通过重新设计代码来避免不兼容的转换。 总而言之,"error: invalid conversion from" 是一个编程错误,表示进行了一个不允许的转换操作。我们需要仔细阅读错误信息,找出问题所在,并采取适当的修正措施。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值