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

为什么在使用指针编译时不能赋值常量初始化

在使用指针编译时不能赋值常量初始化的原因是指针变量存储的是内存地址,而常量是具体的数值或字符串,它们存储在内存的只读区域,不可修改。因此,将常量直接赋值给指针变量是不允许的。

指针变量需要指向可修改的内存空间,以便在程序运行过程中可以通过指针来修改所指向的值。常量的值是不可修改的,因此不能将常量直接赋值给指针变量。

如果需要将常量的值赋给指针变量,可以通过以下方式实现:

  1. 创建一个与常量类型相同的变量,并将常量的值赋给该变量,然后将该变量的地址赋给指针变量。
  2. 使用类型转换将常量的地址转换为指针类型,并将转换后的指针赋给指针变量。

需要注意的是,如果使用第一种方式,需要确保所创建的变量是可修改的,否则仍然无法通过指针修改其值。

总结起来,指针变量不能直接赋值常量初始化是因为常量的值是不可修改的,而指针变量需要指向可修改的内存空间。

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

相关·内容

数组不可以直接赋值为什么结构体中的数组却可以?

其他复制方式 三、语言标准和编译器 1. 数组和指针的关系 2. 为什么不能对数组赋值 3. 函数形参是数组的情况 4. 为什么结构体中的数组可以复制 5....C/C++ 语法规定在定义变量的时候,是可以使用 操作符 = 来进行初始化操作的。 2....为什么不能对数组变量赋值 有了上面的基础理解就好办了,对于下面的这段代码: int a[5] = {1, 2, 3, 4, 5}; int b[5]; b = a; 赋值语句 b = a 中,左侧的...既然一个表达式中,数组名被临时的表示第一个元素的常量指针,那么就说明我们不能对数组名本身进行计算,例如:不能进行 a++, a-- 等操作。...参数传递和返回值 调用函数,实参到形参的传递; 函数执行结束后的返回值; 这两个场景中都涉及到变量的赋值问题。 关于参数传递,上面已经说了:编译器是把形参当做普通的指针类型的。

3.1K30

c++基础之变量和基本类型

一般定义变量的同时赋值,叫做变量的初始化。而赋值语句结束之后,在其他地方使用赋值语句对其进行赋值,被称为赋值。...从汇编的角度来看,变量的初始化是,变量进入它的生命有效期,对那块内存执行的内存拷贝操作。而赋值则需要分解为两条语句,一个寻址,一个值拷贝。...c++11之后支持初始化列表进行初始化使用初始化列表进行初始化时如果出现初始值存在精度丢失的情况时会报错 c++11之后的列表初始化语句,支持使用赋值运算幅、赋值运算符加上{}、或者直接使用{}、直接使用...这里介绍指针和引用这两种 引用类型 引用是对象的一个别名,从汇编的角度来看引用就是指针,但是使用引用比指针安全,也容易理解 使用引用类型需要注意以下几点: 引用必须指向对象 引用必须初始化 引用一旦初始化后...非底层const可以赋值给底层const,而底层const无法赋值称为非底层const 执行拷贝操作,源对象可以是const或者非const、而目标对象只能是非const constexpr 和常量表达式

1.5K30
  • c和c++的区别(二)const和引用、一级指针、二级指针的结合

    C++中,定义常量必须进行初始化。那么上边四个哪些是常量? int a=10; int *p=&a; int const *p;//const修饰*p,但是没有修饰p。p可更改,故不是常量。...int main(){ int a=10; const int b=20; a=b;//正确,将常量赋值给变量 b=a;//错误,常量不能作左值 } C++中,当const关键字修饰常量,...2.间接修改 会不会将常量的引用或地址泄漏出去,通过使用引用(使用引用会自动解引用)或指针间接修改常量。...q就是&a啊,a是变量,可以通过*q修改a /*但是编译是错误的,为什么呢?...main(){ int &a=10;//错误,不能用立即数进行初始化 const int &b=10;//正确的,为什么呢?

    44920

    CC++ const

    后者表示指针p本身的值不可修改,一旦p指向某个整型变量之后就不能指向其他的变量,即p是个指针常量。 (5)引用本身可以理解为指针常量引用前使用const没有意义。...类对象的非静态常量成员必须在构造函数中初始化,且只能借助于初始化列表,因为初始化列表才是初始化,构造函数中通过赋值运算符进行的是赋值,并非初始化。...4.常见的对const的误解 (1)误解一:用const修改的变量值一定是不能改变的。当const修饰的局部变量存储非只读存储器中,通过指针可间接修改。...此外,还需要注意的是为什么使用const定义变量,C++编译器并不为const变量创建存储空间,相反把这个定义保存在的符号表里。那是因为编译时会进行常量折叠。...常量折叠是其中一种被很多现代编译使用编译器优化技术,在编译简化常量表达式的一个过程。简单来说就是将常量表达式计算求值,并用求得的值来替换表达式,放入常量表,可以算作一种编译优化。

    85610

    《C++ primer》--第三章

    如果定义某个类的变量没有提供初始化式,就会使用默认构造函数。     如果用户定义的类中没有显示定义任何构造函数,编译器就会自动为该类生成默认构造函数,称为合成的默认构造函数。...const迭代器是迭代器常量,该迭代器本身的值不能修改,即该迭代器定义需要初始化,而且初始化之后,不能再指向其他元素。若需要指向固定元素的迭代器,则可以使用const迭代器。...P103 对指针进行初始化赋值只能使用以下四种类型的值: 0值常量表达式,例如,在编译可获得0值的整形const对象或字面值常量0. 类型匹配的对象的地址。 另一对象之后的下一地址。...同类型的另一个有效指针。 p140 为什么使用前自增操作? 有使用C语言背景的读者可能会觉得奇怪,为什么要在程序中使用前自增操作。...对于int型对象和指针编译器可优化掉这项额外工作。但是对于更多的复杂迭代器类型,这种额外工作可能会花费更大的代价。因此,养成使用前置操作这个好习惯,就不必担心性能差异的问题。

    61850

    C++从入门到精通——auto的使用

    前言 C++的auto关键字用于自动推导变量的类型,让编译器根据变量的初始化表达式来确定其类型。使用auto可以简化代码,并且可以某些情况下提高代码的可读性和灵活性。...使用auto声明变量,变量的类型将根据初始化表达式的类型进行推导。...此外,使用auto初始化表达式必须提供足够的信息以便推导出变量的类型,否则将导致编译错误。...二、auto简介 早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?...,使用auto定义变量必须对其进行初始化 return 0; } 【注意】使用auto定义变量必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。

    39210

    C++基础闯关100题,你能闯多少?【2021超硬核大厂高频面试题】

    指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且定义必须初始化 指针初始化后可以改变指向...内存泄漏一般是指堆内存的泄漏,也就是程序在运行过程中动态申请的内存空间不再使用后没有及时释放,导致那块内存不能被再次使用。 20、什么函数不能声明为虚函数?构造函数为什么不能为虚函数?...当拷贝构造函数为private:语句3和语句4在编译时会报错。 使用explicit修饰构造函数:如果构造函数存在隐式转换,编译时会报错。 31、初始化赋值的区别?...40、静态变量什么时候初始化初始化只有一次,但是可以多次赋值主程序之前,编译器已经为其分配好了内存。...C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化,所以我们看到C语言中无法使用变量对静态局部变量进行初始化程序运行结束,变量所处的全局内存会被全部回收。

    2K20

    万字长文【C++】高质量编程指南

    const常量完全可以取代宏常量。 (1)不能再类声明中初始化 const数据成员,因为类的对象未被创建编译器不知道 SIZE的值是多少。...枚举常量不会占用对象的存储空间,它们在编译被全部求值,其缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数。...2,引用被创建的同时必须被初始化指针则可以在任何时候被初始化 3,不能有NULL引用,引用必须与合法的存储单元关联,指针则可以是NULL 4, 一旦引用被初始化,就不能改变引用的关系,指针则可以随时改变所指的对象...内联函数,编译符号表里放入函数的声明,包括名字,参数类型和返回值类型,如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里,调用一个内联函数编译器首先检查调用是否正确,进行类型安全检查...A 的构造函数 { … } 2,类的const常量只能在初始化列表里被初始化,因为它不能在函数体内赋值的方式来初始化 3,非内部数据类型的成员对象应当采用初始化列表方式来初始化,以获取更高的效率。

    1.5K20

    关于C++ const 的全面总结

    3、函数中使用CONST (1)const修饰函数參数 a.传递过来的參数函数内不能够改变(无意义,由于Var本身就是形參) void function(const int Var); b.參数指针所指内容为常量不可变...修饰引用參数: void function(const Class& Var); //引用參数函数内不能够改变 void function(const TYPE& Var); //引用參数函数内为常量不可变...4、类相关CONST (1)const修饰成员变量 const修饰类的成员函数,表示成员常量不能被改动,同一候它仅仅能在初始化列表中赋值。...class A { … const int nValue; //成员常量不能被改动 … A(int x): nValue(x) { } ; //仅仅能在初始化列表中赋值...四、使用const的一些建议 · 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委; · 要避免最一般的赋值操作错误,如将const变量赋值,详细可见思考题; · 參数中使用

    74630

    C++面试知识总结

    2.5 内联函数和宏的区别 内联函数在编译展开,宏编译展开。...引用在创建的同时必须初始化,保证引用的对象是有效的,所以不存在NULL引用。 指针定义的时候不必初始化,所以,指针则可以是NULL,可以定义后面的任何地方重新赋值。...指针常量不能修改指针所指向的地址,一旦初始化,地址就固定了,不能对它进行移动操作。但是指针常量的内容是可以改变。 2.16 指针函数和函数指针的区别 指针函数:返回值是指针的函数。...3.9 类成员中只能使用构造函数的初始化列表而不能赋值的有哪些 const成员 引用成员 3.10 函数模板与类模板的区别 函数模板是模板的一种,可以生成各种类型的函数实例,函数模板的实例化是由编译程序处理函数调用时自动完成的...3.13 const总结 欲阻止一个变量被改变,可以使用const关键字。定义该const变量,通常需要对它进行初始化,因为以后就没有机会再去改变它了。

    1.7K41

    【专业技术第二讲】c语言中const的使用

    程序中使用const可以在一定程度上提高程序的健壮性,但是程序中使用过多的const,可能在对代码的阅读增加一定的难度。...),因为这里const是修饰p指向的变量,而不是指针变量p本身 一旦一个变量被const修饰后,程序中除初始化外对这个变量进行的赋值都是错误的。   ...*'后面,表示是来修饰指针变量本身,因此声明时必须进行初始化,并且在后面不能再指向其它的变量....a,即a的值是不可变的,不能显示地通过赋值语句去改变a的值,但是不代表程序中不能通过其它方法来修改这个值。...总结:(1)C语言中用const去修饰一个变量,表示这个变量是只读的,不可通过显式的调用a去修改a的值,并且此时a仍然是一个变 量,不能等同于常量; (2)要注意const声明变量所处的位置,位置不同

    76360

    基础知识_Cpp

    修饰局部变量堆区分配内存;只有首次定义初始化,直到程序运行结束才释放;作用域为局部作用域。 修饰普通函数,不能修改任何非static对象;该函数的作用域为当前文件 。...C++中的static关键字的总结 const关键字 特性:(1)被修饰的对象不是常量,是一个只读变量(不能放在case关键字后面也说明const不是一个常量);(2)定义赋值,之后不允许修改。...指针和引用的区别 指针也是一个变量,里面存储的内容是一个地址。而引用本质上是一个常量指针,引用只允许初始化不能再修改。 编译指针和引用的代码,汇编上是一样的:c++中,引用和指针的区别是什么?...使用场景 当需要频繁申请内存使用shared_ptr来管理内存,可以创建对象自动初始化资源,也能在生命周期结束自动释放内存。...类内有const变量要用列表初始化,而不能赋值

    1.9K30

    由C语言过渡到C++的敲门砖

    返回值不同 当返回值不同的时候,我们使用的时候无法识别出要使用哪一个函数,因为使用哦的时候仅仅是调用,不会显式的告诉编译器你要用哪个返回值的函数,所以返回值不同的函数不能构成重载。...(无法直接代替指针使用格式: 类型& 引用别名 = 引用对象; 引用的特性 • 引⽤定义必须初始化 • ⼀个变量可以有多个引⽤ • 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体 定义初始化...为什么引用无法直接代替指针链表中,节点就是指针,无法用指针替代。...常量的延伸 (表达式1 + 表达式2)赋值也会产生临时对象 注意:临时对象具有常性!...指针和引用的关系 • 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。 • 引⽤初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以不断地改变指向对象。

    8110

    C#基本知识点-Readonly和Const的区别

    静态常量(Const)是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。   ...动态常量(Readonly)的值则是在运行的那一刻才获得的,编译编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必声明的时候就初始化,而可以延迟到构造函数中初始化。...Const修饰的常量声明的时候必须初始化;Readonly修饰的常量则可以延迟到构造函数初始化 。...这也带来了一个不容易发觉的Bug,因此引用其他程序集的Const变量,需考虑到版本更新问题,要解决这个问题就是把调用的应用程序再编译一次就ok了。...代码中,编译就加载好,不依赖外部dll(这也是为什么不能在构造方法中赋值)。

    1.3K10

    【C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)

    参数 | 本质 代表 没有 ) (2) void * 指针介绍 ( 被赋值 [ 左值 ] 可以被赋值为任意指针类型变量 | 右值 赋值给其它类型变量 需要将 void* 指针强转为被赋值的类型 )...关键字 代码示例 ( const 常量不能赋值 | 错误示例) (3) const 关键字 代码示例 ( 通过指针修改const常量 : 获取 const 变量的地址, 并改变该地址的值 ) (4)...: 1.代码 : #include //使用auto修饰全局变量,编译直接报错,因为auto代表存储栈中, 全局变量存储全局区, 因此auto只能修饰局部变量, 这里出现错误,...void 不能修饰变量, 否则会报错. ---- (2) void * 指针介绍 ( 被赋值 [ 左值 ] 可以被赋值为任意指针类型变量 | 右值 赋值给其它类型变量 需要将 void* 指针强转为被赋值的类型...使用 const 修饰, //const 指针* 的左边, 即其指向的内容是常量, 不可更改 const int* function() { //声明静态局部变量,该变量只初始化一次, 之后重复使用

    2.3K20

    嵌入式软件工程师笔试面试指南-CC++

    因为const对象或引用类型只能初始化不能对他们赋值。 C++中有那些情况只能用初始化列表,而不能赋值?...C++语言中,赋值初始化列表的原理不一样,赋值是删除原值,赋予新值,初始化列表开辟空间和初始化是同时完成的,直接给予一个值 所以,C++中,赋值初始化列表的使用情况也不一样,只能用初始化列表,而不能赋值的情况一般有以下...3种: 当类中含有 const(常量)、 reference(引用)成员变量,只能初始化不能对它们进行赋值。...常量不能赋值,只能被初始化,所以必须在初始化列表中完成,C++的引用也一定要初始化,所以必须在初始化列表中完成。...如果不使用初始化列表初始化构造函数内初始化时,此时与成员变量构造函数中的位置有关。 注意:类成员定义,是不能初始化的 注意:类中const成员常量必须在构造函数初始化列表中初始化

    1.6K11

    【编程基础】C语言指针初始化赋值

    因为p是指向7所的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。...字符串常量传递的是它的首地址,不可以通过*cp修改该字符串的值,因为该字符串为常量,而它只是简单的将指针指向该字符串常量 3、指针常量 C语言中没有一种内建(built-in)的方法去表示指针常量,...大多数计算机中,内存地址确实是以无符号整型数来表示的,而且多以16进制表示,但我们C语言中不能用整型数去表示地址,只能用指针常量来表示,因为它是被用来赋给一个指针的。...对于这个赋值问题还可以换一个角度去理解,C语言中,使用赋值操作符赋值操作符左边和右边的表达式类型应该是相同的,如果不是,赋值操作符将试图把右边表达式的值转换为左边的类型。...要注意的是:对于一个不确定要指向何种类型的指针定义它之后最好把它初始化为NULL,并在解引用这个指针对它进行检验,防止解引用空指针

    2.7K80

    C语言指针初始化赋值

    因为p是指向7所的地址,*p = 7给p所指向的内存赋值,p没有赋值,所以p所指向的内存位置是随机的,没有初始化的。...字符串常量传递的是它的首地址,不可以通过*cp修改该字符串的值,因为该字符串为常量,而它只是简单的将指针指向该字符串常量 3、指针常量 C语言中没有一种内建(built-in)的方法去表示指针常量,...大多数计算机中,内存地址确实是以无符号整型数来表示的,而且多以16进制表示,但我们C语言中不能用整型数去表示地址,只能用指针常量来表示,因为它是被用来赋给一个指针的。...对于这个赋值问题还可以换一个角度去理解,C语言中,使用赋值操作符赋值操作符左边和右边的表达式类型应该是相同的,如果不是,赋值操作符将试图把右边表达式的值转换为左边的类型。...要注意的是:对于一个不确定要指向何种类型的指针定义它之后最好把它初始化为NULL,并在解引用这个指针对它进行检验,防止解引用空指针

    2.5K10
    领券