const指针指向一个指针

Ton*_*ion 13 c++ pointers const

为什么我不能这样做:

char* p = new char[10];

void SetString(char * const str)
{
    p = str;
}


SetString("Hello");
Run Code Online (Sandbox Code Playgroud)

我有一个指向char的const指针,为什么我不能将const指针指向另一个指针?

这似乎是不合逻辑的,因为通过将其分配给另一个指针,您基本上不会违反char指针的常量.或者是你?

编辑:当我编译它时,它说"错误C2440:'=':无法从'char*const*__ w64'转换为'char*'"

(我试图从我正在阅读的书中理解一个概念.只是无法获得编译的代码.

码:

int _tmain(int argc, _TCHAR* argv[])
{

    MyString *strg = new MyString(10);
    strg->SetString("Hello, ");

    MyString *secondstr = new MyString(7);
    secondstr->SetString("Tony");

    strg->concat(*secondstr, *strg);

}
Run Code Online (Sandbox Code Playgroud)

CPP文件:

#include "MyStringClass.h"
#include <string.h>
#include "stdafx.h"

#include "MyStringClass.h"

void MyString::concat(MyString& a, MyString& b)
{
    len = a.len + b.len;
    s = new char[len + 1];
    strcpy(s, a.s);
    strcat(s, b.s);
    delete [] s; 

}

void MyString::SetString(char * const str)
{
    s = str;
}

MyString::MyString(int n)
{
    s = new char[n+1];
    s[n+1] = '\0';
    len = n;
}
Run Code Online (Sandbox Code Playgroud)

标头文件:

#include <string.h>
#include <stdio.h>

class MyString
{
private:
    char* s;
    int len;
public:
    MyString(int n = 80);

    void SetString (char * const str);

    void concat (MyString& a, MyString& b);
};
Run Code Online (Sandbox Code Playgroud)

adf*_*f88 22

常量指针和指向常量的指针之间存在差异.常量指针是一个无法更改的指针(数字 - 内存地址) - 它始终指向通过初始化给出的同一对象:

int * const const_pointer = &some_int_var; // will be always pointing to this var
const_pointer = &some_other_var; // illegal - cannot change the pointer
*const_pointer = 2; // legal, the pointer is a pointer to non-const
Run Code Online (Sandbox Code Playgroud)

指向常量的指针是一个指针,其指向值无法更改:

const int * pointer_to_const = &some_int_var; // doesn't have to be always pointing to this var
pointer = &some_other_var; // legal, it's not a constant pointer and we can change it
*pointer = 2; // illegal, pointed value cannot be changed
Run Code Online (Sandbox Code Playgroud)

您始终可以将常量赋值给变量,即const指针指向非常量指针(a).您可以将指向非const的指针转换为指向const(b)的指针.但是你不能将指向const的指针转换为指向非const(c)的指针:

int * pointer;
int * const const_pointer = &var;
const int * pointer_to_const;

/* a */
pointer = const_pointer; // OK, no cast (same type)

/* b */
pointer_to_const = pointer; // OK, casting 'int*' to 'const int*'

/* c */
pointer = pointer_to_const; // Illegal, casting 'const int*' to 'int*'
Run Code Online (Sandbox Code Playgroud)

[编辑]下面,这不是标准的c ++.但是,这很常见.[/ EDIT]
String literal

"Hello"
Run Code Online (Sandbox Code Playgroud)

转换为const(const char * const)的常量指针:

char *pointer = "Hello"; // Illegal, cannot cast 'const char*' to 'char*'
char * const const_pointer = "Hello"; // Illegal, cannot cast 'const char*' to 'char*'
const char * pointer_to_const = "Hello"; // OK, we can assign a constant to a variable of the same type (and the type is 'const char*')
"Hello" = pointer_to_const; // Illegal cannot re-assign a constant
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,第二个是你的情况.在将字符串文字作为函数的参数传递时,您尝试使用指向const指针初始化指向非常量指针.无论这些指针是否是常量,它们指向的是什么.

简介:
1)如果将某种类型的指针强制转换为另一种类型的指针,则不能将指针指向const转换为指向非const的指针.
2)如果你有常量指针,则相同的规则适用于其他常量 - 你可以为变量赋值,但不能将变量赋值给常量(初始化除外).

//编辑
正如GMan指出的那样,C++ 98标准(§4.2/ 2)允许隐式地将字符串文字(它是常量字符数组)转换为非const字符指针.这是因为向后兼容(在C语言中没有常量).

当然,这种转换可能会导致错误,编译器会违反规则并显示错误.但是,兼容模式下的GCC仅显示警告.

  • 这确实包含一些错误的信息,导致错误的结果.字符串文字是[const char的数组](http://stackoverflow.com/questions/3303164/why-isnt-if-maya-maya-true-in-c/3303212#3303212),而不是`const char*`(虽然,因为它是一个数组,它可以衰变成这样).虽然这样的数组通常不能隐式转换为`char*`,但字符串文字有这种特殊的转换.(它已被弃用,仅用于向后兼容.)因此,所有三个代码示例都是完全合法的. (2认同)
  • 不,我不是.§4.2/ 2:"不是宽字符串文字的字符串文字(2.13.4)可以转换为"指向字符的指针"类型的右值;宽字符串文字可以转换为类型"指针"的右值wchar_t".在任何一种情况下,结果都是指向数组第一个元素的指针.只有当存在明确的适当指针目标类型时才会考虑此转换,而不是在通常需要从左值转换为rvalue.[注意:这种转换已被弃用.参见附录D.]"就像我说的那样,所有三条线都是合法的.(嗯,你现在有四个;第一个3.) (2认同)