精华内容
下载资源
问答
  • C语言指针作为参数的传递问题

    千次阅读 2021-06-30 14:28:36
    (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上很多blog都把引用传递归为C语言参数传递的一类, 当使用Microsoft Visual C++ 2010 ...

    参数传递

    C语言参数传递一般分为:值传递和地址传递(本质上只有值传递

    (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上很多blog都把引用传递归为C语言参数传递的一类,

    当使用Microsoft Visual C++ 2010 Express或VC6之类的编译器时使用引用传递就无法编译通过)

    单纯的理解值传递和地址传递还是很简单的,但是只要一带上指针,就有点绕晕了

    博主现在也是备战考研期间,复习C语言,所以深入思考一下指针作为参数的问题

    值传递:

    形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参)

    #include <stdio.h>
    
    void swap(int x, int y);
    
    main()
    {
        int a = 10, b = 20;
    
        swap(a, b);
        printf("a=%d\nb=%d\n", a, b);
    
        return 0;
    }
    void swap(int x, int y)
    {
        int t;
    
        t = x;
        x = y;
        y = t;
    }

    上述代码运行后a、b的值并未改变

    地址传递:

    形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

    #include <stdio.h>
    
    void swap(int *x, int *y);
    
    main()
    {
        int a = 10, b = 20;
    
        swap(&a, &b);
        printf("a=%d\nb=%d\n", a, b);
    
        return 0;
    }
    void swap(int *x, int *y)
    {
        int t;
    
        t = *x;
        *x = *y;
        *y = t;
    }

     上述代码执行后a和b值交换,a=20、b=10

    易错点补充:

    #include <stdio.h>
    
    void swap(int *x, int *y);
    
    main()
    {
        int a = 10, b = 20;
        int *pp = &a;
        int *kk = &b;
        swap(pp, kk);
        printf("a=%d\nb=%d\n", *pp, *kk);
    
        return 0;
    }
    void swap(int *x, int *y)
    {
        int *t;
    
        t = x;
        x = y;
        y = t;
    }

    请读者想一下,上述代码执行后a和b的值是否交换,为什么?

    上述代码看起来像交换了指针pp和kk的指向,实际上并没有

    代码的运行结果a=10、b=20,运行结果是a和b的值并没有改变,因为这时使用的实参pp,kk是值传递,传递的是指针的值,以指针pp来说,指针的值是变量a的地址,

    指针的值传入后用形参int *x和int *y接收,这里x和pp虽然都指向变量a的地址,但指针x和pp自身的地址并不相同(意思是x拷贝了一份pp的值),意味着你能改变变量a的值,但是不能改变pp的值(这里与值传递相似)

    为了更加直观,清晰的看出值的交换,这里添加一些代码来显示内存和变量的值

    #include <stdio.h>
    
    void swap(int *x, int *y);
    
    main()
    {
        int a = 10, b = 20;
        int *pp = &a;
        int *kk = &b;
    
        printf("a的地址%p----b的地址%p\n\n", &a, &b);
        printf("pp的值%p----kk的值%p\n", pp, kk);
        printf("pp的地址%p----kk的地址%p\n\n", &pp, &kk);
        swap(pp, kk);
        printf("a = %d\nb = %d", *pp, *kk);
    
        return 0;
    }
    void swap(int *x, int *y)
    {
        int *t;
    
        printf("x的值%p----y的值%p\n", x, y);
        printf("x的地址%p----y的地址%p\n", &x, &y);
    
        t = x;
        x = y;
        y = t;
    }

    从pp和x的地址可以看出,x和pp是两块不同的内存区域,x在swap函数内执行完后并不会对pp值产生任何影响,相当于复制了一份pp的值,如下图

    (灵魂画手已上线)

    传入指针的值虽然不能对指针的值进行修改,但是可以通过地址直接对a的值进行修改也可以实现交换,代码如下

    #include <stdio.h>
    
    void swap(int *x, int *y);
    
    main()
    {
        int a = 10, b = 20;
        int *pp = &a;
        int *kk = &b;
    
        swap(pp, kk);
        printf("a = %d\nb = %d", *pp, *kk);
    
        return 0;
    }
    void swap(int *x, int *y)
    {
        int t;
    
        t = *x;
        *x = *y;
        *y = t;
    }

    传入指针的值和和传入变量的地址在数值上是一样的,但是一个是传值传递一个地址传递,如下图

    二级指针

    上面提到的参数传递方式有,传入变量的值,传入变量的地址,传入指针的值三种参数传递方式

    下面介绍第四种,传入指针的地址,上面第二种(传入变量的地址)和第三种(传入指针的值)传递方式使用的用来接收参数的形参都是int *类型的指针

    这里因为传入的是指针的地址,所以要使用二级指针int **x,因为传入的指针的地址,实现值的交换的方式就有两种一种是直接对变量的值进行修改,另一种就是对指针的值进行修改

    第一种:直接对变量值进行修改

    #include <stdio.h>
    
    void swap(int **x, int **y);
    
    main()
    {
        int a = 10, b = 20;
        int *pp = &a;
        int *kk = &b;
    
        swap(&pp, &kk);
        printf("a = %d\nb = %d", *pp, *kk);
    
        return 0;
    }
    void swap(int **x, int **y)
    {
        int t;
    
        t = **x;
        **x = **y;
        **y = t;
    }

    第二种:对指针的值进行修改

    #include <stdio.h>
    
    void swap(int **x, int **y);
    
    main()
    {
        int a = 10, b = 20;
        int *pp = &a;
        int *kk = &b;
    
        swap(&pp, &kk);
        printf("a = %d\nb = %d", *pp, *kk);
    
        return 0;
    }
    void swap(int **x, int **y)
    {
        int *t;
    
        t = *x;
        *x = *y;
        *y = t;
    }

    注意swap函数里用int *来交换指针的值,而不能用int **来进行交换,读者可自行修改代码验证想一下为什么?

    下面是二级指针示意图

    展开全文
  • 本文主要讲了c语言指针变量作为函数参数传递,下面一起来学习一下
  • C语言指针作为函数参数传递学习(一)

    万次阅读 多人点赞 2018-12-01 00:18:34
    1. 数组或者一维指针做函数形参 1.1传入的指针为NULL 比如下面的例子,很多人都会理解错: #include &amp;lt;stdio.h&amp;gt; void test(char *string) { string = &quot;hello world&quot;; } ...

    1. 一维指针做函数参数

    传入的指针为NULL

    比如下面的例子,很多人都会理解错:

    #include <stdio.h>
    
    void test(char *string)
    {
    	string = "hello world";
    }
    int main()
    {
    	char *str = NULL;
    	test(str);
    	printf("str=%s\n",str);
    	
    	return 0;
    	
    }
    

    是不是觉得输出应该是:str=hello world.事实上并不是
    输出结果是(操作系统:win10):
    在这里插入图片描述
    具体过程如下:
    在这里插入图片描述
    开始str指针指向NULL,并将该地址作为形参传入函数test(),最开始string指针也是指向NULL,接着讲“hello world”地址传给了string,此时string的指针不再指向NULL,而是指向“hello world”这个字符串的地址。为了验证这个,可以在代码里加一些打印信息验证:

    #include <stdio.h>
    
    void test(char *string)
    {
    	printf("string未操作之前的的指针:%p\n",string);
    	string = "hello world";
    	printf("string未操作之后的的指针:%p\n",string);
    }
    int main()
    {
    	char *str = NULL;
    	printf("传入test函数之前str的指针:%p\n",str);
    	test(str);
    	printf("str=%s\n",str);
    
    	getchar();
    	return 0;
    	
    }
    
    

    结果:
    在这里插入图片描述

    2.那要实现在test函数中改变str的指针指向地址怎么办?

    2.1 返回string指针,这个很好理解

    #include <stdio.h>
    
    char *test(char *string)
    {
    	string = "hello world";
    	return string;
    }
    int main()
    {
    	char *str = NULL;
    	str = test(str);
    	printf("str=%s\n",str);
    
    	getchar();
    	return 0;
    }
    
    

    结果:
    在这里插入图片描述
    2.2 用二维指针

    #include <stdio.h>
    
    void test(char **string)
    {
    	*string = "hello world";
    }
    int main()
    {
    	char *str = NULL;
    	test(&str);
    	printf("str=%s\n",str);
    
    	getchar();
    	return 0;
    }
    
    

    结果:
    在这里插入图片描述
    具体分析如下图:
    在这里插入图片描述
    过程:
    1.定义一个字符串指针str,str本身的地址是100,值为0(即NULL,一般的编译器NULL的地址是0)。
    2.取str的地址100传给string,此时string的值是100,地址为200
    3.这里假设“hello world”字符串的地址是300,接下来就是改变一级指针指向的内容的地址,由0变成300。

    针对评论区的留言,再一起讨论学习下:
    问题:为什么传入形参的是指针,在test函数调用后,main函数中str的内容没有改变?
    先看几个例子:

    #include <stdio.h>
    #include <string.h>
    
    void test(char *string)
    {
    	char *testString = "world";
    	
    	printf("111 string addr:%p,   testString addr:%p\n",string,testString);
    	string = testString;
    	printf("222 string addr:%p,   testString addr:%p\n",string,testString);
    	
    }
    int main(void)
    {
    	char *str ="china";
    
    	test(str);
    	printf("333 str addr:%p,      str is:%s\n",str,str);
    	
    	return 0;
    }
    

    结果(因为用的是64位系统,所以地址是8位,这里地址显示的6位,因为前面两位是0,所以默认省略了):
    在这里插入图片描述
    形参都是值传递。但是这个值如果是指针的话,是可以改变指针指向内容的值,即实参的值。这个要弄清两个概念:指针和指针指向的数据。
    这个例子中形参的值是实参的地址,并不是实参的值,所以形参的值的改变只是指针的改变,即指向数据的
    地址
    改变,并不是指针指向数据的改变。所以我们发现在main函数中,str的值没有改变。
    我们先再看一个例子:

    #include <stdio.h>
    #include <string.h>
    
    void test(char *string)
    {
    	printf("111 addr:%p, content:%s\n",string,string);
    	strncpy(string,"world",6);//连带把字符串结尾复制过去
    	printf("222 addr:%p, content:%s\n",string,string);
    	
    }
    int main(void)
    {
    	char *str ="china";
    
    	test(str);
    	printf("333 addr:%p, content:%s\n",str,str);
    	
    	return 0;
    }
    
    

    结果:
    在这里插入图片描述
    编译没有任何问题。但是运行却崩溃了,为什么呢?
    这个又是一个需要注意的点:指针指向的常量存储区是不允许修改的,这个实参和形参的地址都是指向字符串的地址,是const类型的,所以不能修改。
    原来的程序稍作修改:

    #include <stdio.h>
    #include <string.h>
    
    void test(char *string)
    {
    	printf("111 addr:%p, content:%s\n",string,string);
    	strncpy(string,"world",6);//连带把字符串结尾复制过去
    	printf("222 addr:%p, content:%s\n",string,string);
    	
    }
    int main(void)
    {
    	char str[] ="china";//修改这里,用字符数组存储,这样指针就指向栈区的内容了
    
    	test(str);
    	printf("333 addr:%p, content:%s\n",str,str);
    	
    	return 0;
    }
    
    

    结果:
    在这里插入图片描述
    我们可以看到,地址没有改变,但是内容已经被修改了。

    总结:
    形参都是值传递
    1.这个值是指针的话,在被调用的函数(test)中,如果指针的值,不会改变实参的值。
    2.如果改变指针指向的内容时,会改变实参的值。
    注意:在传递的过程中如果是const类型的指针是不允许修改的。

    展开全文
  • c语言指针作为函数的参数

    万次阅读 多人点赞 2018-07-09 22:00:43
    指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。 #include &lt;stdio.h&gt; void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py); int main(vo...
     

    在c语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。

    #include <stdio.h>
    void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);
    int main(void)
    {
    	int a=1,b=2;
    	int *pa=&a,*pb=&b;
    	swap1(a,b);
    	printf("s1:a=%d,b=%d\n",a,b);
    
    	a=1,b=2;
    	swap2(pa,pb);
    	printf("s2:a=%d,b=%d\n",a,b);
    
    	a=1,b=2;
    	swap3(pa,pb);
    	printf("s3:a=%d,b=%d\n",a,b);
    	
    	return 0;
    }
    void swap1(int x,int y){
    	int t;
    	t=x;
    	x=y;
    	y=t;
    }
    
    void swap2(int *px,int *py){
    	int t;
    	t=*px;
    	*px=*py;
    	*py=t;
    }
    
    void swap3(int *px,int *py){
    	int *pt;
    	pt=px;
    	px=py;
    	py=pt;
    }

    结果:

    第一个swap1函数运行结果是:x=2   y=1.但是第一个函数的形参是(int x,int y),实参是(int a,int b)。因为实参可以影响形参,而形参不可以影响实参。所以a,b的值是不变的。如图:

                 

    第二个swap2函数由图可知,pa和px都是a的地址,pb和py都是b的地址。此函数改变*px,*py的值。因为*px和a在同一储存单元,*py和b在同一储存单元。以改变实参指针变量所指向的变量的值。所以如图*pa和*pb的值也改变了,最后输出结果也就改变了。

    第三个swap3同样的道理,如上图直接改变了形参指针px和py的值,改变的只是地址,地址所对应的值没有改变,又因为形参是不会影响实参,所以pa和pb没有改变。所以a,b值没有改变。

    展开全文
  • 指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据,C语言没有任何机制来保证这些数据会一直...

    用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据,C语言没有任何机制来保证这些数据会一直有效,它们在后续使用过程中可能会引发运行时错误。

    错误代码:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    
    #define QW "quit"
    
    
    
    char *ar(char *p){
        char q[100];
        char *qq;
        qq=q;
        int i=1;
        int len_str=strlen(p);
        do{
            *qq=*(p+strlen(p)-i);
            i++;
            qq++;
        }while(i<=strlen(p));
        *qq='\0';
        return q;//返回函数内部定义数组的指针 
    }
    int main(void){
        char t[100];
        char *w;
        printf("输入字符串:");
        while(strcmp(gets(t),QW)){
            w=ar(t);
            printf("%s\n",w);
            printf("输入字符串:");
        }
        return 0;
    }
    

    函数运行完后q[100]空间释放(不可控) 运行结果错误!!!!!


    作为对比,将q[100]定义为全局变量

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    
    #define QW "quit"
    
    
    char q[100];//全局的变量
    char *ar(char *p){
        //char q[100];
        char *qq;
        qq=q;
        int i=1;
        int len_str=strlen(p);
        do{
            *qq=*(p+strlen(p)-i);
            i++;
            qq++;
        }while(i<=strlen(p));
        *qq='\0';
        return q;
    }
    int main(void){
        char t[100];
        char *w;
        printf("输入字符串:");
        while(strcmp(gets(t),QW)){
            w=ar(t);
            printf("%s\n",w);
            printf("输入字符串:");
        }
        return 0;
    }
    

    结果是正确的。

              指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,使用时要注意这一点。

    展开全文
  • c语言中将函数指针作为形参 在C中将指针作为函数参数 (Pointers as Function Argument in C) Pointer as a function parameter is used to hold addresses of arguments passed during function call. This is also...
  • 本文主要介绍C语言 指针变量作为函数参数,这里整理了相关资料和示例代码,以便大家学习参考理解知识点,有需要的小伙伴可以参考下
  • C语言指针之数组指针作为参数

    千次阅读 2019-07-06 16:52:35
    //数组名作为函数参数 //如果一个实参的数组 想在函数中改变数组的值 //实参和形参对应的是可以有四种 //1)实参和形参都是数组名 // int a[5]; //能引用的下标a[0] - a[4] // a[0] = 85; // a[1] = 70; // ...
  • c语言指针参数的优点

    千次阅读 2016-07-25 13:29:19
    首先要认识函数传参是怎么进行的...你在子函数中要对你的主调用函数中变量进行操作时也可以用指针参数,这样子函数就可以不用return 如果不是用指针的话,就要再子函数的未尾加上一条return x;把这个数返回当返回值。
  • 函数三要素: 名称、参数、返回值。C语言中的函数有自己特定的类型。 c语言中通过typedef为函数类型重命名: typedef int f(int, int); // f 为函数类型 typedef void p(int); // p 为函数类型 这一点和数组一样,...
  • C语言指针传递参数

    万次阅读 2017-11-29 23:47:48
    这里我们应该明白 1....也就是说,其实这里作为参数传递的指针也是形参,他也是原指针变量的拷贝,在上面那段代码中的函数里的内容并没有修改主函数中的指针变量,而是修改的形参指针,并没什么意义。
  • 一种C语言指针作为函数参数的图形化分析方法.pdf
  • 但是在函数内部,t是一个指向整数的指针,交换时实际上是交换的形参py,px的地址,但并没有改变地址对应的数值,也就是说主函数里 a=1; &a=000000000061FE0C; b=2; &b=000000000061FE08 方框里的值一直没有改变,...
  • C语言指针变量作为函数参数

    千次阅读 2018-03-01 10:46:28
    函数调用只可以返回一个值,而使用指针变量作为参数,可以得到多个变化了的值。 #include<stdio.h> #include<string.h> void Statistics(char *str,int *p1,int *p2,int *p3,int *p4){ for...
  • C语言指针作为函数返回值

    千次阅读 2020-02-26 14:43:57
    C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数。 我们定义一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> #include <string.h> char *strlong...
  • 有时候我们想写一个函数为特定的指针分配内存空间,这主要是为了生成指定长度的动态数组。当然,如果你不打算用函数实现,而是直接用代码敲,这没什么问题。但有时候我们为了程序的简洁性可能会有这样的需求,下面来...
  • C语言 | 函数指针作为函数的参数

    万次阅读 多人点赞 2019-08-05 08:22:38
    函数指针有两种常用的用法,一种是作为结构体成员,关于函数指针作为结构体成员的用法可移步至上一篇【C语言笔记】函数指针作为...当函数指针作为参数传递的时候,这时接收参数传递的函数通常需要根据这个指针调...
  • 结构体指针作为函数参数:结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间...
  • 深入理解C语言指针

    万次阅读 多人点赞 2019-09-28 08:36:51
    一、指针的概念 要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为指针,就像酒店的门牌号一样。 1.1、变量和地址 先写一段...
  • 只是为了说明用指向数组的指针作函数参数而举的例子。用函数average求总平均成绩,用函数search找出并输出第i个学生的成绩。有些网上给出的方法有bug,这个是我自己修改过的程序。
  • 写自己的shell,需要用一个函数提取命令中的参数并返回,就用到了这个知识点。 大三了还在网上搜这种问题,还没搜到,还是看大神的代码弄好的。 丢人啊,一定要打好基础,修炼好基本功...
  • 文章转自:无际单片机大家好,我是无际。今天给大家来讲解一下指针。我会由浅到深,最后结合实际应用讲解,让大家学会指针的同时,知道大佬们都用指针来干嘛!长文预警!全文大约5200多字,学指针看...
  • C语言:通过指针传递参数

    千次阅读 2019-04-30 17:20:54
    } 在参数列表的每个形参前面添加了一个星号(*),表示是一个指针,即对应该参数的实参应该是一个保存相同类型数据的地址。 第16~23行定义函数swap0,在该函数的代码中,也使用了指针运算符。使用指针运算符取得传入...
  • 1. 指针作为函数参数 2. 指向一维数组的指针以及指针数组 3. 指向函数的指针 —— 1. 指向变量的指针/指针变量 2. 指向数组的指针/数组指针 3. 指向字符串的指针/字符指针 4. 指向函数的指针/函数指针 5. 指向结构体...
  • C语言指针基础知识点(三)--指针变量作为函数参数

    千次阅读 多人点赞 2019-12-01 23:01:20
    C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 指针变量作为函数参数    函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址...
  • 就是一个函数的输入参数是一个指针,该函数需要改变该指针指向的地址,如: 现在有一个全局数组b,现在需要编写一个函数 输入参数是一个指针a,需要通过该函数将该指针a指向数组b,即: int b[3] = {1,2,3}; void ...
  • 指针作为函数参数主讲人张静 函数的参数不仅可以是整型实型字符型等数据还可以是指针类型它的作用是将一个地址值传递给被调函数中的形参指针变量即在函数调用时确定形参指针的指向指针作为函数参数pointer_1ap2p1&b&...
  • 为了区别问题,特写了一个用指针作为参数的函数做了对比,如下: ``` int main() { void print(char *p); int name = 5; int *n; n = &name; printf("n的地址为:%d\n", &n); printf("n指向的...
  • 学习笔记中的内容多少会有一点文不对题,因为C语言中数组无法作为函数的一个传递参数。而数组名在作为函数传递参数使用的时候实际上也被转换成了一个指针。 编写如下代码; #include"stdio.h"   char hello[] =...
  • 指针作为函数参数 交换两个数的位置 */ /* 指针作为函数参数 交换两个数的位置 */ #include <stdio.h> changeData(int a,int b){ int c; c=a; a=b; b=c; printf("a=%d",a); printf("b=%d...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,621
精华内容 44,248
关键字:

c语言指针作为参数

c语言 订阅