函数概念
文章平均质量分 53
luckyone906
这个作者很懒,什么都没留下…
展开
-
函数形参和实参的传递机制及内存分配的理解
形参变量是函数进入时在栈上分配的(参数被拷贝到形参变量所在的栈内存上,所以形参改变值只是改变了实际参数的备份并不影响函数外的实际参数;只有传送指针等引用传递的参数才能影响实参变量的值),函数结束后被释放。原创 2024-09-15 09:35:48 · 110 阅读 · 0 评论 -
c语言中函数调用的原理及形参传递实质原理分析
一、 函数参数传递机制的基本理论 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实.转载 2021-11-30 21:54:04 · 2221 阅读 · 0 评论 -
函数形参传递概念及问题分析
普通函数参数下面程序试图改变main函数中a和b的值#include<stdio.h>void fun(int x,int y){ int c; c=a; a=b; b=c;}int main(){ int a=1,b=2; fun(a,b); printf("a=%d b=%d\n",a,b); return 0;}函数参数传递分析:实参: &a 28ff18 ...原创 2021-11-30 21:52:01 · 314 阅读 · 0 评论 -
使用函数指针实现父类函数调用子类函数的两种方式
父子类关系对于继承关系中的父类和子类,我们可以说子类是父类的一种,子类继承了父类的属性和行为。因此,子类可以访问父类的所有非私有成员。相反,父类一般情况下是不能访问子类成员的。然而,我们可以通过一些方法间接的实现父类访问子类,即父类函数访问子类函数。方法一利用多态机制,一个指向子类的父类指针或引用,当调用被子类重写的虚函数时,实际上调用的是子类函数,这是通过多态的方式来实现父类调用子类,该方法需要一个引用或者指针调用虚函数来实现。如下面所示:Class Base{public:原创 2021-02-15 18:59:42 · 6412 阅读 · 5 评论 -
函数中的指针分配的内存怎么释放
被调用函数里动态分配的内存要不要手动释放 20我想手动释放来着,但是指针是在被调用函数里声明的,在调用函数里释放不了。我的被调用函数返回的就是这个指针,我也不能在被调用函数里释放。 你指的“动态分配”是系统自动分配内存,如 char c[100];还是手动分配的,如 char *p = (char *)malloc(100);如果是第一种方式转载 2017-05-11 10:26:24 · 9558 阅读 · 1 评论 -
获取成员函数地址及获取函数地址
首先我们定义一个类Ctest,类里面包含三个不同形式的成员函数,静态成员函数statFunc()、动态成员函数dynFunc()和虚拟函数virtFunc()。在main函数中我们利用cout标准输出流分别输出这三个函数的地址,程序如下所示:#includeiostream>#includeusing namespace std;class Ctest{p转载 2017-08-03 15:07:51 · 2002 阅读 · 0 评论 -
指令和数据都用二进制代码存放在内存中,从时空观角度回答CPU如何区分读出的代码是指令还是数据
指令用来确定“做什么”和“怎样做”,数据是“做”的时候需要原始数。计算机可以从时间和空间两方面来区分指令和数据,在时间上,取指周期从内存中取出的是指令,而执行周期从内存取出或往内存中写入的是数据,在空间上,从内存中取出指令送控制器,而执行周期从内存从取的数据送运算器、往内存写入的数据也是来自于运算器。比如:要计算机做1+2=?中,“+”表示要做什么和转载 2017-08-03 15:08:51 · 4626 阅读 · 0 评论 -
获取成员函数地址及获取函数地址
首先我们定义一个类Ctest,类里面包含三个不同形式的成员函数,静态成员函数statFunc()、动态成员函数dynFunc()和虚拟函数virtFunc()。在main函数中我们利用cout标准输出流分别输出这三个函数的地址,程序如下所示:#includeiostream>#includeusing namespace std;class Ctest{p转载 2017-08-03 15:12:19 · 1213 阅读 · 0 评论 -
介绍了如何取成员函数的地址以及调用该地址
摘要:介绍了如何取成员函数的地址以及调用该地址.关键字:C++成员函数 this指针 调用约定一、成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*转载 2017-08-04 13:56:46 · 1277 阅读 · 2 评论 -
汇编语言中可以定义变量吗?怎么定义?有局部变量和全局变量之分吗?作用域是什么?
汇编语言定义变量的格式为 【变量名】【变量类型】【数值列表】其中 变量类型有 DB DW DD等,分别表示变量占有的内存空间(依次为1,2,4个字节)如:A DB 1,2,3,4 就定义了名称为A的4个占1个字节的变量,分别是1,2,3,4(严格来说是0001,0010,0011,0100) 保存在系统分配的内存空间中如果是A DW 1,2,3,4则保存的值为(00000001,000转载 2017-09-07 09:03:56 · 12529 阅读 · 0 评论 -
C#中Invoke 和 BeginInvoke的涵义和区别
BeginInvoke 方法真的是新开一个线程进行异步调用吗?参考以下代码:public delegate void treeinvoke();private void UpdateTreeView(){ MessageBox.Show(System.Threading.Thread.CurrentThread.Name);}priv转载 2017-10-29 19:53:34 · 620 阅读 · 0 评论 -
用汇编的眼光看C++(之拷贝、赋值函数)
拷贝构造函数和复制函数是类里面比较重要的两个函数。两者有什么区别呢?其实也很简单,我们可以举个例子,加入有这样一个类的定义:[cpp] view plain copyclass apple { public: apple() { printf("apple()!\n");} apple(app转载 2017-10-26 21:28:28 · 339 阅读 · 0 评论 -
Marshal在C#中的应用(void *指针到IntPtr的转化)
C#调用C语言的API时一般把void *指针转换成IntPtr,但这经常远远不够的。在C语言中void *是个万金油,尤其是一些老的c语言程序,所有的参数就一个void*指针,里面包罗万象,然后在程序中来一个switch,甚至多个switch来处理不同的参数。最近笔者就碰到了这个问题,不得不来研究一下怎么把void *指针转换成IntPtr。1.void *指针到IntPtr的简单转化。...转载 2019-03-06 10:11:21 · 5397 阅读 · 0 评论 -
c语言中函数调用的原理
一、 函数参数传递机制的基本理论 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空转载 2017-04-17 15:19:31 · 1929 阅读 · 0 评论 -
栈中函数调用原理_详解
函数调用是程序设计中的重要环节,本文就函数调用的过程进行分析。一、eip、ebp、esp介绍 EIP,EBP,ESP都是系统的寄存器,里面存储的是些地址,我们系统中栈的实现上离不开他们三个。 我知道栈的数据结构主要特点是 后进先处。它还有两个作用: 1.栈是用来存储临时变量,函数传递的中间结果。 2.操作系统维护的,对于程序员是透转载 2017-04-17 15:34:42 · 880 阅读 · 0 评论 -
计算机程序的思维逻辑 (12) - 函数调用的基本原理
栈上节我们介绍了函数的基本概念,在最后我们提到了一个系统异常java.lang.StackOverflowError,栈溢出错误,要理解这个错误,我们需要理解函数调用的实现机制。本节就从概念模型的角度谈谈它的基本原理。我们之前谈过程序执行的基本原理:CPU有一个指令指示器,指向下一条要执行的指令,要么顺序执行,要么进行跳转(条件跳转或无条件跳转)。基本上,转载 2017-04-17 15:15:57 · 588 阅读 · 0 评论 -
C#函数的重载
◆函数名必须相同方能构成函数重载;◆函数返回值类型:可以相同,也可以不同(注意:函数的返回类型不足以区分两个重载函数);◆函数参数类型:必须不同;◆函数参数个数:可以相同,可以不同◆函数参数顺序:可以相同,可以不同;[csharp] view plain copyprint?using System;原创 2016-11-14 14:33:10 · 5408 阅读 · 2 评论 -
C# 中的委托和事件(详解) ....
C# 中的委托和事件 委托和事件在 .NET Framework 中的应用非常广泛,然而,较好地理解委托和事件对很多接触 C# 时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里堵得慌,浑身不自在。本章中,我将由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.NET Framework 中的委托和事件、转载 2016-11-12 17:00:26 · 4081 阅读 · 0 评论 -
c#中out、ref和params的用法与区别
ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为ref/out形式。两者都可以使函数传回多个结果。两者区别:两种参数类型的设计思想不同,ref的目的在于将值类型参数当作引用型参数传递到函数,是函数的输入参数,并且在函数内部的任何改变也都将影响函数外部该参数的值;而out的目的在于获取函数的返回值,是输出参转载 2016-10-20 13:52:15 · 2070 阅读 · 0 评论 -
[C#]委托和事件(详细讲解)
引言委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事原创 2016-09-23 18:21:21 · 340 阅读 · 0 评论 -
C++(1) 指针 new 和delete
1.概念new //typeName * pointer_name = new typeName;delete //delete pointer_name; 注意: (1)new之后要判断,指针是否为NULL,内存被耗尽时,防止程序超界、 (2)如果用变量分配的内存,则不能使用delete int a = 5;转载 2016-09-23 18:06:52 · 468 阅读 · 1 评论 -
C++中重写与覆写(虚函数virtual)的区别
本文章已收录于: 虚函数的情况下调用成员函数时调用的是指向对象的所属类的成员函数例子中为appleclass fruit{public:void func(){printf("fruit\n");}virtual v原创 2016-09-23 14:34:30 · 2311 阅读 · 0 评论 -
c#中的静态构造函数
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。复制代码 代码如下:class SimpleClass{// Static constructorstatic Simple原创 2016-09-23 14:28:30 · 1601 阅读 · 0 评论 -
C++中重载与重写函数区别及虚函数(转载)
C++中重载与重写函数区别及虚函数 C++中的虚函数(virtual function)1.简介虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:class A{public:virtual void foo() { cout };class B: public A{原创 2016-09-12 18:25:25 · 1007 阅读 · 0 评论 -
C++中的endl搭配cout和cin用法
endl英语意思是end of line,即一行输出结束,然后输出下一行。endl与cout搭配使用,意思是输出结束。按C++标准程序库中的描述其实现如下:template std::basic_ostream&std::endl (std::basic_ostream& strm){strm.put(strm.widen(\n'));原创 2016-04-16 16:21:46 · 11413 阅读 · 0 评论 -
C++函数声明和定义
在上一节,我们已经学会了如何阅读函数原型和如何调用一个函数。然而,仅靠系统给出的标准库函数是不够用的。我们有时候要根据我们的实际要求,写出一个合适自己使用的函数。那么,我们如何来自己动手编写一个函数呢?首先,我们要告诉电脑,我们自己编写了一个函数,即这个函数是存在的,这叫作函数的声明(Declaration)。其次,我们要告诉电脑这个函数是怎么运作的,这叫作函数的定义(Definiti转载 2016-04-12 11:06:44 · 5832 阅读 · 0 评论 -
事件委托 EventHandler 。
事件就是当对象或类状态发生改变时,对象或类发出的信息或通知。发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时,它并不知道由哪个事件接收者来处理.这就需要一种管理机制来协调事件源和接收者,C++中通过函数指针来完成的.在C#中事件使用委托来为触发时将调用的方法提供类型安全的封装事件的声明1.声明一个委托public delegate转载 2016-11-23 09:43:28 · 678 阅读 · 0 评论 -
for循环本质
菜鸟:为什么在for循环里重复定义变量不会报错? 如下代码1,因为重复定义了两个变量 a ,编译器报错。 void main() { int a; int a; return; } 如下代码2,用for循环也是定义了两个变量a, 编译器却不报错 void main() { for(int i=0;i如下代码1,因为重复定义了两个变量 a ,编译器报错。void main(){原创 2016-11-16 20:07:42 · 1721 阅读 · 0 评论 -
静态方法和实例化方法的本质区别
本文章已收录于:这是一个经常被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一下,我们却发现并不懂。方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要new就可以使用 实例化方法需要new了以后才可以使用。。。。我们真的理解了吗?从实际项目开发说起,这里有开发项目的三种方式原创 2016-11-14 18:17:52 · 610 阅读 · 0 评论