精华内容
下载资源
问答
  • 结构体指针作为函数参数时,调用时传递的是指向一个结构体变量的指针(即 结构体变量的地址);结构体变量作为函数参数时,调用时传递的结构体变量本身。 即一个结构体A,当它的指针作为参数传入函数func,那么在...

    0·说明

    文章里的观点来自网络的总结,程序经过自己的验证,在VC6.0中可正常执行。

    1.测试程序

    /*
    ##结构体指针与结构体变量用作函数参数区别:##
    	结构体指针作为函数参数时,调用时传递的是指向一个结构体变量的指针(即
    结构体变量的地址);结构体变量作为函数参数时,调用时传递的结构体变量本身。
    
    	即一个结构体A,当它的指针作为参数传入函数func,那么在func中可以通过指针
    改变结构体的值,函数返回后,结构体的值被改变; 但是,当结构体变量作为
    参数传入函数func时,在func函数中即使对他进行了修改,当函数返回时,结
    构体本身并没有改变,因为修改的只是他的一个副本。
    */
    #include <stdio.h>
    
    /* 定义结构体类型Point */
    typedef struct {
        int x;
        int y;
    } Point;    
    
    void fun1(Point  point) {
         point.x += 10;
         point.y += 10;
    }
    
    void fun2(Point *pPoint) {
        pPoint->x += 10;
        pPoint->y += 10;
    }
    
    void main( )
    {
        Point p;
        p.x = 100;
        p.y = 200;
        
        /* 调用 fun1 */
        fun1(p);
        printf("x=%d, y=%d\r\n", p.x, p.y);
        
        /* 调用 fun2:取p的地址作为参数 */
        fun2(&p);
        printf("x=%d, y=%d\r\n", p.x, p.y);
    }

    2·数据结果

    展开全文
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼为了增加参数调用的灵活性,可以利用结构体指针传递多个不同的参数进入C语言函数体。最著名的例子就是用Win32APIHANDLE CreateThread(LPSECURITY_...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    为了增加参数调用的灵活性,可以利用结构体指针传递多个不同的参数进入C语言函数体。

    最著名的例子就是用Win32API

    HANDLE CreateThread(LPSECURITY_ATTRIBUTES

    lpThreadAttributes,

    DWORD dwStackSize,

    LPTHREAD_START_ROUTINE

    lpStartAddress,

    LPVOID lpParameter,

    DWORD dwCreationFlags,

    LPDWORD lpThreadId);

    函数来创建线程。

    函数的返回值是一个线程句柄

    LPSECURITY_ATTRIBUTES lpThreadAttributes一般设为NULL

    DWORD dwStackSize 一般设为0

    LPTHREAD_START_ROUTINE lpStartAddress 是一个函数指针,一般就是所要执行的函数名。(重要)

    LPVOID lpParameter 无类型参数指针。一般用结构体指针传递参数。无参数时为NULL。(重要)

    DWORD dwCreationFlags 线程执行模式:0(立即执行),CREATE_SUSPENDED(挂起)

    LPDWORD lpThreadId 32位无符号整形指针。用来获取线程ID。

    应用举例:

    MultiThread3将演示如何传送一个指向结构体的指针参数。

    建立一个基于对话框的工程MultiThread3,在对话框IDD_MULTITHREAD3_DIALOG中加入一个编辑框IDC_MILLISECOND,一个按钮IDC_START,标题为“开始” ,一个进度条IDC_PROGRESS1;

    打开ClassWizard,为编辑框IDC_MILLISECOND添加int型变量m_nMilliSecond,为进度条IDC_PROGRESS1添加CProgressCtrl型变量m_ctrlProgress;

    在MultiThread3Dlg.h文件中添加一个结构的定义:

    struct threadInfo

    {

    UINT

    nMilliSecond;

    CProgressCtrl* pctrlProgress;

    };

    展开全文
  • 如何正确使用指针(指针作为输出型参数)与结构体指针作为函数参数 外部定义一个结构体类型指针变量,使用##结构体指针里面的内嵌指针,返回值,双重指针##方式进行地址传递

    如何正确使用指针(指针作为输出型参数)与结构体指针作为函数参数

    指针作为输出型参数

    1. 指针作为输出型参数,通俗的理解,指针作为某一函数的实参,在函数内部发生改变后,外部的值也能跟着发生变化
    2. 类比外部的int a作为函数形参并能够传出来,要用指针形式,外部的指针作为函数形参并能够传出来,要使用指针的指针作为形参类型,其实它们的本质原理是一样的,都是传了变量的内存地址给函数
    程序1:
    void myMalloc(char *s) //在函数中分配内存,再返回 
    { 
    	s=(char *) malloc(100); 
    } 
    void main() 
    { 
    	char *p=NULL; 
    	myMalloc(p); //这里的p实际还是NULL,p的值没有改变
    	if(p) free(p); 
    } 
    程序2void myMalloc(char **s) //指针的指针,双重指针类型
    { 
       *s=(char *) malloc(100); 
     } 
    void main()     
    { 
    	char *p=NULL; 
    	myMalloc(&p); //这里的p可以得到正确的值
    	if(p) 
    		free(p); 
    } 
    

    指针作为输出型参数本质

    1. 指针变量就是一普通变量,当定义了一个变量,操作系统会为其分配相应的内存单元,内存里面存放的都是多个0和1组成的二进制数。
    2. 函数参数传递都是值传递
    3. 左值和右值,变量做左值,指向的是变量的内存空间,变量做右值,含义为将变量内存中存放的值取出来
    4. 取地址符&,与解地址符 *

    假设有一变量 char *a = null;
    假设有一函数 func(char *x) {x = ‘a’;}
    调用func(a)之后,a还是为null。

    调用中间的处理过程:func 临时定义了一个变量 char *x,函数内部使用的是x,而不是直接使用a,然后做了x=a的动作。函数内部一直都是在对x进行操作,故不会改变到a的值。

    将函数换成func(char **x) {*x=‘a’;}
    调用func(&a)之后,a的值为字符’a’。

    调用中间的处理过程:func 临时定义了一个变量 char **xx,函数内部使用的是x,然后做了x=&a的动作,则x变量存放了a的内存地址,函数内部对x进行解地址,即将x变量对应的内存中的那一串0101组成的二进制拿出来,这一串0101组成的二进制就是a的内存地址,*x=‘a’ 即向该空间写值。

    结构体指针就是一普通指针变量

    结构体指针作为函数参数

    void fb_open(struct framebuffer *fb)//指针
    {
        ...
    }
    
    void main()
    {
        struct framebuffer fb0;
        fb_open(&fb0);//取地址符&
        
    	struct framebuffer* fb1;//需要给这个指针分配实体
    	fb1 = (struct framebuffer*)malloc();
        fb_open(fb1);//这时就不用取地址符,fb1中的成员的值在fb_open中被改变会影响
    }
    

    详细例子说明

    #include <stdio.h>
    #include <stdlib.h>
    
    struct test_t{
        int *p;
        
        int a;
        int b;
        int c;
        int d;
    };
    
    //函数外部使用malloc测试函数 (函数形参为结构体类型)
    void func1(struct test_t * test)
    {
        test->a += 1;
        printf("test->a = %d.\n", test->a); 
    }
    
    /* 以下为函数内部使用malloc测试函数 (函数形参为结构体类型) */
    void func2(struct test_t * test)
    {   
        test = (struct test_t *)malloc(sizeof(struct test_t));
        test->b = 1;
        printf("test->b = %d.\n", test->b);
    }
    
    //...func3...
    
    
    void func4(struct test_t **test)
    {
        *test = (struct test_t *)malloc(sizeof(struct test_t));
        (*test)->d = 1;
        printf("test->d = %d.\n", (*test)->d);
    }
    
    
    void func_p(struct test_t * test)
    {
        test->p = (int *)malloc(sizeof(struct test_t));
    }
    
    int main(void)
    {
        //使用案例1:函数外malloc
        struct test_t * t1;
        t1 = (struct test_t *)malloc(sizeof(struct test_t));
        t1->a = 1;
        func1(t1);//这样使用,t1->a的值就会改变,和func4(struct test_t **test)区分
        printf("test->a = %d.\n", t1->a);
        free(t1);
        
        
        //有时候需要在函数里面malloc,如下:
    #if 0
        //使用案例2:错误使用,编译通过,运行触发段错误
        struct test_t *t2 = null;
        func2(t2);
        printf("test->b = %d.\n", t2->b);
        free(t2);
    #endif
    
    #if 1    
        //但是可以在结构体里声明一个指针成员,然后如下使用
        //(实际上原理和案例1是一样的,外部需要有实体,但是这里还提出来,是因为想说一下free的问题)
        //为结构体内部的指针分配内存还是经常遇到的,包含该指针的结构体也是malloc而来的,但是有时只记得free最外层的指针
        struct test_t * t0;
        t0 = (struct test_t *)malloc(sizeof(struct test_t));
        func_p(t0);
        printf("test->p = %p.\n", t0->p);
        free(t0->p);//不会触发段错误,注意free这个指针,还要注意先free这个指针,再free t0
        free(t0);
    #endif
        
        
    #if 0
        //使用案例3:
        struct test_t * t3;
        
        t3 = 返回值为struct test_t *的func3函数;
        ...
    #endif     
        
        //使用案例4:(func4形参使用双重指针类型)
        struct test_t * t4;
        func4(&t4);
        printf("test->d = %d.\n", t1->d);
        free(t4);
        
        //个人常用的就上面几种,当然还有这里没列出来的使用方式
        
        /** 总结
         * >> 函数使用指针类型形参以提高效率     
         * (1)外部定义指针变量再malloc分配
         * (2)函数外部的指针在函数内部malloc后能得到分配的内存地址的两种方式:双重指针和返回值
         * 多多编程多多体会
         */
        return 0;
    }
    
    
    打印内容:
    test->a = 2.
    test->a = 2.
    test->p = 0x81ed020.
    test->d = 1.
    test->d = 1.
    

    :在C语言中,使用结构体的时候 “->” 和 “." 的区别?

    定义的结构体如果是指针,访问成员时就用->
    如果定义的是结构体变量,访问成员时就用.
    例如:
    struct AAA {
        int a;
        char b;
    };
    struct AAA q; 访问成员就用:q.a;
    struct AAA *p; 访问成员就用:p->a;
    
    展开全文
  • 结构体指针 比较函数

    2020-08-20 16:16:13
    通常情况下,c语言喜欢使用指针而不是拷贝的方式进行参数传递,提高运行效率。 如图可以知道,people类型的数组p,...那么最简单的一个对象比较函数,就是比较结构体对象的存储地址,以实现结构体对象的查找。 ...

    通常情况下,c语言喜欢使用指针而不是拷贝的方式进行参数传递,提高运行效率。
    如图可以知道,people类型的数组p,存储在地址未0x402000开始的地方,对于数组成员可以使用&p[i]的方式找到其地址,对于指针的话,其本身就是地址。
    在这里插入图片描述
    那么最简单的一个对象比较函数,就是比较结构体对象的存储地址,以实现结构体对象的查找。
    在这里插入图片描述

    展开全文
  • 最近在STM的GPIO结构体定义中看到源代码的时候,顺便复习下结构体指针变量的定义及typedef 的使用。 1.结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *...
  • C语言用结构体指针函数参数

    千次阅读 2013-11-26 19:17:53
    C语言用结构体指针函数参数 这种方式比用结构体变量作函数参数效率高,因为无需传递各个成员的值,只需传递一个地址,且函数中的结构体成员并不占据新的内存单元,而与主调函数中的成员共享存储单元。这种方式...
  • 原因是当结构体指针传递给函数时,会拷贝一份指针的值,但是函数内部的指针和函数外部的指针并不是指向同一个引用的,所以才会使得函数里面改变了,但是函数外部无变化,解决方案是在传参的时候,将结构体指针的引用...
  • #include #include<stdlib.h>#if 0 //struct_1 在main函数中定义结构体,并实现功能 int main(void) { struct results { float interim_results; float end_results; float average_scores
  • 关于结构体变量和结构体指针变量函数的值传递 */#include #include struct Stduent { int age ; char sex[100] ; // 这表示顶一个一个结构体 char name[100]; //这个数据的类型是 struct Stduent 类型 }; ...
  • 结构体指针类型 参数传递的是指向原结构体的指针。 代码 /* test3.c */ #include <stdio.h> struct data { int i; char *msg; }; void changeData1(struct data d); // 结构体类型参数 void ...
  • 在学习stm32嵌入式开发过程中,关于对GPIOA等地址的强制性结构体指针类型转换的参考依据!
  • 一个问题是,我们想用一个函数来对函数外的变量v进行操作,比如,我想在函数里稍微改变一下这个变量v的值,我们应该怎么做呢?又或者一个常见的例子,我想利用swap()函数交换两个变量a,b的值,我们应该怎么做呢(好...
  • typedef struct LNode *List; struct LNode{ ElementType Data[MAXSIZE]; int Last; }; struct LNode L;...将struct数据类型定义成一个新的数据类型List类型(此时的类型与int flaot ...结构体指针类型的变量都指向结...
  • 然后我们来看结构体指针. 可以看到我们先去定义一个结构体 然后我们在main函数中,去声明一个结构体 s 然后我们定义一个指针 int *p = &s; 指向这个结构体变量. 这里要注意,我们说,对于int a=3; ...
  • 问题背景:在一次操作系统模拟实验中,我构造了一个PCB结构体,它包括几个变量:名称(字符串)、到达时间(整形)。。。 typedef struct pcb { char pname[N]; //进程名 char state; //状态(就绪R,等待W,...
  • c语言结构体学习整理(结构体初始化,结构体指针)

    万次阅读 多人点赞 2018-11-01 20:22:12
    c语言中交换两个结构体的值(结构体指针) 1关于语言的结构体: 首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活...
  • 那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。函数指针函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。“函数类型”说明函数的返回类型...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼为了增加参数调用的灵活性,可以利用结构体指针传递多个不同的参数进入C语言函数体。最著名的例子就是用Win32APIHANDLE CreateThread(LPSECURITY_...
  • 使用typedef定义结构类型结构体类型指针的别名 今天在写printfh函数的时候,部分代码未能通过编译,特此记录,防止以后再犯这样的错误 typedef struct person { /* data */ char *name; int age; char score; ...
  • #include<stdio.h> #include<string.h> struct AGE { int year; int month; int day; }; struct STU { char name[20]; int num; struct AGE birthday;...void InputStu(struct ST...
  • C函数需要传递结构体指针是常事,但是和Python交互就有点麻烦事了,经过研究也可以了。 &lt;结构体指针作为函数参数&gt; 来看下C测试例子: #include &lt;stdio.h&gt; typedef struct ...
  • C结构体中的函数指针函数

    千次阅读 2011-08-07 17:21:43
    C结构体中的函数指针函数   C结构体中的函数指针函数 1. 函数指针 一般的函数指针可以这么定义: int(*func)(int,int); 表示一个指向含有两个int参数并且返回值是int形式的任何一个函数...
  • 结构体指针

    2017-09-11 22:28:58
    通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。 结构体指针变量定义的一般形式: 结构体名 *结构体指针变量名 当然也可以在定义结构体的同时定义这个结构体指针变量。 例如...
  • 那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。 函数指针 函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。 “函数类型”说明函数的返回...
  • 定义了一个函数指针add,它可以指向一个函数,这个函数有两个int类型参数,并返回一个int类型的值。 函数指针一般配合函数实例化使用 例如:int add (inta,intb) .add = add 结构体函数:(声明结构体函数,初始...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 169,129
精华内容 67,651
关键字:

结构体指针类型函数