const 指针分配给一个指针

const pointer assign to a pointer(const 指针分配给一个指针)
本文介绍了const 指针分配给一个指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么我不能这样做:

char* p = new char[10];

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


SetString("Hello");

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

I have a const pointer to a char, why can I not assign the const pointer to another pointer?

这似乎不合逻辑,因为通过将其分配给另一个指针,您实际上并没有违反 char 指针的 const-ness.还是你?

It just seems illogical, as by assigning it to another pointer, you are not essentially violating the const-ness of the char pointer. Or are you?

当我编译它时,它显示错误 C2440: '=' : cannot convert from 'char *const *__w64 ' to 'char *'"

When I compile this it says "error C2440: '=' : cannot convert from 'char *const *__w64 ' to 'char *'"

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

(I'm attempting to understand a concept from a book I'm reading. Just cannot get the code to compile.

代码:

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);

}

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] = '';
    len = n;
}

头文件:

#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);
};

推荐答案

常量指针和指向常量的指针是有区别的.常量指针是一个不能改变的指针(一个数字 - 内存地址)——它总是指向通过初始化给出的同一个对象:

There is difference between constant pointer and pointer to constant. Constant pointer is a pointer (a number - memory address) that cannot be changed - it always point to the same object given via initialization:

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

指向常量的指针是指向值不能改变的指针:

Pointer to constant is a pointer whose pointed value cannot be changed:

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

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

You can always assign constant to variable i.e. const pointer to non-const pointer (a). You can cast pointer to non-const to a pointer to const (b). But you cannot cast pointer to const to a pointer to non-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*'

下面,这不是标准的 c++.但是,这很常见.[/EDIT]
字符串字面量

"Hello"

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

is converted to constant pointer to 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

在上面的例子中,第二个是你的情况.在将字符串文字作为函数的参数传递时,您尝试使用 pointer-to-const 初始化 pointer-to-non-const.不管这些指针是不是常量,它们指向什么都重要.

In above examples the second is your case. You tried to initialize pointer-to-non-const with a pointer-to-const when passing string literal as argument of your function. No matter if these pointers are constants or not, it's matter what do they point to.

总结:
1) 如果将某种类型的指针强制转换为另一种类型的指针,则不能将指向常量的指针强制转换为指向非常量的指针.
2) 如果你有常量指针,同样的规则也适用于其他常量——你可以将一个常量分配给一个变量,但你不能将一个变量分配给一个常量(初始化它除外).

Summary:
1) If you cast a pointer of some type to a pointer of another type, you cannot cast pointer-to-const to pointer-to-non-const.
2) If you have constant pointer, the same rules applies as to other constants - you can assign a constant to a variable but you cannot assign a variable to a constant (except initializing it).

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

// EDIT
As GMan pointed out, the C++98 standard (§4.2/2) allows to implicitly cast string literals (which are constant char arrays) to a non-const char pointer. This is because of backward compatibility (in C language there are no constants).

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

Of course such a conversion can lead to mistakes and compilers will violate the rule and show an error. However, GCC in compatibility mode shows only a warning.

这篇关于const 指针分配给一个指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Rising edge interrupt triggering multiple times on STM32 Nucleo(在STM32 Nucleo上多次触发上升沿中断)
How to use va_list correctly in a sequence of wrapper functions calls?(如何在一系列包装函数调用中正确使用 va_list?)
OpenGL Perspective Projection Clipping Polygon with Vertex Outside Frustum = Wrong texture mapping?(OpenGL透视投影裁剪多边形,顶点在视锥外=错误的纹理映射?)
How does one properly deserialize a byte array back into an object in C++?(如何正确地将字节数组反序列化回 C++ 中的对象?)
What free tiniest flash file system could you advice for embedded system?(您可以为嵌入式系统推荐什么免费的最小闪存文件系统?)
Volatile member variables vs. volatile object?(易失性成员变量与易失性对象?)