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

为什么我的函数不能调整指针的内容,除非我返回一个来赋值它

函数无法直接修改指针的内容,除非通过返回值来赋值给指针,这是因为函数参数传递的方式决定的。

在函数调用时,参数可以通过值传递或引用传递的方式进行传递。对于指针类型的参数,实际上是通过值传递的方式将指针的地址传递给函数。因此,函数内部对指针的修改只会影响到函数内部的指针副本,而不会影响到函数外部的原始指针。

如果想要在函数内部修改指针的内容并影响到函数外部,可以通过返回值来实现。函数可以返回一个指针类型的值,然后在函数外部将返回的指针值赋给原始指针,从而实现对指针内容的修改。

以下是一个示例代码:

代码语言:txt
复制
#include <iostream>

void modifyPointer(int* ptr) {
    *ptr = 10;  // 修改指针指向的内容
}

int* returnModifiedPointer() {
    int* ptr = new int(10);  // 创建一个新的指针,并赋值为10
    return ptr;  // 返回指针
}

int main() {
    int* ptr = new int(5);  // 创建一个指针,并赋值为5

    modifyPointer(ptr);  // 无法直接修改指针内容

    int* modifiedPtr = returnModifiedPointer();  // 通过返回值修改指针内容
    delete ptr;  // 释放原始指针的内存
    ptr = modifiedPtr;  // 将返回的指针赋给原始指针

    std::cout << *ptr << std::endl;  // 输出修改后的指针内容(10)

    delete ptr;  // 释放修改后的指针的内存

    return 0;
}

在上述示例中,modifyPointer函数无法直接修改指针内容,而returnModifiedPointer函数通过返回一个指针来修改指针的内容,并在main函数中将返回的指针赋给原始指针,从而实现了对指针内容的修改。

腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless Cloud Function):https://cloud.tencent.com/product/scf
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(TencentDB for MySQL):https://cloud.tencent.com/product/cdb_mysql
  • 云原生应用引擎(Tencent Cloud Native Application Engine):https://cloud.tencent.com/product/tcnae
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(Tencent Blockchain as a Service):https://cloud.tencent.com/product/tbaas
  • 腾讯云物联网平台(Tencent IoT Explorer):https://cloud.tencent.com/product/explorer
  • 腾讯云移动开发平台(Tencent Mobile Development Platform):https://cloud.tencent.com/product/mps
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C语言】const 关键字

('a'、'\n'、'\017'、'\0xf') ⒉作用 ⇨ 如果一个变量被 const 修饰,那么值就不能再被改变被赋值为"只读"属性。...,不能进行二次赋值。 ...㈡内容⇢那么我们在举出一个代码例子来看看是有关于 const 类型修饰数组下标的内容。...还有的话就是当我这个代码给别人时候用const进行修饰时候当改变这个变量时候就知道在编写程序时候实际上是是不想修改这个变量设置为只读属性。...⒉在主函数当中指针变量用cosnt进行了修饰就说明返回时候我们是不能对其指向地址进行修改变量值,一旦对其进行修改编译器就会报错error。这个做法是达到目地

51820

【C++干货基地】面向对象核心概念 const成员函数 | 初始化列表 | explicit关键字 | 取地址重载

this 指针,使其不能修改。...在成员函数里如果我们只对成员变量读访问,那么建议加上 cosnt指针。 2. 在成员函数里如果我们要对成员变量进行修改,不能加上 cosnt指针。...__a1 还是一个随机值,_a2 就被赋值成了 _a1 随机值 四、explicit关键字 4.1 构造函数隐式类型转换 构造函数不仅可以构造与初始化对象,对于单个参数或者一个参数无默认值其余均有默认值...,还可以使用隐式类型转换方法进行赋值。...其主要原理是 使用 = 号赋值时,会先用 1 构造一个临时变量然后再调用拷贝构造构造函数 也就是 先构造->在拷贝构造 但是编译器目前太智能了,对同一个表达式连续构造会合二为一优化为一步 一个参数无默认值其余均有默认值构造函数

5900
  • 计算机初级选手成长历程——操作符详解(1)

    现在我们以及结束了数组与函数知识板块学习,今天我们将进入下一个板块——操作符板块学习,下面开始介绍我们今天内容吧。...从图中可以看到,取模操作符并不能作用于浮点型,只能进行整型之间取模; 通过与算术对比我们可以发现,算术整数运算返回值为整数部分,算术取模整数运算返回值为余数部分; 总结 除了%操作之外,其它几个操作符可以作用于整数和浮点数...如果我们在使用scanf函数来将输入值存放在变量中,这时我们相当于是直接改变了变量,或者说是实参,此时我们不能直接修改实参,而需要从实参地址中进行修改,所以这就是为什么在使用scanf时需要取地址操作符了...; sizeof在计算数组时,可以通过数组名计算,也可以通过数组元素类型加数组大小计算,前者可以省略括号,后者不能省略; 数组空间大小=数组类型*数组大小; 指针所占空间大小是一个定值,不会根据类型不同而改变大小...我们运行一下: 从结果中我们可以看到,a数据类型不仅没有发生变化,而且a值也没有任何改变,为什么呢?

    22610

    闭关多日,整理一份C++中那些重要又容易忽视细节

    有的人喜欢用内联函数,有的人不喜欢用,嘛,无所谓,什么时候想起来就什么时候用,或者在代码审计时候会去调整一部分函数为内联函数。...3、调用函数从临时位置获取这个值 返回引用返回机制是这样: 1、获取返回值 2、直接将返回值拷贝给调用函数 如果返回值不大,那就不大,如果返回值是一个结构这种比较大东西,那就比较麻烦了,能明白意思不...数据项通常放在私有部分,组成类接口成员函数放在公有部分。 为什么呢?这是C++封装性。不然要类干什么?结构体不能用吗? 在后面讲设计模式时候还会再细讲这一部分。...其实他讲低代码时候,想起来了QTUI,只要你会拖控件,就可以做出界面,代码可以后台自动生成。 而现在又有多少人,是面向百度编程。...这才是心目中真正人间清醒老师。 写给目前困惑朋友,这篇内容可能一周后你就不记得了,但是希望这段话对你有帮助吧。

    59310

    深入理解指针(2)

    上述代码中n是不能被修改,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要 们在代码中对n就⾏修改,就不符合语法规则,就报错,致使没法直接修改n。...//测试*左右两边都有const test4(); return 0; }   结论:const修饰指针变量时候 • const如果放在*左边,修饰指针指向内容,保证指针指向内容不能通过指针改变...但是指针变量本⾝内容可变。 • const如果放在*右边,修饰指针变量本⾝,保证了指针变量内容不能修改,但是指针指 向内容,可以通过指针改变。 5....不过野狗即使拴起来我们也要绕着走,不能去挑逗野狗,有点危险;对于指针也是,在使⽤之前, 们也要判断是否为NULL,看看是不是被拴起来起来野狗,如果是不能直接使⽤,如果不是我们再去使⽤。...如果程序又出现问题,可以移 这条 #define NDEBUG 指令(或者把注释掉),再次编译,这样就重新启用了 assert() 语 句。

    9510

    第4章 | 移动

    ——译者注 4.2 移动 在 Rust 中,对大多数类型来说,像为变量赋值、将其传给函数或从函数返回这样操作都不会复制值,而是会移动值。...例如,将参数传给函数会将所有权转移给函数参数、从函数返回一个值会将所有权转移给调用者、构建元组会将值转移给元组。 你现在可以更好地理解 4.1 节示例中到底发生过什么了。...从函数返回值 调用 Vec::new() 构造一个新向量并返回返回不是指向此向量指针,而是向量本身:所有权从 Vec::new 转移给了变量 composers。...但这种灵活性代价是,作为一门语言,C++ 基本操作(比如赋值、传参和从函数返回值)变得更难预测。...Rust 假定 Rc 指针引用目标通常都可以共享,因此就不能是可变。第 5 章会解释为什么这个限制很重要。

    7310

    【C语言】动态内存开辟使用『malloc』

    新分配内存块内容没有初始化,剩下不确定值。 如果size为0,则返回值取决于特定库实现(它可能是一个指针,也可能不是),但返回指针不应被解引用。 ...该指针类型始终是void*,可以将其转换为所需类型数据指针,以便可解引用。 如果函数分配请求内存块失败,则返回一个指针NULL。...如果传递参数是一个指针,则不会执行任何动作。 该函数返回任何值。  实际上 free()  函数是专门用来作动态内存释放或者回收。...该指针类型始终是void*,可以将其转换为所需类型数据指针,以便可解引用。 如果函数分配请求内存块失败,则返回一个指针。...注意→如果ptr是一个指针,该函数行为类似于malloc(),分配一个大小为字节新块,并返回指向其开头指针

    80220

    strtok独到深刻讲解「建议收藏」

    函数返回值为从指向被分割子串指针。 这个定义和国内一些网站上说法有一些差别,正是这些差别导致很多人对strtok没有一个正确认识。...3.关于函数返回探讨 由”1”中所述,在提取到子串情况下,strtok返回值(假设返回值赋给了指针buf)是提取出子串指针。这个指针指向是子串在源字符串中起始位置。...子串末尾一个字符在提取前为分隔符,提取后被修改成了’/0’。因此,若打印buf值,可以成功输出子串内容。 在没有提取到子串情况下,函数返回什么值呢?...第一次调用之后结果竟然是”Fred”,而非我们所想结果。这是为什么呢?...好了,本文详细介绍了使用strtok注意事项,(二)中将详细介绍strtok不能实现一些功能并引出strtok_r函数,最后介绍一下两个函数实现。

    67310

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

    一、前言 二、数组各种操作 1. 错误方式 2. 利用结构体来复制数组 3. 其他复制方式 三、语言标准和编译器 1. 数组和指针关系 2. 为什么不能对数组赋值 3....函数形参是数组情况 4. 为什么结构体中数组可以复制 5. 参数传递和返回值 五、总结 一、前言 在 C/C++ 语言中,数组类型变量是不可以直接赋值。...但是如果把数组放在结构体中,然后对结构体变量进行赋值,就可以实现把其中数组内容进行复制过去。 很多朋友对这个不是特别理解,只是强制记忆,下面尝试用自己理解描述一下,希望对你有所帮助!...参数传递和返回值 在调用函数时,实参到形参传递; 函数执行结束后返回值; 这两个场景中都涉及到变量赋值问题。 关于参数传递,上面已经说了:编译器是把形参当做普通指针类型。...对于函数返回值来说,同样道理,也不能直接返回一个数组,因为仅仅是临时性代表第一个元素常量指针。 当然,可以利用结构体赋值特性,把数组包裹在其中,以此达到复制效果。

    3.4K30

    【C语言加油站】函数栈帧创建与销毁

    程序运行中,由BIU自动修改,使IP始终指向下一条将要执行指令地址,因此它是用来控制指令序列执行流程,是一个重要寄存器。 8086程序不能直接访问IP,但可以通过某些指令修改IP内容。...例如,当遇到中断指令或调用子程序指令时,8086自动调整IP内容,将IP中下一条将要执行指令地址偏移量入栈保护,待中断程序执行完毕或子程序返回时,可将保护内容从堆栈中弹出到IP,使主程序继续运行。...,观察一下__scrt_common_main_seh函数,看看值是什么; 这里代码比较多,我们不用关心其它内容是什么,我们先看这两个返回值,返回都是这个局部变量值,这个局部变量值是invoke_main...这个函数值,接下来我们继续观察invoke_main这个函数; 现在就可以看到了,对于incoke_main函数值是main函数返回值,那我们现在就清楚了原来一个main函数是经过这种层层调用来实现...以上就是函数栈帧销毁整个过程,通过pop、ret指令释放函数栈帧空间。现在已经回到主函数了,我们还有一个问题没有解决,Add函数值是如何返回到main函数

    58130

    strtok()函数使用以及注意事项

    返回值:分隔符匹配到一个子串 二、主要内容 1、函数作用是分解字符串,所谓分解,即没有生成新串,只是在s所指向内容首次出现分界符位置,将分界符修改成了’/0’,故第一次用strtok()返回一个子串...至于为什么要赋空值,要么你就记住结论,要么去查strtok源代码。本文最后会有一些介绍。 当然也有部分爱钻牛角尖的人,非不按套路出牌,要看看不赋空值继续赋值为buffer会有什么结果。...3.关于函数返回探讨 由”1”中所述,在提取到子串情况下,strtok返回值(假设返回值赋给了指针buf)是提取出子串指针。这个指针指向是子串在源字符串中起始位置。...子串末尾一个字符在提取前为分隔符,提取后被修改成了’/0’。因此,若打印buf值,可以成功输出子串内容。 在没有提取到子串情况下,函数返回什么值呢?...第一次调用之后结果竟然是”Fred”,而非我们所想结果。这是为什么呢?

    1.6K20

    C++运算符重载详解

    因此这种运算符函数一个参数必须是引用类型,而不能是常量,同时返回类型要和第一个参数类型一致。...那么为什么要让对象提供函数能力呢?答案就是我们可以在对象函数运算符内部访问一些对象本身具有的其他属性或者其他成员函数,而普通函数则不具备这些特性。...复引用运算符、地址运算符、成员访问运算符 描述 值 运算符种类 * & -> 是否支持类成员 YES 是否支持普通函数 除了* &支持外,->不支持 运算单元 1元 返回类型 任意 在C++语言中可以可以对一个指针对象使用...*运算符实现取值操作,也就是得到这个指针所指向对象;对一个对象使用&运算符来得到对象指针地址;对于一个指针对象我们可以使用->运算符来访问里面的数据成员。...当然一个完整智能指针封装不仅仅是对三个运算符重载,我们还需要对构造函数、拷贝构造、赋值运算符、类型转化运算符、析构函数进行处理。

    1.4K30

    C语言:(动态内存管理)

    这个函数向内存申请⼀块连续可⽤空间,并返回指向这块空间指针。...free(p); p = NULL; } 使⽤free释放⼀块动态开辟内存⼀部分 为什么会报错呢,因为free释放空间是从首地址开始释放 当p加到10了,p就已经不是首地址了,就无法释放空间了 我们可以创建一个指针变量加...free释放空间然后把p赋值NULL 第二个free释放空间,释放是空指针当然是没有问题 当第一个free释放空间没有把p赋值为NULL 第二个free释放就是野指针了,就会报错了 所以把p赋值为...这是返回栈空间问题,进这个函数创建,出这个函数销毁,可以返回变量,但不能返回地址 char* GetMemory(void) { char p[] = "hello world"; return...连续内存有益于提⾼访问速度,也有益于减少内存碎⽚。(其实,个⼈觉得也没多⾼了,反正你跑不了要⽤做偏移量加法寻址) C/C++程序内存分配⼏个区域: 1.

    7610

    C++类和对象(中)【下篇】

    下面我们可以看到,d1是个隐含this指针,把d2年/月/日赋值给d1,但是为什么要引用返回d1呢。...const实际修饰该成员函数隐含this指针指向内容,表明在该成员函数不能对类任何成员进⾏修改。...这个const修饰d2,内容不能被修改。 传给this指针前面没有const修饰,d2传给this指针,那岂不是可以修改d2内容。 那这不就是权限放大吗。...⾮⼀些很特殊场景,⽐如我们不想让别⼈取到当前类对象地址,就可以⾃⼰实现⼀份,胡乱返回⼀个地址。 一个是取普通对象地址,一个是取const修饰对象地址。...这2个运算符重载,我们不需要自己实现,编译器默认生成就够用了。 ⾮⼀些很特殊场景,如果我们不希望返回地址,可以显示写,返回nullptr。

    9410

    【熟视C语言】C语言动态内存管理(malloc,calloc,realloc,free)

    void* malloc (size_t size); 这个函数向内存申请一块在堆区上连续可用空间,并返回指向该空间指针。 开辟成功会返回指向开辟好空间指针,失败则返回NULL指针。...,防止非法访问内存空间(野指针) return 0; } calloc malloc外,C语言还提供了一个函数calloc用于动态内存分配。...返回值为一个指向调整之后空间起始地址void*指针。 如果申请失败会返回一个指针,并且不会自行释放原先空间。...这种情况realloc函数会在堆其他位置上找一块总够大空间,将原有数据拷贝进去,并且会自行释放原来占用空间,最后返回地址是一个地址。...free(array); array = NULL; return 0; } 动态内存函数常见使用错误 由于动态内存函数地使用涉及指针,内存空间知识,对于C语言这块内容还不是很熟悉的人来说使用难度较大

    18510

    彻底搞定C语言指针(精华版)

    上面的 内容不是书本身,而是书地址,你通过纸条这个指针找到了借给你本书。 那么我们C,C++ 中指针又是什么呢?...pi也只不过是一个变量而已嘛!那么它又为什么会被称为指针?关键是我们要让 这个变量所存储内容是什么。现在要让pi成为真正有意义上指针。...有没有发现 pi值是不能重新赋值修改了。只能永远指向初始化时内存地址了。相反,这次你可以通过*pi修改 i1值了。与前一个例子对照一下吧!...MyFun函数 { printf (“%dn”,x); } 这个MyFun函数一个返回函数并不完成什 么事情。...三 通过函数指针变量调用函数 有了FunP指针变量后 ,我们就可以对赋值指向MyFun,然后通过FunP调用MyFun函数了。

    96230

    【C语言】数据类型存储、原码,反码,补码

    共同学习交流 ✉️ 我们并非登上我们所选择舞台,演出并非我们所选择剧本 ♦  目录  类型意义: ✨C语言类型分为 ✨构造类型  ✨指针类型 空类型 ✨函数返回类型☮ ✨函数参数☪ 整形在内存当中存储空间...举个例子就像:当你把一个变量a赋值给了int整形,那么存储大小就是4个字节取值范围就是 -32768~32767。 注意,各种类型存储大小与系统位数有关,但目前通用以64位系统为主。  ...指针类型 指针目的其实就是为了存放一个地址赋值给其中变量,而指针字节都是4个字节。...这样我们用一段代码让大家直观看看是不是指针是4个字节,由于博主再前面跟大家讲过野指针内容但是指针内容还没有跟大家说,到时候博主也会写一篇有关于指针内容,由此可见指针类型是一种特殊类型。...空类型(无类型) void 用于显示说明一个函数返回任何值。

    55730

    【C++】 夜尽头不是 引用,是天空没有极限

    ,如图所示: 我们观察发现,在将n返回时,会创建一个临时变量将n值拷贝到临时变量中,等到Count函数栈帧销毁时,变量n自然会销毁,导致无法返回,造成越界访问。...因为n内存空间里内容可能没有来得及改变,没有人去使用它,所以你非法访问时,内容可能不变,仍是你之前留下值。 第二次为什么是随机值呢?...哈哈哈 所以,总结: 1.出了函数作用域,返回变量不存在了,不能用引用作返回值,因为引用返回结果是未定义 2.出了函数作用域,变量还在,可以用引用。...----  3.const修饰引用  先看下面的一段代码,从中体会const修饰引用注意要点: 指针和引用赋值中,权限可以缩小,但是不能放大 int main() { // 指针和引用赋值中,...在底层实现上实际是有空间,因为引用是按照指针方式实现,都是先通过传地址,解引用来改变实体内容。 引用和指针不同点: 1.

    27950

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

    创建一个临时对象并返回,如下。...数组名对应着一块内存,其地址与容量在生命期内保持不变,只有数组内容可以改变。 指针可以随时指向任意类型内存块,特征是 可变,所以我们常用指针操作动态内存,指针远比数组灵活,但也更危险。...//由于编译后名字不同,C++程序不能直接调用C函数,因此,c++提高了一个C连接交换指定符合 extern “C”解决这个问题。...A 构造函数 { … } 2,类const常量只能在初始化列表里被初始化,因为它不能函数体内赋值方式初始化 3,非内部数据类型成员对象应当采用初始化列表方式初始化,以获取更高效率。...指针内容不能被修改,该返回值只能被赋给加 const修饰同类型指针 例如函数 const char * GetString(void); 如下语句将出现编译错误: char *str = GetString

    1.5K20

    手把手教你深入理解cc++中指针

    a地址,也就是2000,当我们想通过p操纵a的话,首先要根据p保存地址找到指向内容,也就是解引用*p,当*p内容放生改变时候,首地址为2000内存单元存储值也会做出改变,因此变量当*p...第四行直接报错,因为&arr指的是整个数组指针不能把数组指针赋值给整形指针。虽然arr与&arr在数值上是相同,但是两者意义不同。...但是要注意,当用sizeof操作符操作arr时候,这个时候不能把arr当做一个指针对待,因为sizeof操作数组时候返回是数组字节长度,而单个指针变量只占用四个字节。...* p = &a; return p; } 这个test就是一个指针函数返回一个int型指针。...再看右边(int** p),它是一个函数,参数为一个二级指针。最左边char* 代表这个函数返回类型。

    50931
    领券