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

C++string类作为形参传值,实参与形参的变化

C++问题: 使用函数调用,排序string字符串数组从小到大,没有使用指针和引用,为什么实参也会改变?...=0;j<2-i;j++) { if(s[j + 1] < s[j]) { temp = s[j]; s[j] = s[j+1]; s[j+1] = temp; } } } } 改变的值是实参的值...,也就是说实参对形参传的是地址,此时形参与实参为同一个地址,形参在改变形参也会改变,所以string类与数组做形参时一样,string类的形参是一个指针,接受的是字符串首个字符地址,其中数组类型在存贮数据是连续线性存贮的...,而string类在存贮字符串数组则是存贮每个字符串首字母的地址,比如a[3] = {"I","love", "c++"}中a[2]为第一个字符串的地址,也就是love种l的地址,这样一来string类字符串数组的每一个字符串长度没有限制...这是关于C++中string类比C语言中数组类型的改进。

1.3K20

值传参、指针传参、引用传参区别

在C中,我们只了解到有两种传参方式,一种是值传递,另外一种是传递指针,一般情况下我们选择使用指针传递参数。在C++中,又新增了一种传参方式,那就是引用(type &),引用传参给我们带来了更好的体验。...1、值传递 值传递是一种值拷贝的操作,一般只用于传入参数使用,而且如果传入的值体积过大(比如一个结构体),在函数压栈的过程中会拷贝一份压入栈中,会影响效率。...而且在函数生命周期结束后,会随函数一起消失,如不作为返回值是无法传出的。...#include using namespace std; // 值传递,无法交换变量的值 // 另外注意:值传递和引用传递函数重载时会出现二义性 // 程序不知道该重载哪个函数来使用。...// swap(&x, &y); // 传引用 swap(x, y); cout << x << “–” << y << endl; getchar(); return 0; }

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

    【C 语言】数组 ( 一维数组形参退化 | 二维数组形参退化 | 函数形参等价关系 )

    文章目录 一、一维数组形参退化 二、二维数组形参退化 三、数组形参等价关系 一、一维数组形参退化 ---- C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int...中 , 如果将整个数组作为形参 , 需要拷贝整个数组的内容 , 如果数组有 1000 个元素 , 需要拷贝 4000 字节 , 这样效率就很低了 ; 如果只需要拷贝数组地址 , 这个地址存放在指针变量中...(int array[]) { } int *array void fun(int *array) { } 二、二维数组形参退化 ---- 二维数组 作为 函数形参 , 也会退化为指针 ; 将 二维数组...也是 指针 , 则形参为 二级指针 ; 实参为 二维数组 int array[10][20] , 等效的 形参为 一级指针 int (*array)[20] ; 二维数组 的 数组的元素 是 一维数组...; 外围数组 ( 第二维 ) 退化为 指针 , 指针 指向的元素 是 一维数组 , 则形参为 指向 一维数组 的指针 , 每个一维数组有 20 个元素 ;

    2.8K10

    python传参是传值还是传引用

    因此,如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象 例2 def test2(p): p = "i in test2" print(p,...str) print(str,id(str)) 输出: i in test2 2885210784112 hello word 2885210784048 id不一样,所以说不是同一个对象,也就是说我们传的还是引用...因此,如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。 总结: Python参数传递采用的肯定是“传对象引用”的方式。...这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。...如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能直接修改原始对象--相当于通过“传值'来传递对象。

    3.6K150

    基于堆栈内存详析 Java函数形参是传值还是引用?

    Java的引用 及 Java函数形参是传值还是引用 Java中没有指针的说法,Java中的引用就类似于C++的指针, Java的引用是栈区的一个变量, 如果引用的是基本数据类型,那它存储着就是栈区的一块内存...,(因为普通基本数据类型由栈区管,long、int、short、byte、float、double、string、boolean),做形参时是传值调用; 如果引用的是new出来的实例(new String...('a')也算,直接写'a'则存在栈区),则这个引用存储的是堆区一块内存的地址(这个时候就类似于C++的指针),做形参时是传引用调用,即C++中的传指针调用; C++中—— 传值调用:形参的值跟传来的变量的值没有底层联系...,各不相犯; 传指针调用:形参的值跟传来的变量的值是同一块内存的地址,可以修改同一块内存的东西,但是形参跟传来的变量是两个不同的变量; 传引用调用:形参只是取别名,是传来的变量的另外一个名字,形参跟传来的变量是同一个变量

    83330

    String的按值传递,java传参都是传值

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用传递?...Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。...java传递参数都是值,如果是对象的话,就是将引用的值复制一份给方法当参数。...如果跟着步骤一步步走的,肯定牢记住了: java所有的参数传递都是传递的副本,变量所代表的值的副本!java所有的参数传递都是传递的副本,变量所代表的值的副本!...java所有的参数传递都是传递的副本,变量所代表的值的副本! 这里必须记住的就是副本概念。

    2.3K60

    C:数组传参的本质

    注意:数组名是arr,而不是arr[10] 数组传参形参该怎么写呢?...void test(int arr[])可以写为void test(int* arr) 注意: 一维数组传参的时候,形参可以写成数组的方式,主要是为了方便理解,形参也可以写成指针变量的方式 如果我们想要在函数内部获取数组元素的个数...,形参也写成⼆维数组的形式,那我们该怎么理解二维数组传参的操作呢?...二维数组传参传递的不是二维数组,而是二维数组首元素的地址,也就是第一行的地址,所以形参的部分要拿数组指针来接收。...3、总结: 数组传参传递的都是地址,所以形参都可以使用指针来接收 一位数组传参传递的是首元素地址,使用(类型)指针来接收, 二维数组传参传递的是一维数组的地址,使用数组指针来接收 本篇文章到这里就结束了

    8010

    【进阶指针二】数组传参&指针传参&函数指针&函数指针数组&回调函数

    【进阶指针一】字符指针&指针数组&数组指针 https://blog.csdn.net/qq_64428099/article/details/125011487 目录  1.数组传参 1-2 二维数组传参... 4 函数指针数组 4-1函数指针数组的引入和基本使用  4-2 函数指针数组的妙用 ----  1.数组传参 1-1一维数组传参 正向:实参给定,猜猜看形参可以怎么写?...2 指针传参 反向:形参给定,猜猜看实参可以怎么写?...// arr是二维数组数组名,表示的是一维数组的地址 return 0; } 2-3 关于传&arr和arr 2-3-1 这里以二维数组为例,讲一讲实参和形参的匹配问题 void test1...-同理,函数指针的类型里的返回值和形参都是对所指向函数的必要说明。

    89540

    指针数组做main函数的形参

    指针数组 1.1 基本概念 指针数组是指一个数组,其中的每个元素都是指针。 这意味着数组中的每个元素都存储一个地址,该地址指向内存中的某个位置。...指针数组的声明形式为: data_type *array_name[size]; //示例: int *p[10];//该指针数组包含10个整型地址 1.2 简单示例 以下是一个简单的示例,演示了如何声明和使用指针数组...intArray[2] = &num3; // 访问指针数组中的元素并输出值 for (int i = 0; i < 3; i++) { printf("Value...指针数组做main形参 2.1 int main(int argc, char *argv[]); 指针数组的一个重要应用是做main函数的形参。...2.2 简单示例 下面例子中,argc 表示命令行参数的数量,而 argv 是一个指针数组,其中每个元素都是一个指向字符串的指针。程序通过循环遍历 argv 数组,输出每个命令行参数的内容。

    11010

    c语言二维数组传参数_c语言数组传参

    第一种形参为二维数组 声明 void function(int a[m][n]);//函数声明 void function(int a[][n]);//不论多少维数组,第一维都可省略。...第二种形参为数组指针 (其实只是 声明定义 与第一种不同,其他一样) 声明 void function(int (*a)[n]); //不是(int *a[n])(指针数组) ,而是(int (*a)...第三种形参为二级指针 声明 void function(int **a,int n);n表示第二维数组长度,即列宽 调用 function( (int **)a,int n);//实参不能为数组名!...n表示第二维数组长度,即列宽 //其他不被允许。由编译器的寻址方式决定。 总结 声明定义(分三种)。 二维数组,数组指针,二级指针。...(都是指针) 调用(一对一,二对二) 数组指针,二维数组就写一级指针即 数组名.

    2.8K10

    【C语言指南】数组传参规则详解

    一、数组传参简介 在使⽤函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进⾏操作。...但数组作为参数传递给函数,不同于普通的变量传参,本篇博客将详细介绍数组传参的规则和实际用法 二、数组传参规则 数组传参,形参是不会创建新的数组的。 形参操作的数组和实参的数组是同⼀个数组 1....数组传参的实参传递 数组名作为实参传递 ,在通常情况下数组名就是首元素的地址。...数组传参的形参接收 2.1 数组传参使用数组名作为形参接收 形参如果是⼀维数组 数组大小可以省略不写,但是数组作为形参,后面的 [ ] 不可以省略 比如可以写成arr[ ] 或者arr[8] #include...print(arr, sz); set(arr, sz); print(arr, sz); } 2.2 数组传参使用指针作为形参接收 形参使用指针接收之后,得到的是一个数组首元素的地址 得到数组首元素地址之后

    20910

    【JavaScript】函数 ③ ( 形参 与 实参 匹配问题 | 实参个数 = 形参个数 | 实参个数 > 形参个数 | 实参个数 < 形参个数 )

    ; 在 JavaScript 中 , 对 形参 和 实参 的 匹配要求比较宽松 , 即使二者 个数 不匹配 , 也不会报错 ; 2、形参与实参个数匹配 如果 实参 的个数 , 与 形参个数一致 , 则正常输出结果...传入 2 个实参, 输出正常结果 add(1, 2); 输出结果为 3 ; 3、实参个数 > 形参个数 如果传入的 实参个数 大于 形参个数 , 则取 形参 个数个 实参 ; 下面的代码中...如果 传入的 实参个数 小于 形参个数 , 那么 后面 没有实参对应的 形参 , 就被当做 声明后未赋值的变量 , 默认值就是 undefined ; 下面的 add 函数中 , 定义了 2 个形参...num1和 num2 , 但是 调用函数时 , 只传入了 1 个实参 6 , 函数 将该实参 6 传递给 num1 形参 , num2 没有对应的值 , 就取默认值 undefined ;...传入 1 个实参, 第二个形参默认为 undefined add(6); 最终的计算结果如下 , num2 形参 未找到与之对应的 实参 , 因此其取值 undefined 默认值 ,

    12310
    领券