const类型指针还可以赋值?

zzwf1 2015-04-14 07:34:50
在一个开源代码中看到如下内容, 有两个问题:
1. const类型的还可以赋值吗?
2. 上述形式在VS下是有错误的,那么我想在VS下编译,该如何修改

const t_rnxObs* hlp[header.nTypes(sys)]; //主要是这个变量的赋值问题,t_rnxObs是一个结构体,有三个double型变量
for (int iTypeV3 = 0; iTypeV3 < header.nTypes(sys); iTypeV3++) {
hlp[iTypeV3] = 0; //================1.
QString typeV3 = header.obsType(sys, iTypeV3);
QMapIterator<QString, t_rnxObs> itObs(rnxSat.obs);

// Exact match
// -----------
while (itObs.hasNext()) {
itObs.next();
const QString& type = itObs.key();
const t_rnxObs& rnxObs = itObs.value();
if (typeV3 == type2to3(sys, type) && rnxObs.value != 0.0) {
hlp[iTypeV3] = &itObs.value(); //================2.
}
}

// Non-Exact match
// ---------------
itObs.toFront();
while (itObs.hasNext()) {
itObs.next();
const QString& type = itObs.key();
const t_rnxObs& rnxObs = itObs.value();
if (hlp[iTypeV3] == 0 && typeV3 == type2to3(sys, type).left(2) && rnxObs.value != 0.0) {
hlp[iTypeV3] = &itObs.value(); ////================3.
}
}
}
...全文
427 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
HowieCao 2015-05-29
  • 打赏
  • 举报
回复
引用 8 楼 axf1766567189 的回复:
[quote=引用 6 楼 zzwf1 的回复:] [quote=引用 5 楼 axf1766567189 的回复:] [quote=引用 4 楼 zzwf1 的回复:] [quote=引用 1 楼 cjwloveljj 的回复:] 1.首先这句:const t_rnxObs* hlp[header.nTypes(sys)];  是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。 2. VS下编译错误,具体得看什么错误,才能修改。
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)]; 可是1处会提示: 错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换) 请问如何修改[/quote] 当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数, 所以会出现这个错误 [/quote] 有无参构造函数:

  class t_rnxObs {
   public:
    t_rnxObs() {
      value = 0.0; lli = 0; snr = 0;
    }
    double value;
    int    lli;
    int    snr;
  };
[/quote] 根据你的错误类型, 可以推测应该是=运算符没有被重载吧, 类对象和类对象赋值是需要重载=运算符的. 没有完整的代码, 只能给你分析到这里了 [/quote] 如下编译OK的啊,检查下你定义的数组维数: #include "stdafx.h" class t_rnxObs{ public: t_rnxObs(){ value = 0.0; lli = 0; snr = 0; } double value; int lli; int snr; }; int _tmain(int argc, _TCHAR* argv[]) { const t_rnxObs* hlp=new t_rnxObs[5]; return 0; }
一根烂笔头 2015-04-15
  • 打赏
  • 举报
回复
A1.编译器只让你赋值一次,但是采用指针,能间接操纵
paschen 版主 2015-04-15
  • 打赏
  • 举报
回复
const位置不同表示的意思是不同的,有可能是指向的地址是常量,也可能是指向地址中的内容是常量,还可能两个都是 具体看下面: const & 指针   类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?   1)、const在前面   const int nValue; //nValue是const   const char *pContent; //*pContent是const, pContent可变   const (char *) pContent;//pContent是const,*pContent可变   char* const pContent; //pContent是const,*pContent可变   const char* const pContent; //pContent和*pContent都是const   2)、const在后面,与上面的声明对等   int const nValue; // nValue是const   char const * pContent;// *pContent是const, pContent可变   (char *) const pContent;//pContent是const,*pContent可变   char* const pContent;// pContent是const,*pContent可变   char const* const pContent;// pContent和*pContent都是const   答案与分析:   const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:   当const所在代码段中不包含括号时,沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。你可以根据这个规则来看上面声明的实际意义,相信定会一目了然。   另外,需要注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这时限定指针是const。   一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。
旭日东升1993 2015-04-15
  • 打赏
  • 举报
回复
引用 6 楼 zzwf1 的回复:
[quote=引用 5 楼 axf1766567189 的回复:] [quote=引用 4 楼 zzwf1 的回复:] [quote=引用 1 楼 cjwloveljj 的回复:] 1.首先这句:const t_rnxObs* hlp[header.nTypes(sys)];  是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。 2. VS下编译错误,具体得看什么错误,才能修改。
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)]; 可是1处会提示: 错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换) 请问如何修改[/quote] 当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数, 所以会出现这个错误 [/quote] 有无参构造函数:

  class t_rnxObs {
   public:
    t_rnxObs() {
      value = 0.0; lli = 0; snr = 0;
    }
    double value;
    int    lli;
    int    snr;
  };
[/quote] 根据你的错误类型, 可以推测应该是=运算符没有被重载吧, 类对象和类对象赋值是需要重载=运算符的. 没有完整的代码, 只能给你分析到这里了
旭日东升1993 2015-04-15
  • 打赏
  • 举报
回复
引用 4 楼 zzwf1 的回复:
[quote=引用 1 楼 cjwloveljj 的回复:] 1.首先这句:const t_rnxObs* hlp[header.nTypes(sys)];  是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。 2. VS下编译错误,具体得看什么错误,才能修改。
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)]; 可是1处会提示: 错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换) 请问如何修改[/quote] 当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数, 所以会出现这个错误
Eugene_Lu 2015-04-15
  • 打赏
  • 举报
回复
const指针是指地址不能修改,但是地址内存储的数据如果不是const就可以修改
zzwf1 2015-04-15
  • 打赏
  • 举报
回复
引用 5 楼 axf1766567189 的回复:
[quote=引用 4 楼 zzwf1 的回复:] [quote=引用 1 楼 cjwloveljj 的回复:] 1.首先这句:const t_rnxObs* hlp[header.nTypes(sys)];  是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。 2. VS下编译错误,具体得看什么错误,才能修改。
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)]; 可是1处会提示: 错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换) 请问如何修改[/quote] 当你new一个 t_rnxObs对象的时候, 会调用 t_rnxObs的构造函数呀, 出现这个错误的原因是 t_rnxObs类没有提供无参构造函数, 而你没有给 t_rnxObs的构造函数传递参数, 所以会出现这个错误 [/quote] 有无参构造函数:

  class t_rnxObs {
   public:
    t_rnxObs() {
      value = 0.0; lli = 0; snr = 0;
    }
    double value;
    int    lli;
    int    snr;
  };
zzwf1 2015-04-14
  • 打赏
  • 举报
回复
引用 1 楼 cjwloveljj 的回复:
1.首先这句:const t_rnxObs* hlp[header.nTypes(sys)];  是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。 2. VS下编译错误,具体得看什么错误,才能修改。
我想把它改为: const t_rnxObs* hlp=new t_rnxObs[header.nTypes(sys)]; 可是1处会提示: 错误 14 error C2678: 二进制“=”: 没有找到接受“const t_rnxObsFile::t_rnxObs”类型的左操作数的运算符(或没有可接受的转换) 请问如何修改
kite289 2015-04-14
  • 打赏
  • 举报
回复
它指向的地址是不让修改的。但是指针本身可以修改。
苏叔叔 2015-04-14
  • 打赏
  • 举报
回复
你得明白:const位于*左右的差别 1.const int *p; 2.int * const p; 参看 http://blog.csdn.net/zhangxiangdavaid/article/details/38082159
HowieCao 2015-04-14
  • 打赏
  • 举报
回复
1.首先这句:const t_rnxObs* hlp[header.nTypes(sys)];  是指向const的指针数组,定义hlp是一个指向t_rnxObs结构体类型的指针数组,也就是说这些指针指向的地址值是不能变的,而非hlp的指向不能变,hlp可以指向其他地方,所以1,2,3的赋值都是OK的。 2. VS下编译错误,具体得看什么错误,才能修改。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧