首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C指针错误->表达式必须是可修改的左值

C指针错误是指在C语言中,出现了表达式必须是可修改的左值的错误。这个错误通常发生在对指针进行操作时,尝试修改一个不可修改的值,或者将一个不可修改的值赋给一个指针。

指针是C语言中一种特殊的变量类型,它存储了一个内存地址,可以用来访问该地址上存储的数据。在C语言中,指针可以被用来修改所指向的内存地址上的值。

然而,有些情况下,表达式必须是可修改的左值,这意味着只有可修改的变量才能被赋值或修改。如果尝试将一个不可修改的值赋给一个指针,或者尝试修改一个不可修改的值,就会导致C指针错误。

解决C指针错误的方法通常是检查代码中的指针操作,确保操作的对象是可修改的左值。如果需要修改的值是一个常量,可以考虑使用可修改的变量来代替。

以下是一些常见的导致C指针错误的情况:

  1. 将常量赋给指针:
代码语言:txt
复制
const int num = 10;
int *ptr = # // 错误,尝试将常量赋给指针

解决方法:使用可修改的变量来代替常量。

  1. 尝试修改常量的值:
代码语言:txt
复制
const int num = 10;
*num = 20; // 错误,尝试修改常量的值

解决方法:使用可修改的变量来代替常量。

  1. 尝试修改指针指向的常量值:
代码语言:txt
复制
const int num = 10;
int *ptr = #
*ptr = 20; // 错误,尝试修改指针指向的常量值

解决方法:将指针指向可修改的变量。

总结起来,C指针错误是由于对不可修改的值进行修改或赋值操作导致的。要解决这个错误,需要确保操作的对象是可修改的左值,即可被赋值或修改的变量。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 | 在函数中 间接修改 指针变量 | 在函数中 间接修改 外部变量 原理 )

文章目录 一、直接修改 和 间接修改 指针变量 二、在函数中 间接修改 指针变量 三、在函数中 间接修改 外部变量 原理 一、直接修改 和 间接修改 指针变量 ---- 直接修改 指针变量...在 函数中 , 使用 * 符号 , 修改 二级指针 指向 一级指针 变量值 ; 注意 : 如果要 修改 一级指针 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量...函数外部 变量 , 必须传入 指向该变量 指针才可以 ; 代码示例 : #include #include /* * 函数中简介修改指针 */ void...三、在函数中 间接修改 外部变量 原理 ---- 如果要 修改 一级指针 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ; 这是因为...如果传入 一级指针 变量 , 这个传入 一级指针 变量 , 其 生命周期 到函数结尾就结束了 , 跟函 数外部 一级指针 变量 没有任何关系 ; 如果 要修改 函数外部 变量 , 必须传入 指向该变量

21.2K11

C语言函数传递了指针没有被修改原因及解决方法

C语言函数指针参数值为什么不变C语言函数中传递了指针作为参数,确切来说是传递了指向变量内存地址作为参数,经过函数内修改之后,该指针指向变量为什么不会被修改?...这个跟运算符优先级也没有关系,像上面这样*x++表达式中,并不会被优先计算x++,即不会先进行内存地址自增运算。下面的实例中将探讨这一点。...实例代码该实例输出了三个变量内存地址,前两个一样,即通过*x++运算,变量指向内存地址并没有发生改变,但是如果通过指针自增运算,比如z++,则内存地址会发生改变。...&y); test(&y); printf("%x\n",&y); int *z = &y; z++; printf("%x\n",z);}//编译运行之后得到输出(不同平台和编译器可能得到不一样输出...):61fe1461fe1461fe18解决方法将x++修改为:x = *x + 1;原文:C语言函数传递了指针为什么没有被修改免责声明:内容仅供参考,不保证正确性!

39721
  • C++ 中 const 和 constexpr关键字解析:常量、函数和指针

    很多全局变量都是通过常量来进行修饰,需要注意,使用const关键字修饰变量需要立刻初始化 // 修饰局部变量,全局变量,成员变量 const int a = 2; // 错误表达式必须修改...num) { // 错误表达式必须修改,意思就是参数num个常量,无法修改 num = 3; } 修饰指针 虽然指针也是一种变量,不过当const与指针出现在一起时候...表达式必须修改 *p = 3; // 正确 a = 4; // 4 cout << *p << endl; // 同样地,有人习惯这种写法,作用是一样,看个人喜好即可 int const...*p2 = &a; // 第二种情况:常量指针 int a = 2; // const作用:使指针p无法指向其他变量 int* const p = &a; int b = 3; // 错误表达式必须修改...{ public: void test() const { // 错误表达式必须修改,因为member成员变量,而test函数被const修饰过后无法修改成员变量

    91720

    C++Primer》第四章 表达式

    和右 这两个名词原本是从C继承过来,主要是为了帮助记忆,可以位于赋值表达式左侧,而右不行。 C++表达式要不然就是右r-value,要不然就是l-value。...但是在C++语言中,两者区别没有那么简单: 表达式求值结果一个对象或者一个函数,但是以常量对象为代表某些却不能作为赋值语句左侧运算对象 虽然某些表达式求值结果对象,但是它们实际上而不是...isspace(s[index]) 赋值运算符 赋值运算符左侧运算对象必须一个修改(复制一下,指的是对象,修改意味着能修改对象)。...例如const int ci = i;一个初始化语句而非赋值语句,因为该常量不可修改。...除非必须,否则不用递增递减运算符后置版本:前置版本递增运算将加1之后直接返回该运算对象,但是后置版本需要将原始存储下来以便于返回这个未修改内容,如果我们不需要修改的话就是一种性能上浪费

    85910

    和右引用与右引用、移动语句(2)「建议收藏」

    不一定允许修改它指定对象。例如,const对象是无法修改。术语修改用于强调允许指定对象被改变以及被检查。...并不一定出现在表达式左边: 以下对象类型,但不是修改: 数组类型 不完整类型 const限定类型 结构或联合类型,其成员之一被限定为const类型 因为这些不可修改,所以它们不能出现在赋值语句左侧...它可以是函数名称或取消引用函数指针结果。 C语言还区分它对函数指针和对象指针处理。 另一方面,在C ++中,返回引用函数调用是。否则,函数调用是rvalue表达式。...= += -= *= %= >= &= ^= |= 操作数必须。 例如,所有赋值运算符都会计算其右操作数并将该赋给其操作数。 操作数必须修改或对修改对象引用。...地址运算符(&)需要作为操作数,而增量(++)和减量( – )运算符需要修改作为操作数。 以下示例显示表达式及其对应

    2.6K20

    c++从入门到进阶--引用与常量

    指针 指针初始化后不能改变指向固定单元(只能指一次) *poi=99;//const限定poi;可以对指向内容修改,但不可以对指针指向对象修改。...四.引用 与右 区别 赋值表达式 出现在赋值号左边 在赋值号右边 地址与名字 可以取地址有名字 不能取地址没有名字 生成表达式 返回引用函数 赋值 下标 解引用和前缀自增自减运算符...引用 (定义 类型 &引用名=目标变量名) int a=100; int &b=a;/*&标识符(引用必须被初始化并且初始化完成之后引用将会和初始对象一直绑定在一起)。...*/ 右引用(必须要绑定到右引用)定义 类型 &&右引用变量=右表达式; int &&a=10;//正确 int &&b=10*5;//正确10*5 int &&c=a;//a类型int...返回类型和return语句 return 语句形式 return; return表达式; 非void函数必须返回一个与声明类型匹配否则会引起编译错误

    77920

    错误记录】C 语言中通过指针操作字符串常量出错记录 ( 只有 栈内存 或 堆内存 中数据才能通过指针修改 | 不要通过指针修改常量区字符串 )

    文章目录 一、报错记录 二、修改方案 一、报错记录 ---- 执行下面的代码 , 报错如下 : 执行错误代码 : #include #include #include...while (p_start < p_end) { // 交换收尾字符 // 记录 p_start 指针指向首部字符 char c = *p_start...char *str = "sdfsdfsdabc4548411abc"; 字符串导致 , 该字符串存储在 全局区 常量区 ; char *str 指针指向了 常量区 ; 之后 , 通过指针尝试修改该常量区字符串..., 才有了上述报错 ; // 交换收尾字符 // 记录 p_start 指针指向首部字符 char c = *p_start; //...将尾部字符赋值给首部字符 *p_start = *p_end; // 将首部字符赋值给尾部字符 *p_end = c; 修改方案 : 将字符串定义为如下样式

    60810

    C++】C 语言 和 C++ 语言中 const 关键字分析 ( const 关键字数右指原则 | C 语言中常量原理和缺陷 | C++ 语言中常量原理 - 符号表存储常量 )

    , 如果参数中 const 在 * 左边 , const Student *pS , 根据 数右指原则 , 指针指向数据常量 , 不能被修改 ; 下面错误示范 : // 数右指 , const..., 就会在编译时报错 : 表达式必须修改 函数接收上述结构体类型变量作为参数 , 如果参数中 const 在 * 右边 , Student* const pS , 根据 数右指原则 , 指针本身常量..., 指针指向不能被修改 ; 下面错误示范 : // 数右指 , const 在指针右边 , 指针本身指向不能被修改 int fun2(Student* const pS) { pS =...NULL; return 0; } 如果强行修改指针指向 , 就会在编译时报错 : 表达式必须修改 上述完整代码示例 : // 导入标准 io 流头文件 // 其中定义了 std 命名空间...> 3、代码示例 - C 语言中使用常量地址修改常量值 如果使用 指针 变量 , 接收 常量 a 地址 , 然后通过该指针修改 指针指向 内存空间 , 然后再打印 常量 a , 发现 常量

    51020

    C++】C++ 引用详解 ③ ( 函数返回不能 “ 局部变量 “ 引用或指针 | 函数内 “ 局部变量 “ 引用或指针做函数返回无意义 )

    一、函数返回不能 " 局部变量 " 引用或指针 1、引用通常做右 之前使用 引用 时 , 都是作为 右 使用 , 引用只在 声明 同时 进行初始化时 , 才作为 , // 定义变量 a...int 为 0 就是成功 , int 为其它数值 , 就是错误码 ; 3、函数内 " 局部变量 " 引用或指针做函数返回无意义 如果 想要 使用 引用 或 指针 作 函数计算结果 , 一般都是将..., 也就是 修改 地址 / 引用 指向 内存中数据 , 该操作可以修改 外部 main 函数中变量值 ; 如果 想要 在 函数 中 , 返回一个 地址 / 引用 作为返回 , 这个 地址 /..., 返回 局部变量 地址 / 引用 无意义 , 一般 函数 只 返回一个 int , 表示 该函数 是否执行成功 , 如果执行失败 , 返回错误码 ( 在哪一步执行失败 ) ; ----..., 该 指针 局部变量 指针 ; 上述两个函数无意义 , 获取到 函数 返回 " 局部变量 " 引用 或 指针 , 然后获取地址 , 发现获取都是随机 , 都是无意义 ; num21

    49020

    c++基础之表达式

    这次接着更新《c++ primer》 这本书读书笔记,上一篇博文更新到了书中第三章,本次将记录书中第四章——表达式 与右 在理解表达式之前需要先理解c++中和右概念。...c++ 表达式要么,要么,这两个名词c语言中继承过来,在c语言中,指的是可以位于赋值语句左侧表达式,右则不能。在c++中二者区别就相对复杂一些了。...在c++要区分和右,可以采取一个原则:一般来说当一个对象被用作时,用对象地址,也就是在内存中位置,而右可以采取排他性原则,只要不是都是右。...if(1 == val) 赋值运算符 赋值运算符一般作用与初始化给对象赋值或者在后续修改对象,但是需要注意区分二者不同,这点在初始化或者给类对象赋初始时候尤其重要 赋值运算符左侧必须一个修改...int i, j; i = j = 10; const k = 10; //这里初始化,不是赋值 k = i; //错误,左侧需要可以修改c++ 标准中允许使用初始化列表来给对象进行赋值

    80810

    C++进阶】C++11认识与学习

    C++98中,new 出来一个int指针可以直接初始化,但是当有多个对象时,就只能用循环初始化,C++11列表初始化就解决了这个问题,可以用{},给多个对象初始化。...使用方法:decltype() 变量 nullptr C++中 NULL 直接被定义成了0 ,没有了指针属性,为了补上这个漏洞,定义 nullptr 为空指针  三.右引用和移动语义 什么?...:可以取地址,一般情况下,可以被修改可以出现在赋值符号左右边;例如变量名,解引用指针:不可以取地址,右只能出现在赋值符号右边;例如字面常量,表达式,函数返回 是否能取地址和右最大区别...过(注意,a仍然,只不过move返回一个右) //注意 rr1 rr2 属性仍为 return 0; } 右引用应用 场景1 自定义类型中深拷贝类中,必须返回场景...在块作用域以外lambda函数捕捉列表必须为空 lambda表达式之间不能相互赋值 其实,lambda表达式底层仿函数,即使两个lambda表达式看起来一样,但它们在底层仍然不同,不属于同一个类型

    16010

    【笔记】《C++Primer》—— 第4章

    首先表达式(value)通常来说分为两类,(lvalue)和右(rvalue)。...简单分辨方法就是:可以利用&取到地址就是,也就是我们修改这个会连接到指定栈上内存,我们平时用变量就是;其余不是都是右,例如很多直接运算结果(1+1)之类临时值...当这个内容表达式时,如果表达式,返回这个引用,例子如一个int* p指针,decltype(*p)结果会是int&;如果表达式返回普通类型。...4.4 赋值运算符 赋值运算符左边必须一个修改(不是const),且右边必须和左边类型相同或者可以被转换。 C11支持使用花括号来初始化对象(类似数组显式初始化),称为列表初始化。...数组会在大多数表达式中转换为指针除了sizeof,decltype之类运算符 非常量类型指针可以转换为常量指针,但是不能反反向隐式转换 cin返回读入成功还是失败bool 在强制类型转换中

    61840

    详解decltype用法

    c类型,也就是说,auto推导变量依赖于初始化它表达式,并且auto声明变量必须初始;而decltype直接通过某一个表达式来获取数据类型,从而定义d类型。...表达式能做有两个典型例子:decltype (*p)和decltype ((ii))。请看下面的例子: 对于解引用*p, 它代表p指向地址中,同时我们可以给这个赋值,即为。...所以,decltype(*p)int& ,这样才能有给绑定变量赋值特点。 ii一个变量,加上括号后变为表达式,即(ii)一个表达式,又我们可以ii赋值,即为。...int ii = 42, *p = ⅈ decltype(*p) c;//错误cint&,必须初始化 decltype((ii)) d;//错误,dint&,必须初始化 3. decltype...,也无法通过函数名来推断返回函数类型,那么也无法返回函数指针,如下面的例子中声明pf为函数指针错误

    86110

    C++11新特性学习笔记

    循环,其for循环迭代范围必须确定: int func(int a[])//形参中数组指针变量,无法确定元素个数 { for(auto e: a) // err, 编译失败 {...那么这个加法赋值表达式中,&a允许操作,但&(b + c)这样操作则不会通过编译。因此a一个,(b + c)一个右。 相对于左,右表示字面常量、表达式、函数非引用返回等。...无论声明一个引用还是右引用,都必须立即进行初始化。而其原因可以理解为引用类型本身自己并不拥有所绑定对象内存,只是该对象一个别名。...*③* *修改标示符* mutable声明,这部分可以省略。按传递函数对象参数时,加上mutable修饰符后,可以修改传递进来拷贝(注意修改拷贝,而不是本身)。...不过C++11标准却允许lambda表达式向函数指针转换,但提前lambda函数没有捕获任何变量,且函数指针所示函数原型,必须跟lambda函数函数有着相同调用方式。

    2.2K20

    C++11新特性学习笔记

    循环,其for循环迭代范围必须确定: int func(int a[])//形参中数组指针变量,无法确定元素个数 { for(auto e: a) // err, 编译失败 {...那么这个加法赋值表达式中,&a允许操作,但&(b + c)这样操作则不会通过编译。因此a一个,(b + c)一个右。 相对于左,右表示字面常量、表达式、函数非引用返回等。...无论声明一个引用还是右引用,都必须立即进行初始化。而其原因可以理解为引用类型本身自己并不拥有所绑定对象内存,只是该对象一个别名。...*③* *修改标示符* mutable声明,这部分可以省略。按传递函数对象参数时,加上mutable修饰符后,可以修改传递进来拷贝(注意修改拷贝,而不是本身)。...不过C++11标准却允许lambda表达式向函数指针转换,但提前lambda函数没有捕获任何变量,且函数指针所示函数原型,必须跟lambda函数函数有着相同调用方式。

    2.1K20

    引用,右,右引用

    c++11中引入了右引用和移动语义,可以避免无谓复制,提高程序性能,用不多,每次看过了就忘了,整理下; 1、和右表达式结束后依然存在持久化对象; 右表达式结束时就不再存在临时对象...; 比方: int i=0;// i, 0 2、引用: c++98中引用很常见了,就是给变量取了个别名,在c++11中,因为增加了右引用(rvalue reference)概念,所以...int a = 10;  int& refA = a; // refAa别名, 修改refA就是修改a, a,左移引用 int& b = 1; //编译错误!...1,不能够使用引用 3、右引用,c++11中引用使用符号&&,如: int&& a = 1; //实质上就是将不具名(匿名)变量取了个别名 int b = 1; int && c...对于存在指针变量类来讲,其拷贝构造函数,赋值构造函数必须实现指针变量深拷贝,这可能会涉及到比较耗时操作(比如string 类存储了一个超长字符串,在调用其拷贝构造或赋值构造时需要超长字符串拷贝)

    78710

    C++11知识点总结(全面解析C++11经常考到知识点)

    () override; // 错误:foo 不能被覆盖,因为它在 A 中 final }; class C : B // 错误:B 为 final { }; 6 智能指针 7....9.2 和右 和右区别: 普通类型变量,因为有名字,可以取地址,都认为。...const修饰常量,不可修改,只读类型,理论应该按照右对待,但因为其可以取地址(如果只是const类型常量定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间),C++11认为其...如果表达式运行结果一个临时变量或者对象,认为。 如果表达式运行结果或单个变量一个引用则认为。...总结: 不能简单地通过能否放在=左侧右侧或者取地址来判断或者右,要根据表达式结果或变量性质判断,比如上述:c常量 能得到引用表达式一定能够作为引用,否则就用常引用。

    2.1K10

    《逆袭进大厂》第三弹之C++提高篇79问79答

    举个例子,int a = b+c, a 就是,其有变量名为a,通过&a可以获取该变量地址;表达式b+c、函数int func()返回,在其被赋值给某一变量前,我们不能通过变量名找到它,&...其中纯右概念等同于我们在C++98标准中右概念,指的是临时变量和不跟对象关联字面量值;将亡则是C++11新增跟右引用相关表达式,这样表达式通常是将要被移动对象(移为他用),比如返回右引用...无论声明一个引用还是右引用,都必须立即进行初始化。而其原因可以理解为引用类型本身自己并不拥有所绑定对象内存,只是该对象一个别名。...和右 :表示可以获取地址表达式,它能出现在赋值语句左边,对该表达式进行赋值。...int& c = 10; //错误c不能使用右初始化 int&& d = 10; //正确,右引用用右初始化 int&& e = a; //错误,e引用不能使用初始化

    2.2K30
    领券