C语言函数參数传递原理

C语言中參数的传递方式一般存在两种方式:一种是通过栈的形式传递。还有一种是通过寄存器的方式传递的。

这次。我们仅仅是具体描写叙述一下第一种參数传递方式,第二种方式在这里不做具体介绍。

首先,我们看一下,以下一个简单的调用例程:

int Add (int a, int b, int c)

{

return a+b+c;

}

void main()

{

int x =0 , y = 1, z = 2;

int result = 0;

result = Add(x, y, z);

printf("Result for x+y+z %d", result);

}

借助以上例程,我们详细看一下,參数是怎样传递的。

首先。我们了解一个知识点,就是“()”操作符在C语言中有非常多含义,比方说,结合符、函数调用符等。

那么在result = Add(x,y,z)语句中当然为函数调用符,因此在编译阶段,遇到函数调用符后的运行序为,从最后一个參数開始压栈。压栈顺序为z->y->x, 直到将所有的參数压到调用栈中,然后call到Add相应的函数地址開始运行。那么压栈运行完毕后。栈空间,从上到下依次的顺序为x->y->z(由于栈的生长方向为向上,即地址低的地方,因此,x在地址最低的地方,即栈顶)。因此。在被调用函数中參数的读取和操作也都是发生在栈中的。

时间: 2024-11-04 13:34:17

C语言函数參数传递原理的相关文章

体验函数參数传递

#include <iostream> using namespace std; void fun1(int &x,int &y); void fun2(int *x,int *y); int main() { int a,b; a=11; b=22; fun2(&a,&b); cout<<"a="<<a<<" b="<<b<<endl; fun1(a,b); c

C语言中的system函数參数具体解释

http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功   能: 发出一个DOS命令 用   法: int system(char *command); system函数已经被收录在标准c库中,能够直接调用 system()函数用于向操作系统传递控制台命令行,以WINDOWS系统为例,通过system()函数运行命令和在DOS窗体中运行命令的效果是一样的,所以仅仅要在运行窗体中能够使用的命令都能够用SYSTEM(

cmake函数參数解析

近期在迁移公司的make系统到cmake上.发现cmake的function參数非常奇怪.比如,假设我们向一个function传递list作为參数,在function中,形參会变成例如以下状况: set(SRC) list(APPEND SRC a.cpp b.cpp) list(APPEND SRC c.cpp d.cpp) function(tst_arguments src_list) message("src_list = "${src_list}) endfunction()

函数指针作为函数參数,实现冒泡排序的升序排序和降序排序

#include<stdio.h> #define N 10//定义数组元素个数 int Ascending(int a,int b);//升序排列的函数声明 int Descending(int a,int b);//降序排列的函数声明 void swap(int*,int*);//交换数据的函数声明 void BubbleSort(int a[],int n,int (*compare)(int,int));//声明排序函数,通过函数指针作为函数调用 void Display(int a[

线程间的參数传递

在多线程编程中.经常须要从主线程传递參数给子线程或在主线程中获得子线程的计算结果, 若使用全局变量实现.必定须要对临界区保护,因此导致大量的切换工作造成效率的低下. 而利用进程间的參数传递能够解决这一问题. 两个方向的參数传递: 1.主线程向子线程传递參数: 通过函数 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 在创建线程

參数传递(引用,指针,值传递)C++11

C++中,函数的參数传递方式有值传递.地址传递.传地址有指针和引用方式. 在函数參数中,传地址的理由有: 1.使被调函数能够改动主调函数中的数据对象: 2.传地址能够降低数据拷贝,提高程序运行速度. 那么,何时使用值传递,何时使用地址传递(指针和引用)? 以下是一些写代码时会遇到的一些情况 被调函数使用參数对象时,不会改动数据对象 假设要传入函数的数据对象较小,比方是内建数据类型或小规模的结构体,那么使用值传递: 假设数据对象是数组,那么使用指针(这也是你唯一的选择).指针加入const修饰:

ionic新手教程第七课-简要说明几种界面之间的參数传递及优缺点

截至2016年4月13日19点32分,我公布的ionic新手教程,已经公布6课了, 总訪问量将近6000,平均每节课能有1000的訪问量.当中訪客最多的是第三课有2700的訪客. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > 事实上我開始的时候计划的挺好的,就依照我这阶段的安排,慢慢的带大家做一个

【通过操作指针,与指针做函数參数&amp;#39;实现字串在主串中出现的次数,然后将出现的部分依照要求进行替换 】

#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 由于p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据

JavaScript的最大函数參数长度和最大栈深度检測

一般代码也许不会涉及最大參数长度和最大栈深度,但某些特殊场合,检測这两个參数还是有必要的.比如:用递归计算斐波那契数列的第n个值,不了解最大栈深度,难免显得肤浅.又比如:将一串charCode转成String,不了解最大參数长度.採用字符串拼接的方式,效率提不上.特别是在串较长的情况下. 下面两个方法分别实现了JavaScript执行环境的 最大函数參数长度检測 和 最大栈深度检測. 不同浏览器的測试结果不同,同一款浏览器在不同机器測试结果不同.甚至某些浏览器连续測试时先后结果会有不同. fun