【问题标题】:when const pointer is used as parameter of function当 const 指针用作函数的参数时
【发布时间】:2020-01-03 06:39:27
【问题描述】:

整个代码在链接下面。 base64 decode snippet in c++ 我对上述链接代码中的 const 指针有疑问。

主要

std::vector<BYTE> myData;
...
std::string encodedData = base64_encode(&myData[0], myData.size());

base64_encode

std::string base64_encode(BYTE const* buf, unsigned int bufLen) {
  std::string ret;
  int i = 0;
  int j = 0;
  BYTE char_array_3[3];
  BYTE char_array_4[4];

  while (bufLen--) {
    char_array_3[i++] = *(buf++);
    if (i == 3) {

参数是 BYTE const* buf,而不是 const BYTE* buf。

当 const BYTE* buf 用作参数时, const 用于 BYTE,所以指针可以改变,但缓冲区的值不能改变。

使用 BYTE const* buf 时,const 是指针变量,所以值可以改变但地址不能改变。

在上面的代码中, buf指针是const,但是buf++可以吗?

以及为什么使用 BYTE const* buf 而不是 const BYTE* buf?

谢谢

【问题讨论】:

  • 松散相关:这是一个帮助弄清楚“C 胡言乱语”真正含义的简洁工具:cdecl.org
  • 规则是 const 绑定到它的紧邻 left... 除非 const 是第一个,在这种情况下(作为例外一般规则)它将事物绑定到其直接正确

标签: c++ pointers arguments constants


【解决方案1】:

令人困惑的是,const BYTE*BYTE const* are equivalent to each other。两者都是指向常量的指针。

要使指针本身为 const,公式为 BYTE *const。指向 const 的 const 指针将是 BYTE const *constconst BYTE *const

我无法推测为什么这个函数的作者选择了BYTE const* 版本而不是更流行的const BYTE*

【讨论】:

  • 为什么你认为const BYTE*更受欢迎?
  • BYTE const * buf 中,const 适用于之前的项目(BYTEconst)。使用 BYTE * const buf 时,const 项目指针 也位于 const 之前。这使得const BYTE * buf 成为异常值。
  • 谢谢你,我知道 BYTE const * 和 const BYTE * 是一样的。我混淆了 BYTE* const buf 和 const BYTE* buf。非常感谢。
  • @eerorika:我是根据我阅读 C++ 的经验得出的结论。
  • 在我发现的代码中const TT const 更常见,因为它也更易于阅读。您通常会说“一个常量字符串”而不是“一个字符串常量”,尽管两者的含义相同。说“字符串常量指针”是令人困惑的(在 C 和某些人类语言中,至少在西班牙语中的形容词可能在名词之前或之后)恕我直言。
猜你喜欢
  • 2018-09-02
  • 2023-03-20
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2012-03-25
相关资源
最近更新 更多