c++ - 结构中的字符串文字显示错误,但是当字符串文字声明为常量时,它不会显示错误,为什么?
问题描述
该程序已编译并运行但显示错误:ISO C++ 禁止将字符串常量转换为 'char*' [-Wwrite-strings]
#include<iostream>
using namespace std;
struct person{
char* name;
char* lastName;
int age;
};
void show(person temp){
cout << temp.name << " " << temp.lastName << " age is: " << temp.age;
}
int main(){
// decaring a person
person p;
p.name = "Jayant";
p.lastName = "Sharma";
p.age = 18;
//reassigning of p 'name'
p.name = "Kartik";
show(p);
return 0;
}
// output => Kartik age is: 18
但是当我使用 const 编译器声明变量时不会显示错误并且重新分配也完成了
struct person{
const char* name;
const char* lastName;
int age;
};
将名称 'Kartik' 重新分配给相同的 const 变量 'name' 不会出错。
解决方案
我看到您对示例源代码的困惑。但是,我看到您没有明确说明但暗示的两个问题。所以我两个都回答!
什么是 C++ 中的字符串文字?
ISO/IEC C++ 标准将字符串文字定义为 const char * 数组,并且您的示例代码通过将变量name和lastName声明为仅具有类型 char * 违反了此定义!尽管在 C 语言中不是这种情况,请参阅为什么从字符串常量转换为 'char*' 在 C 中有效但在 C++ 中无效以获取更多详细信息!
即使声明为常量,变量的赋值方式是什么?
编译器不会向您抛出错误,因为您没有正确使用 const 关键字!
const char* name = "Sharma";
上面的代码示例表明变量name中保存的值是常量,但它的地址不是!
const char* const name = "Sharma";
现在上面的代码示例表明变量名中保存的值和地址都是常量!
当您使用对象运算符的成员时,您声明正在操作的内存地址是正在访问的对象的地址加上存储数据的偏移量。因此,您是通过地址间接修改变量!
推荐阅读
- sql-server - 如何替换 SQL Server 中具有特定字符的值?
- java - java - 如何设置数组A中的每个项目对initialValue Java的引用
- amazon-web-services - RDS 凭证的 AWS Secrets Manager 轮换
- swift - 使用 SwiftUI 从转换目的地返回时,我想将显示的列表更新为最新状态
- session - CefSharp如何在关闭选项卡时像真正的浏览器一样清除当前网页
- c - 提取数字的数字,我想使用以下程序提取该数字的数字
- vb.net - Vb.net 从另一个类内部调用类
- javascript - 忽略移动设备上的设备方向
- sql - 选择没有一行if语句的查询
- json - 错误:列表
不是 Map 类型的子类型 在获取 JSON 时