C++单纯的指针传参的问题】的更多相关文章

C++指针传参也是单纯的复制一份地址,如下代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; void fun(char *p) { p = (); } int main() { char *p = NULL; fun(p); std::cout << p; ; } char *p = NULL;一个P指向了一个NULL fun(p);复制了一个P_1指向了一个NULL然后P_1指向…
个人原创: 1. 形参:形式上的参数,一般多在函数声明.函数定义的参数上: 2. 实参:实体参数,有实际的值,在运算上被循环使用的值: 3. 按值传参:按值,就是把实际的值传给函数内部: 4. 指针传参:使用指针形式传递参数,把参数的地址传递进去,直接操作地址: 5. 引用传参:只有在C++中才有,C中没有引用传参,其意义就是传递了一个实参的别名,有实参和指针的优点,但没有其占用那么多的内存: 函数之间的数据传递共有三种形式: (1) 按值传递:使用变量名做实参和形参,直观易懂,但效率低: (2…
首先要理解参数传递,参数传递分值传递,指针传递,引用传递.(就我自己理解,就是把实参对形参进行赋值) 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递. 指针传递: 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作 引用传递: 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程…
typedef struct node{int n;node *left;}*tnode; 传参的时候注意用** void init(node **nn);int main(){tnode nna;init(&nna);cout<<nna->n<<endl;return 0;}void init(node **nn){*nn=(tnode)malloc(sizeof(node));(*nn)->n=0;(*nn)->left=NULL;} 因为传的是*就只…
#同名局部变量调用外部全局变量: num=100def fun(): global num#告诉编译器是全局的num num+=100 print(num)print(fun)print(fun())#print(fun()) 局部变量没有初始化报错,局部变量覆盖全局变量, #类似Cpp引用,返回值修改,全局变量,变量对象,类对象,其他 #在函数内修改没有办法返回 # -*- coding: utf-8 -*-#returndef fun(x): x=x+1 y=x+2 return y dat…
前提 一级指针和引用 已经清晰一级指针和引用. 可参考:指针和引用与及指针常量和常量指针 或查阅其他资料. 一级指针和二级指针 个人觉得文字描述比较难读懂,直接看代码运行结果分析好些,如果想看文字分析,可参考文末参考文章. 例子 #include <iostream> using namespace std; int main() { int a=5; int *q=&a; int **pp=&q; //下面的两行输出在垂直方向上的相应值相同,由输出可知一级指针和二级指针的关系…
引用传递有两种传参方式,具体可参考文章 概括地讲,就是 *声明一个形参是指针,所以需要传递指针实参,对应的函数实现也应当遵循指针的语法.这种实现思路并不针对于C或者C++,因为它们都有指针,所以都可以通过指针来达到引用传参的效果,但是这种实现本质上不叫引用传参,因为传递的是指针,而不是实参的引用. &这个操作符,在形参声明时,表示该形参是一个引用,不同于指针,也不是取地址操作符,该引用操作符属于C++的标准.函数被调用时,不会在内存中开辟新的空间,而是相当于给实参起了一个新名字,比如说如下代码中…
一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的char型数组,所以sizeof(str)的结果为这个数据结构占据的内存大小:10字节. 再看: . ]; . cout << sizeof(intArray) ; 第2行的输出结果为40(整型数组占据的内存空间大小). 如果C/C++程序可以这样写: . ] intArray; . cout &…
/************************************************************************* > File Name: message.c > Author: Mr.Yang > Purpose:初始化并使用char指针数组,并且通过for循环方式.函数传参方式进行指针数组的遍历 > Created Time: 2017年06月04日 星期日 10时15分16秒 ********************************…
int add(int a, int b)   //函数传参的时候使用了int整型数据,本身是数值类型.实际调用该函数时,实参将自己拷贝一份,并将拷贝传递给形参进行运算.实参自己实际是不参与运算的.所以在该函数中,实参本身是没有得到改变的. int main() { int x = 3, y = 5; swap(x, y); printf("x = %d ,y = %d\n",x, y);  //交换失败 swap_pointer(&x, &y); printf(&qu…
关于传参总是搞晕,这里总结下: 值传递: void func(int n) { } void main() { int x = 1; func(x); return; } 这种就是值传递,在func函数里,对参数n进行赋值操作,main函数的x始终是1. 指针传递: 我理解的指针传递有两种场景: 1)修改指针指向的内容,举例: class A{public: A(): ~A():public: int k;}void func(A* p) { P->K = 6; } void main() {…
(以下均为个人理解) 函数访问的传参两种方式大致为: 值传递: 地址传递. 但是实际上可以都理解为,传进来的[形参]是主函数里的实参值的[一种复制]. 举个例子,哪怕我们将地址作为子函数的输入变量,形参依然只是一种复制,只在子函数运行期间存在: #include <stdio.h> #include <stdlib.h> void swap(int* a, int* b) { printf("a is %p, b is %p\n", a, b); int* t…
一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么函数体内是无法直接修改传入的变量的. 假如我们把v=1传入函数体f(v1),实际就是新增了v1变量名,它和v同时指向1这个对象,如果我们在函数内部试图修改v1,由于整形是不可变的,实际上会创建一个新的对象,将v1指向新的对象,如果v指向的是可变对象,则内部对于其的修改会体现在外部上,这也是推荐tup…
该随笔受启发于<CLR Via C#(第三版)>第四章4.4运行时的相互联系 一.内存分配的几个区域 1.线程栈 局部变量的值类型 和 局部变量中引用类型的指针(或称引用)会被分配到该区域上(引用类型的一部分内存被分配到该区域内). 该区域由系统管控,不受垃圾收集器的控制.当所在方法执行完毕后,局部变量会自动释放(引用类型只释放指针,而不释放指针指向的数据). 堆栈的执行效率很高,但容量有限. 2.GC Heap(回收堆) 用于分配小对象(引用类型),如果引用类型的实例大小 小于85000个字…
环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程.这里不使用编译器自动生成的这部分汇编代码,因为编译器自动生成的代码会涉及环境变量的传递,参数的传递等等一系列问题.以ARM汇编来进行分析.使用一个启动汇编文件和一个main.c的文件,在ARM 2440板子上调试这段程序,使用JLinkExe借助jlink来调试: init.s: .text .global _start _start: ldr sp…
看了很多关于阐述JAVA传参到底是值传递还是引用的问题,有些说得很肤浅让人感觉似懂非懂的感觉,但是好像又能解决一些问题,然后就止步了.还有一些则是,讲得很深奥,看着好像很有道理的样子,但是其实还是没怎么懂. 今天再次碰到这个问题时,自己再反思了一下,个人对于一个问题的解决思路,突然觉得大部分人都是碰到问题就去百度,没有去思考这些问题的根本,我们大部分人都缺少独立思考的能力.我一直觉得,所有一切的知识都是一种参考,最最重要的是你以什么方式去保存到大脑里面,是临时的内存保存,还是稍微深刻的硬盘保存,…
写了一个C++的LogLog Logit 四参数等算法的接口dll,给C#调用,但是发现传参有问题 如 extern "C" _declspec(dllexport)  bool TestFunc(EnumMethod eMethod, unsigned int uiPoints, const double *parA, const double *parB, STRUCTTEST &sTest) 前面的传参非常好解决 枚举本地自定义一个,两个double指针直接ref传参 ]…
枚举部分 enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型. 通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它. 但是,还可以将枚举嵌套在类或结构中.默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1. 例1: //此枚举的默认值是从0开始 enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 例2: //此枚举的默认值是从1开始,下标为3的tue值为7,从下标3开始…
Error as follow: 具体问题及解决办法描述如下: (引自http://www.fx114.net/qa-278-97757.aspx) /*****************************************************************************************************************/ 一:英文提示:error C2719: 'p': formal parameter with __declspec(a…
把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变.一开始会觉得--“好神奇呀”.当我们了解java内存分析的知识后,一切都是那么简单明了了--“哦,这么回事呀”.但是今天的上机课,对于引用变量,我犯了一个错误,下面是代码的简化-- void method(int a[]) { int temp[]={1,2,3,4}; a[0]=5; a=temp; } 在这里,我试图把临时数组变量的值赋给a,从而改变实参的值. 方法传参,分传值和传址,基本数据类型变量的传参传的是值:引…
之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传参方式应该主要有两种:传值和传引用 一  传值 java中的传值即传递的是原变量的一个副本.基本的数据类型,如:char,int,double等类型的变量向函数传递的参数,都是变量的副本都属于传值.函数内部不论进行任何操作,都不影响变量本身,影响的只是变量的副本. 例如: public class…
Go 到底有没有引用传参(对比 C++ ) C++ 中三种参数传递方式 值传递: 最常见的一种传参方式,函数的形参是实参的拷贝,函数中改变形参不会影响到函数外部的形参.一般是函数内部修改参数而又不希望影响到调用者的时候会采用值传递. 指针传递 形参是指向实参地址的一个指针,顾名思义,在函数中对形参指向的内容操作,实参本身会被修改. 引用传递 在 C++ 中,引用是变量的别名,实际上是同一个东西,在内存中也存在同一个地址.换句话说,不管在哪里对引用操作,都相当直接操作被引用的变量. 下面看 dem…
概述      java中的参数传递问题可以根据参数的类型大致可以分为三类:传递基本类型,传递String类型,传递引用类型,至于最终是否可以归纳为值传递和引用传递,根据每个人的理解不同,答案不同,此处不做强调. 传递基本类型 public class Test1 { public static void main(String[] args) { int n = 3; System.out.println("Before change, n = " + n); changeData(…
来源:唐磊的个人博客<C++ 传参时传内置类型时用传值(pass by value)方式效率较高> 在<Effective C++>里提到对内置(C-like)类型在函数传参时pass by value比pass by reference更高效,当用OO的c++自定义类型(存在构造/析构等)pass by reference to const 更好,STL里的迭代器和函数对象是用C指针实现的,因此pass by value更好.至于为什么,下面的代码验证了下. #include &…
RedirectToAction方法提供了5个重载方法 1.单纯跳转,不带参数. string redirectUrl = "/List" ; return RedirectToAction(redirectUrl); 2.碰到需要传参的需求,想取原来参数传过去 1).刚开始简单的这样拼接: string redirectUrl = "/List?planid=" + Request.Params["hdplanid"]; return Redi…
2019年2月25日14:21:13 测试版本php 5.4 ,5.6,7.0,7.2 代码请看: https://www.cnblogs.com/zx-admin/p/10373866.html 1,对象赋值 final class Node { public $data; public $next = null; public function __construct($data) { $this->data = $data; } } $a = new Node(['a']); p($a->…
最近感觉老是碰到数组传参的问题,特别是二维的数组,每次报错都感觉头疼,烦躁:这里必须总结一下了,先把暂时能解决的问题写在这吧,以便以后碰到查看! 先看一个一维数组传参:这样用数组传参是很不安全的:会输出乱码.原因是函数返回的是一个数组,其保存的字符串" "存储在栈中,函数结束后存储该字符串的内存(也就是栈上的内存)被编译器自动释放了. 恩今天3-21:遇到了一个新的问题比较有意思:关于数组. void print_1 (int n, int *a ) { //for(int i=0;i…
在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.之前有搜过相关的知识点一直理解的是:Java的传参方式中主要有两种:传值和传引用.(基本数据类型相当于传值,对象相当于传参) 但是,在做需求的时候遇到了,将从上一个方法中获取到的对象,当做参数传进下一个方法中的时候,如果传进来的是空对象,那么在给这个“对象”直接赋值的时候,会报空指针异常! 探究与理解:Java中传值也就是传的是原变量的一个副本,函数内部无论怎么操作…
1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我们来一起看一段代码: // 作为对象方法调用 var test = { a : 5, b : 6, sum : function () { return this.a + this.b; // 此处this = test } } alert(test.sum()); 作为对象调用时this很容易理解…
一般来说c传值分为传值与传指针,Java里没有指针,因此只有传值,但是Java里传值分为简单变量传值和引用型变量传值,从本质上来说这两者没啥区别. 下面主要说的是传参时对原变量的影响: 最初练习创建单链表时可能会有这样一种写法: void Creat_link_list(int n,struct node *head){ } n是单链表节点的个数,head被初始化为null,调用该函数后可能会有人直接对head进行各种操作,比如遍历,排序.但此时head依然为null,函数内的一列操作只是hea…