首页
学习
活动
专区
工具
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。这个做法是达到目地

48020

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

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

19010

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

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

57110

第4章 | 移动

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

5210

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

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

75820

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

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

2.9K30

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

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

60010

C++运算符重载详解

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

1.4K30

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

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

99520

【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函数

46530

【熟视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语言这块内容还不是很熟悉的人来说使用难度较大

13810

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

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

93530

手把手教你深入理解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* 代表这个函数返回类型。

44831

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

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

50230

深入理解C语言指针

1.2、指针变量和指针类型 指针变量就是一个变量,存储内容一个指针。如果用前面的例子,可以理解为指针变量就是一张房卡,房卡存储了房间号信息。 在我们定义一个变量时候,要确定类型。...这里主要还是用二维数组举例,但是还是会给大家分析多维数组和指针关系。...四、指针函数 前面学习函数学到,函数参数可以为 int、char、float 等,但是在操作时,这些参数只作为形参,所有操作都只在函数体内有效(指针操作外),那么今天学习一下指针作为函数参数。...4.2、函数返回值为指针 返回值为指针函数声明如下: 数据类型 *函数名(参数列表){ 函数体 } //例如: int s; int *sum(int x, int y){ s = x + y;...4.3、指向函数指针 C 语言中,函数不能嵌套定义,也不能函数作为参数传递。但是函数有个特性,即函数名为该函数入口地址。我们可以定义一个指针指向该地址,将指针作为参数传递。

45820

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

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

25550

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

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

1.3K20

strtok 函数

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

55720

深入理解C语言指针

1.2、指针变量和指针类型 指针变量就是一个变量,存储内容一个指针。如果用前面的例子,可以理解为指针变量就是一张房卡,房卡存储了房间号信息。 在我们定义一个变量时候,要确定类型。...这里主要还是用二维数组举例,但是还是会给大家分析多维数组和指针关系。...四、指针函数 前面学习函数学到,函数参数可以为 int、char、float 等,但是在操作时,这些参数只作为形参,所有操作都只在函数体内有效(指针操作外),那么今天学习一下指针作为函数参数...4.2、函数返回值为指针 返回值为指针函数声明如下: 数据类型 *函数名(参数列表){ 函数体 } //例如: int *sum(int x, int y){ int s = x...4.3、指向函数指针 C 语言中,函数不能嵌套定义,也不能函数作为参数传递。但是函数有个特性,即函数名为该函数入口地址。我们可以定义一个指针指向该地址,将指针作为参数传递。

99400

由 Go 结构体指针引发值传递思考

隐式引用转换 先看第一次调用 Write 地方,首先 sVals[1] 返回一个 S 类型赋值给变量 s,而之所以能够在 S 类型变量 s 上调用 *S 类型 Write ,是因为 Go...如果一个变量是可寻址,那么你可以使用取地址操作符 & 获取内存地址。 而临时值都是不可寻址,临时值一句话概括就是表达式中间状态,它们生命周期很短,只在表达式计算过程中存在。...} 下面是几个不可寻址例子 // 直接从函数调用返回值:不能函数调用结果直接取地址。...为什么要这样设计 为什么 map 要返回一个副本回来,而不是返回原始对象地址?这种设计选择是出于安全性和一致性考虑。...由于 map 可能在运行时进行重新哈希以调整大小,重哈希后元素地址可能发生变化,所以如果支持返回地址,那么可能会在程序运行中出现错误。

16510
领券