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

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

文章目录 一、直接修改 和 间接修改 指针变量 的值 二、在函数中 间接修改 指针变量 的值 三、在函数中 间接修改 外部变量 的原理 一、直接修改 和 间接修改 指针变量 的值 ---- 直接修改 指针变量...= &a; 间接修改 指针变量 的值 , 首先要 将 指针变量 的 地址值 , 赋值给 1 个 二级指针 变量 , 通过 * 符号 , 间接修改 一级指针变量的值 ; // 将一级指针的地址赋值给二级指针...p = &a; // 打印一级指针地址 printf("%d\n", p); // 将一级指针的地址赋值给二级指针 p2 = &p; // 间接修改指针的值...return 0; } 执行结果 : 二、在函数中 间接修改 指针变量 的值 ---- 在 函数 中 间接修改 指针变量 的值 , 将 指向一级指针 的 二级指针 变量 , 传递到 函数形参 中 ,...// 将一级指针的地址赋值给二级指针 p2 = &p; // 间接修改指针的值 *p2 = 12345678; // 打印一级指针地址 printf("%d\

21.4K11

【C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )

自定义的 业务子函数 与 主函数 main() ; 定义的接口如下 : 要点 1 形参指针间接赋值 : 主要是获取子串大小 , 通过 int *sub_count 参数的 间接赋值 , 实现函数结果返回...接收 函数形参变量 , 尽量不修改 函数 形参 的值 ; 形参指针判空 : 凡是传入的指针 , 一律判定指针是否合法 ; 形参返回值处理 : 返回值不要直接修改 , 先定义临时局部变量保存返回值 , 最后执行完毕..., 再将返回值 通过 间接赋值 赋值给 形参中的 返回值指针 指向的 内存地址 ; /* * 获取字符串中子串个数接口 * char *main_str : 大字符串 * char *sub_str..., 是否包含 "abc" 子串 // 如果包含 , 返回子串第一次出现的指针地址 , 非 0 则执行循环体内容 // 如果不包含 , 返回 NULL , 如果没有找到 , 退出循环...使用 指向 count 变量的指针 间接赋值 进行返回 int ret = get_sub_count(str, sub, &count); // 如果返回非 0 值 , 说明执行失败

3.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    如何理解Go语言中的值接收者和指针接收者?

    在Go语言中,函数和方法可以定义成使用值接收者或指针接收者。这两种类型的接收者有一些重要的区别,理解这些区别对于编写有效的Go代码至关重要。...值接收者当我们定义一个函数或方法并指定它使用值接收者时,Go会将调用该函数或方法的参数值复制一份,然后将这个副本传递给函数或方法。这意味着在函数或方法内部对参数的任何修改都不会影响到原始的参数值。...当我们调用 s.ChangeValue(20) 时,p 是 s 的内存地址,所以 p.Value = newValue 会修改 s 的值。如何选择值接收者还是指针接收者?...选择使用值接收者还是指针接收者主要取决于你想要的行为。如果你希望函数或方法能够修改它的参数,那么你应该使用指针接收者。如果你不希望函数或方法修改它的参数,那么你应该使用值接收者。...总的来说,理解Go语言中的值接收者和指针接收者是非常重要的,因为它们决定了你的函数和方法是否可以修改它们的参数。

    10820

    【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )

    文章目录 一、将 两头堵模型 抽象成业务模块函数 二、完整代码示例 一、将 两头堵模型 抽象成业务模块函数 ---- 将 两头堵模型 抽象成业务模块函数 相关要点 : 形参返回值 : 函数的返回值 ,...一般使用 函数形参 间接赋值 进行返回 ; 下面的代码中 int *count 是返回值 ; int get_count(char *str_all, int *count) 函数返回值 : 函数的返回值..., 最终执行完毕后 , 再写出到指针指向的内存中 ; // 保存非空字符串长度 , 局部临时变 , 计算结果 int count_tmp = 0; // 计算结果 count_tmp...= j - i + 1; // 通过间接赋值设置返回值 *count = count_tmp; 二、完整代码示例 ---- 完整代码示例 : #include #include...= '\0') { j--; } // 计算结果 count_tmp = j - i + 1; // 通过间接赋值设置返回值 *count

    73220

    JVM精通面试系列 | 掘金技术征文

    在加载时 char 的值会被复制到 int 类型的低二字节,而高二字节则会用 0 来填充。 对于 byte、short 这两个类型来说,加载伴随着符号扩展。...在加载时 short 的值同样会被复制到 int 类型的低二字节。如果该 short 值为非负数,即最 高位为 0,那么该 int 类型的值的高二字节会用 0 来填充,否则用 1 来填充。...如果没有找到,在 C 的直接实现或间接实现的接口中搜索,这一步搜索得到的目标方法必须是非私有、非静态的。并且,如果目标方法在间接实现的接口中,则需满足 C 与该接口之间没有其他符合条件的目标方法。...方法句柄的调用和反射调用的共同点 都是间接调用,同样会面临无法内联的问题。 09 | JVM是怎么实现invokedynamic的?...当发生垃圾回收时,便把存活的对象复制到to 指针指向的内存区域中,并且交换 from 指针和 to 指针的内容。

    81020

    【AI系统】QNNPack 算法

    “消除所有非计算必需的内存转换”即为间接卷积算法的核心特定,这样的特性同样也注定了它在非量化任务中同样能起到显著的优化作用。...间接卷积算法没有将实际数据从输入张量复制到 Im2Col 缓冲区,而是设置了一个间接缓冲区(Indirection Buffer),其中包含指向用于计算每个输出像素的输入像素行的指针。...对于每个输出像素位置和每个内核元素,间接缓冲区包含一个指向输入像素行的指针,该行的像素将与相应内核元素的滤波器权重行进行卷积,以生成相应的输出像素。对于非单位内核的卷积,通常使用隐式填充。...间接缓冲区计算 现在来分析如何使用间接缓冲区完成计算。 和前文相同,本文讨论的依然为 M × N 规模的输出,而这些输出要使用 M 个 KH × KW 大小的输入,其中有数据重用。...间接缓冲区使得可以通过指针模拟出对输入的访存。在实际运行计算尺寸为 M × N 的计算核时,会有 M 个智障扫描输入。M 个指针每次从间接缓冲区中取出 M 个地址,即对应于 M × IC 的输入内存。

    5810

    JVM学习笔记

    本文所有内容来于:http://stuq.com/a/100ww java代码是如何执行的 java代码是运行于java虚拟机上的,通过java虚拟机实现了跨平台,并且java虚拟机帮助程序员处理了容易出错的事务...JVM如何执行字节码 Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本地方法栈。如下图所示: ?...对于静态绑定的方法调用而言,实际引用将指向具体的目标方法。对于动态绑定的方法调用而言,实际引用则是方法表的索引值(实际上并不仅是索引值)。...反射调用的 Inflation 机制是可以通过参数(-Dsun.reflect.noInflation=true)来关闭的。...如果不是,它会在当前线程的当前栈桢中划出一块空间,作为该锁的锁记录,并且将锁对象的标记字段复制到该锁记录中。

    86520

    面试爱问之const关键字

    const修饰的局部变量还是变量,直接修改编译器报错,可以间接修改,存放在栈区,代码块结束时释放。 const修饰全局变量:直接修改编译器报错,间接修改编译器也许会通过,但运行时会报错(段错误)。...如果const在星号的左边,则为常量指针 如果const在星号的右边则为指针常量 如果我们将星号读作‘指针’,将const读作‘常量’的话,内容正好符合。...但是依然可以通过其他的普通指针改变变量的值。...因此,有三种情况可讨论: 1、函数参数为值传递: 值传递(pass-by-value)是传递一份参数的拷贝给函数,因此不论函数体代码如何运行,也只会修改拷贝而无法修改原始对象,这种情况不需要将参数声明为...2.3 防止修改指针指向的内容和地址 4.修饰函数的返回值 1、如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。

    34920

    一文搞懂七种基本的GC垃圾回收算法

    保守式 GC 的缺点 识别指针和非指针需要付出成本。在跟空间里,变量和指针的值相同的情况下,程序需要额外通过是否内存对齐、是否指向堆内对象的开头等手段来判断指针和非指针,成本较高。...改进二:间接引用 保守式 GC 有个缺点,就是“不能使用 GC 复制算法等移动对象的算法”。解决这个问题的方法之一就是“间接引用”。 根和对象之间通过句柄连接。...每个对象都有一个句柄,它们分别持有指向这些对象的指针。并且局部变量和全局变量没有指向对象的指针,只装着指向句柄的指针。当应用程序操作对象时,要通过经由句柄的间接引用来执行。...只要采用了间接引用,那么即使移动了引用目标的对象,也不用改写关键的值——根里面的值,改写句柄里的指针就可以了。也就是说,我们只要采用间接引用来处理对象, 就可以移动对象。...图3.33 根到对象通过句柄间接引用 优点:因为在使用间接引用的情况下有可能实现 GC 复制算法,所以可以得到 GC 复制算法所带来的好处,例如消除碎片化等。

    4.8K86

    一文搞懂七种基本的GC垃圾回收算法

    识别指针和非指针需要付出成本。在跟空间里,变量和指针的值相同的情况下,程序需要额外通过是否内存对齐、是否指向堆内对象的开头等手段来判断指针和非指针,成本较高。 \2. 错误识别指针会压迫堆。...改进二:间接引用 保守式 GC 有个缺点,就是“不能使用 GC 复制算法等移动对象的算法”。解决这个问题的方法之一就是“间接引用”。 根和对象之间通过句柄连接。...每个对象都有一个句柄,它们分别持有指向这些对象的指针。并且局部变量和全局变量没有指向对象的指针,只装着指向句柄的指针。当应用程序操作对象时,要通过经由句柄的间接引用来执行。...只要采用了间接引用,那么即使移动了引用目标的对象,也不用改写关键的值——根里面的值,改写句柄里的指针就可以了。也就是说,我们只要采用间接引用来处理对象, 就可以移动对象。...图3.33 根到对象通过句柄间接引用 优点:因为在使用间接引用的情况下有可能实现 GC 复制算法,所以可以得到 GC 复制算法所带来的好处,例如消除碎片化等。

    99894

    Golang反射-上篇

    即value, type中的value 5.1 反射第一定律 反射第一定律:反射可以将interface类型变量转换成反射对象 如何通过反射获取一个变量的值和类型 package main import...interface类型变量的,其中TypeOf()和ValueOf()接受的参数都是interface{}类型的,也即x值是被转成了interface传入的 5.2 反射第二定律 反射第二定律:反射可以将反射对象还原成...(float64)类型断言获取float64类型的值 5.3 反射第三定律 反射第三定律:反射对象可修改,value值必须是可设置的 通过反射可以将interface类型变量转换成反射对象,可以使用该反射对象设置其持有的值...即通过v修改其值是无法影响x的,也即是无效的修改,所以golang会报错 想到此处,即可明白,如果构建v时使用x的地址就可实现修改了,但此时v代表的是指针地址,我们要设置的是指针所指向的内容,也即我们想要修改的是...Value和非指针Value互相转换 userValue := userPtrValue.Elem() //Elem() 指针Value转为非指针Value fmt.Println

    84910

    关于指针的详细讲解

    通俗的将指针就是地址,指针变量就是存储地址的变量。 一个简单的指针变量的声明: int *p; 上述声明p是指向int类型对象的指针变量。...int i,*p; p=&i; 通过把i的地址赋值给变量p的方法,描述为把p指向i; Q&A:在声明指针变量的同时对它进行初始化也是可行的: int i; int *p=&i; 或者 int i,*p=...&i; 二、间接寻址运算符 一旦指针变量指向对象,就可以使用*运算符访问存储在对象中的内容。...*p不仅拥有和i相同的值,而且对*p的改变也会改变i值。(*p是左值,随意对它赋值是合法的)。 不要把间接寻址运算符用于位初始化的指针变量。...第一条指针赋值,而第二条不是,举个例子: p=&i; q=&j; i=1; *q=*p; 赋值语句*q=*p是把p指向的值复制到q指向的对象(变量j)中。

    52620

    深入理解 go 反射

    反射定律 在 go 官方文档The Laws of Reflection中提出了三条反射定律: 反射可以将 interface 类型变量转换成反射对象 反射可以将反射对象还原成 interface 对象...var a = 1 typeOfA := reflect.TypeOf(a) valueOfA := reflect.ValueOf(a) 反射可以将反射对象还原成 interface 对象 我们可以通过...如果是可设置的,我们就可以通过 reflect.Value.Set 来修改反射对象的值。 这其实也是非常场景的使用反射的一个场景,通过反射来修改变量的值。...通过这类方法,我们可以修改反射值的内容,前提是这个反射值得是合适的类型。...通过这类方法,我们可以获取反射值的内容。前提是这个反射值是合适的类型,比如我们不能通过 complex 反射值来调用 Int 方法(我们可以通过 Kind 来判断类型)。

    12310

    追寻数组的轨迹,解开算法的情愫

    ,如果快指针遍历到的数组的元素大小不等于val的话,那么我们就将当前位置赋值给慢指针的位置上面,然后慢指针进行++移动的操作,然后我们就间接的将这个val的值删除了 好的,让我举个具体的例子来说明这个解法...状态:nums = [3, 2, 2, 3],i = 0,j = 1 第二轮: j = 1,nums[1] = 2,不等于 val,将 nums[1] 复制到 nums[i],即 nums[0]...解释: 在整个过程中,快指针 j 负责遍历数组,找到不等于 val 的元素后将其复制到慢指针 i 所在的位置,并将慢指针 i 向前移动一位。最终,i 的值就是数组中不等于 val 的元素个数。...=val) { nums[i]=nums[j];//将这个位置的值赋值给慢指针指向的位置 i++;//慢指针往后移动 }...,那么您的题解将被 通过。

    11310

    深入理解Golang的reflect原理

    通过reflect就可以反射出自定义的类型和值。3. reflect 实现原理从上一个章节中就可以看出,要想弄明白在Golang中是如何实现反射的,那么就需要先了解什么是interface ?...反射可以将反射对象还原成 interface 对象我们可以通过 reflect.Value.Interface 来获取到反射对象的 interface 对象,也就是传递给 reflect.ValueOf...如果是可设置的,我们就可以通过 reflect.Value.Set 来修改反射对象的值。 这其实也是非常场景的使用反射的一个场景,通过反射来修改变量的值。...上文中,修改反射对象章节中,有具体例子。4.2 Interface 方法获取反射对象的动态值。 也就是说,如果反射对象是一个指针,那么 Interface 方法会返回指针指向的值。...通过 reflect.Type 可以获取类型信息,通过 reflect.Value 可以获取值信息反射三定律:反射可以将 interface 类型变量转换成反射对象。

    75171

    一起长锈:4 默认不可变的变量绑定与引用(从Java与C++转Rust之旅)

    解引用操作符 * 被用于访问引用所指向的值。” ”我们试图修改 x解引用后所指向的值。这里的 x 是一个不可变引用,因此尝试修改它的值(*x += 1)将导致编译错误。”...“在两种语言中,*都用于访问或修改指针(C++)或引用(Rust)指向的内存的值。 “基本用法:在两种语言中,解引用都是一种间接访问和操作变量的方式。...Rust Java C++ 变量绑定 使用let将值绑定到变量名。默认情况下,变量绑定是不可变的,但可以通过mut关键字使其变为可变的。...内存管理与赋值无关 语义 由于所有权,借用和生命周期的概念,更为复杂 更简单,只涉及将值复制到内存中 更简单,只涉及将值复制到内存中 Rust的引用是一种借用数据的方式,分为不可变引用(&T)和可变引用...用途 两者都允许通过解引用间接访问和操作变量。 两者都允许通过解引用间接访问和操作变量。 安全性和错误处理 Rust在编译时执行所有权和借用规则,确保不会解引用空指针或悬空引用。

    23943
    领券