精华内容
下载资源
问答
  • C语言 传参问题

    2019-10-13 15:53:35
    传参又分为传值传参和传址传参 传值传参:形参对实参值的临时拷贝,实质上只是发生交换的只是这个临时变量,实参值并没有变化 传址传参:形参指针指向实参的地址,传地址后,解引用后交换地址里的内容,实参完成了...

    **

    函数传参必定要形成临时变量*

    传参又分为传值传参传址传参
    传值传参:形参对实参值的临时拷贝,实质上只是发生交换的只是这个临时变量,实参值并没有变化
    传址传参:形参指针指向实参的地址,传地址后,解引用后交换地址里的内容,实参完成了交换

    //传值传参
    int swap(int x, int y)
    {
    	int tmp = 0;
    	tmp = x;
    	x = y;
    	y = tmp;
    }
    //传址传参
    int swap2(int *px, int *py)
    {
    	int tmp = 0;
    	tmp = *px;
    	*px = *py;
    	*py = tmp;
    }
    
    int main()
    {
    	int a = 100;
    	int b = 200;
    	swap(a, b);
    	printf("a=%d\n,b=%d\n", a, b);//100 200 只是临时变量(形参)交换了数值,实参并没有交换
    	swap2(&a, &b);
    	printf("a=%d\n,b=%d\n", a, b);//200 100 直接传地址,解引用后交换地址里的内容,实参完成了交换
    	
    	return 0;
    }
    

    数组传参问题

    数组作为参数传给函数时,数组会降维成指针(指向其内部元素类型的指针)
    例子:二维数组传参时,降维成指向一维数组的指针。

    //传参时要想知道数组的所有元素必须知道数组首元素的地址和数组的长度大小
    void display(int *p, int sz)
    {
    	int i = 0;
    	printf("数组为:\n");
    	for (i = 0; i < sz; i++)
    		printf("%d ", p[i]);
    	printf("\n");
    }
    int main()
    {
    	int arr[] = { 1, 3, 5, 7, 1, 8, 3, 5 };
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	display(arr, sz)	
    	return 0;
    }
    
    展开全文
  • C语言传参的类型匹配

    2018-11-19 09:38:03
    有一个这样的问题: 形参const char *p和实参char *c可以匹配 形参const char**p和实参char**c不可以匹配 注:argument和parameter:严格而言,parameter指形参,argument指...含义:传参相当于赋值,函数的形参将...

    有一个这样的问题:

    • 形参const char *p和实参char *c可以匹配
    • 形参const char**p和实参char**c不可以匹配

    注:argument和parameter:严格而言,parameter指形参,argument指实参

    ANSI C:

    "每个实参都应该有一个类型,以便将其值赋给一个对象,这个对象具有相对应形参的类型的非限定版本"

    含义:传参相当于赋值,函数的形参将具有实参的非限定版本的数据,具体形参是否有限定类型有怎样的限定类型由函数的形参列表指定,实参只负责传值

    "赋值操作应满足下列之一:

    ...

    两个操作数都是指针,分别指向两个相匹配的类型的限定或非限定版本,而且左操作数指向的类型必须有右操作数指向类型的所有限定符

    ..."

    含义:ANSI C定义了几种有效的赋值方式,上面描述了指针向赋值的情况。右操作数有的限定符左操作数也一定要有

    解释:

    "const float*"不是限定类型而是非限定类型,类型为指向限定类型的指针

    所以"const char**"是一个指向 指向限定类型的指针,是指向非限定类型的指针

    "const char**"和"char**"都是指向非限定类型的指针,但是是不同的非限定类型

    虽然他们两个指向的非限定类型本身可以作为类型进行匹配,但是这两个非限定类型的指针不能匹配,因为类型的解析不会递归的进行

    const:

    const的含义只是意味着这个标识符不能被用来执行赋值操作,但是如果是指针(const type * p)的话,就是不能对*p执行赋值操作

    所以const修饰的并不是常量,不能用在如结构体元素的大小相关声明,某些编译器的数组声明,case的表达式

    这只会使值通过这个标识符是只读的,但是可能会被其他的方式修改

    最常用的地方是函数的形参,因为函数只能通过参数名获取到这个值,所以至少在这个函数中是不会被修改的

    展开全文
  • C语言传参实现输出最大最小值

    千次阅读 2019-12-05 19:04:54
    虽然很多时候写C语言main函数的时候都选择把形参写为空,也就是void,但是这并不是唯一的写法。C语言实际上支持向主函数传递两个参数,此时的函数原型如下: int main(int argc, char **argv); 其中,第一个参数...

    虽然很多时候写C语言main函数的时候都选择把形参写为空,也就是void,但是这并不是唯一的写法。C语言实际上支持向主函数传递两个参数,此时的函数原型如下:

    int main(int  argc, char **argv);
    

    其中,第一个参数用于代表参数的个数;第二个参数则是用于向程序传递参数的列表,通常是一组值。求最大值最小值(输入的数的多少不确定)
    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    #define inf 999999999
    #define max(a,b) a>b?a:b
    #define min(a,b) a<b?a:b
    int main(int argc,char **argv) {
    	int minn=inf,maxx=-inf;
    	while(*++argv != NULL) {
    		//printf("%s\n",*argv);
    		minn=min(minn,atoi(*argv));
    		maxx=max(maxx,atoi(*argv));
    	}
    	printf("Largest: %d\nSmallest: %d",maxx,minn);
    	return 0;
    }
    

    另外atoiatoi字符串转为intint类型。

    展开全文
  • Linux-C语言传参方式

    2018-07-24 18:26:25
    传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销毁,并不会影响外部left和right的值 引用传递:如果形参为引用类型,则形参是实参的别名  void Swap (int& ...

    参数传递三种方式:
    值传递 :未操作实参的地址 操作的是形参的数值,不能改变实参的值
    地址传递 :操作实参的地址,实参值改变
    引用传递:引用操作形参相当于操作实参,实参值改变

    值传递:如果形参为非引用的传值方式,则生成局部临时变量接收实参的值   

    void Swap (int left, int right){  
             int temp = left;  
             left = right ;  
             right = temp ; }  
    传参时对于参数left和right拷贝一临时副本,交换的是副本值,因为其是临时变量函数退出,变量销毁,并不会影响外部left和right的值

    引用传递:如果形参为引用类型,则形参是实参的别名

        void Swap (int& left, int& right){
              int temp = left;  
             right = left ;  
             left = temp ; }  
        使用引用不做临时拷贝,&的使用说明此处只是原参数的另一个名字而已,所以修改是直接在原参数的基础上修改变量值

    指针传递: 操作实参的地址

        void Swap (int* pLeft, int* pRight){  
             int temp = *pLeft;  
             *pLeft = *pRight;  
             *pRight = temp; }  
    
    传入的是地址,因为地址是唯一的,所以指针通过地址的访问进而可修改其内容

    引用解释:c++而非c
    C++中的引用:
    引用引入了对象的一个同义词,定义引用的表示方法与定义指针相似,只是用&代替了*,引用(reference)是c++对c语言的重要扩充,引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。其格式为:类型 &引用变量名 = 已定义过的变量名。
    引用的特点:
    ①一个变量可取多个别名。
    ②引用必须初始化。
    ③引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量。
    eg:
    基础引用:
    void TestReference1 (){  
             int a = 1;  
             int& b = a;  
             a = 2;  
             b = 3;  
             int& c = b;// 引用一个引用变量,别名的别名  
             c = 4; }
    const引用:
            void TestReference2 (){  
             int d1 = 4;  
             const int & d2 = d1;  
             d1 = 5;//d1改变,d2的值也会改变。  
             //d2 = 6;//不能给常量(不能被修改的量)赋值。  
             const int d3 = 1;  
             const int & d4 = d3;  
             //int&d5 = d3;  
             const int & d6 = 5;//常量具有常性,只有常引用可以引用常量  
             double d7 = 1.1;  
             //int& d8 = d7;//d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量,也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。  
             const int& d9 = d7;}    

    &在c语言中的作用:&位于等号右侧为取址,位于左侧为引用
    1.取地址符:
    int a; int*p ; p =&a;  //p表示a的地址 这里&为取址符
    2.引用:对引用操作相当于对原变量进行操作
    int a; int &b=a ; //这里b指代a  &为引用符

    值传递:
    void Exchg1(int x, int y) 
    {
       int tmp;
       tmp = x;
       x = y;
       y = tmp;
       printf("x = %d, y = %d.\n", x, y);x=6,y=4
    }
    main()
    {
       int a = 4,b = 6;
       Exchg1(a, b);
       printf("a = %d, b = %d\n", a, b);a=4,y=6
       return 0;
    }
    解释:int x = a; int y = b;只是把变量a,b的值分别赋值给了x、y,
    之后在Exchg1函数体内再也没有对a、b进行任何的操作了,交换的只是x、y变量,并不是a、b
    引用传递:
    void Exchg3(int &x, int &y)
    {
       int tmp = x;
       x = y;
       y = tmp;
       printf("x = %d,y = %d\n", x, y);x=6,y=4
    }
    main()
    {
       int a = 4;
       int b = 6;
       Exchg3(a, b);
       printf("a = %d, b = %d\n", a, b);a=6,b=4
       return(0);
    }
    x、y前都有一个取地址符号“&”。有了这个,调用Exchg3时函数会将a、b 分别代替了x、y了,
    x、y分别引用了a、b变量。这样函数里头操作的其实就是实参a、b本身了
    地址传递:
    void Exchg2(int *px, int *py)
    {
       int tmp = *px;
       *px = *py;
       *py = tmp;
       printf("*px = %d, *py = %d.\n", *px, *py);//x = 6, y = 4
    }
    main()
    {
       int a = 4;
       int b = 6;
       Exchg2(&a, &b);
       printf("a = %d, b = %d.\n", a, b);//a = 6, b = 4
       return 0;
    }
    在Exchg2(&a, &b)中的隐含操作  px = &a, py = &b。指针px、py的值已经分别是a、b变量的地址值了。
    对*px、*py的操作当然也就是对a、b变量本身的操作了。所以对函数里头的交换就是对a、b值的交换了,原理就是
    传递a、b的地址给了px、py,(c语言变量在内存中都是地址存在的,操作地址可改变变量的值)

     

     

     

    展开全文
  • C语言传参不支持引用

    千次阅读 2015-10-24 23:48:36
    今天定义函数时,传参想像C++一样搞个 char*& 或 int&, 编译时报错. 实验了一会,才知道, C语言入参只能传值, 传指针,传指针的指针. /// @file exam_1_8.c /** @brief 8. 参考例L2_8.C编写一个程序,输入2个学生...
  • 参考代码如下: /*纯c语言*/ #include int hello(int *a) { *a = 1; return 0; } int main() { int i = 10; printf("i = %d\n",i); hello(&i); printf("i = %d\n",i); return 0; } 学编程的新手可以参考一下学习...
  • awk调用外部命令,同时也传参呢?awk 中使用的 shell 命令,有 2 种方法:一。使用所以 system()awk 程序中我们可以使用 system() 函数去调用 shell 命令如:awk 'BEGIN{system("echo abc")}' fileecho abc 就会做为...
  • C语言函数传参

    2017-08-07 15:19:53
    最近在做一些笔试面试之类的题目,今天遇到一个关于C语言函数传参的问题,感觉自己的概念还是有点模糊,本篇文章再学一下关于函数传参。这是遇到的一个题目:(高质量C++编程指南) #include #include #include ...
  • C语言函数传参汇总

    千次阅读 多人点赞 2016-06-19 19:11:04
    关于C语言函数传参现在汇总于下: 数据原型 应用 调用格式 声明格式 int arr[3] 等价传递 foo(arr,3) foo(int *p,int n) int arr[3][4] 等价传递 foo(arr,3) foo(int(*p)[4],int n) int *p 等价传递 ...
  • c语言数组传参

    2016-11-13 16:35:13
    当数组传参问题中: ①数组名作为实参,那么形参该如何定义,是定义int*p 还是int a[] ? ②数组名作实参, a[10]指的是a偏移10的指针,还是变量a[10] ? 如果可以的话,请多讲一些数组跟形参实参的知识,我想多学...
  • c语言函数传参

    千次阅读 2018-05-24 13:53:14
    引入: 自定义函数的使用,使整个程序模块化。 每个函数都解决一个小问题,当我们编写好函数后,就把精力转移到,函数之间的逻辑关系上。不必再纠结每一条语句,这样大大提高了编程的效率。 当需要实现相同功能时...
  • 今天看到一段代码,就是函数头的传参如下,我想问一下就是这种指针引用传参是什么玩意,c语言中传指针会改变变量值,c++传引用会改变参数值,我想问下图里面那个传参是什么玩意,会改变外部变量的值? ![图片说明...
  • C语言指针传参问题

    千次阅读 2016-09-13 17:15:40
    原文链接:http://www.cnblogs.com/lipeil/archive/2012/10/26/2740729.html void pointer(int *p) { int a = 11; printf("\nthe p is %p , addr is %d, *p is %d",p , &p, *p);... printf("\nthe p is

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,533
精华内容 6,613
关键字:

c语言传参

c语言 订阅