精华内容
下载资源
问答
  • 如何在函数中调用结构体数组
    2021-05-20 16:06:12

    #include "stdio.h"

    struct abc{

    int a;

    int b;

    char *p;

    };

    struct abc myabc(void){

    struct abc n;

    n.a=2;

    n.b=3;

    n.p=(char *)0x00FF3304;

    return n;

    }

    void main(void)

    {

    struct abc x={1,2,(char *)0x00FF3300},y;

    y=myabc();

    printf("%d %d %p%d %d %p",x.a,x.b,x.p,y.a,y.b,y.p);

    }

    扩展资料:

    在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

    C++提供了许多种基本的数据类型(如int、float、double、char等)供用户使用。由于程序需要处理的问题往往比较复杂,而且呈多样化,已有的数据类型显得不能满足使用要求。C++允许用户根据需要自己声明一些类型,用户可以自己声明的类型还有结构体类型(structure)、共用体类型(union)、枚举类型(enumeration)、类类型(class )等,这些统称为用户自定义类型(user-defined type,UDT)。

    更多相关内容
  • Java调用C语言动态库(JNA方式):回调函数结构体数组传参、结构体数组返回-附件资源
  • 项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL引入函数就可以了。但是当传递的是结构体、结构体数组或者结构体指针的时候,就会发现C#上没有类型可以对应。这时怎么办,...
  • 【☀️C语言函数传参の结构体数组篇☀️】

    万次阅读 多人点赞 2021-08-31 20:58:08
    C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。) (1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变...

    背景介绍

    C语言中函数参数传递的两种方式(“引用传递做函数参数”是C++的特性,C语言不支持。
    (1)传值,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值。
    (2)传址,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。一般有变量地址作为参数、数组名作为参数、指针作为参数。

    1. 数组名作为参数时,传递的是数组的首地址,实参数组和形参数组共用了一段内存空间。所以当用数组名做参数时,实参和形参共享了一个数组,形参数组的改变也就是实参数组的改变。
    2. 指针作为参数和数组名作参数类似,传递的也是结构体数组的首地址,但是此时不是共享一个数组,而是共享一个变量的地址,也就是实参指针和形参指针共同指向同一个变量,共享同一个变量地址。

    示例demo

    下面的demo中:
    test函数以结构体数组名为形参;
    test1函数以结构体数组的首地址和数组大小作为形参;
    test2函数是把结构体数组的首地址传入,然后以数组的形式遍历;

    #include <stdio.h>
    #include <string.h>
    
    #define MAXNUM (2)
    
    typedef struct tagNumber
    {
        int i;
        int j;
        int k;
    }TNum;
    
    typedef struct tagNumbers
    {
        TNum atNum[MAXNUM];
    }TNums;
    
    
    // 结构体数组名
    void test (TNums atNums1[])
    {
        printf("atNums1 ptr:%p\r\n",atNums1);
        
        int idx = 0; 
        int idx1 = 0;
        
        for(idx = 0; idx < MAXNUM; idx++)
        {
            for(idx1 = 0; idx1 < MAXNUM; idx1++)
            {
                printf("i:%d\n",atNums1[idx].atNum[idx1].i);
                printf("j:%d\n",atNums1[idx].atNum[idx1].j);
                printf("k:%d\n",atNums1[idx].atNum[idx1].k);
            }
        }
    }
    
    //结构体指针1.0
    void test1(TNums *ptNum,int num)
    {
        printf("ptNum ptr:%p\r\n",ptNum);
        int idx = 0; 
        int idx1 = 0;
        
        for(idx = 0; idx < num; idx++)
        {
            for(idx1 = 0; idx1 < num; idx1++)
            {
                printf("i:%d\n",(ptNum + idx)->atNum[idx1].i);
                printf("j:%d\n",(ptNum + idx)->atNum[idx1].j);
                printf("k:%d\n",(ptNum + idx)->atNum[idx1].k);
            }
        }
    }
    
    //结构体指针1.1
    void test2(TNums *ptNum)
    {
        printf("ptNum ptr:%p\r\n",ptNum);
        int idx = 0; 
        int idx1 = 0;
        
        for(idx = 0; idx < MAXNUM; idx++)
        {
            for(idx1 = 0; idx1 < MAXNUM; idx1++)
            {
                printf("i:%d\n",ptNum[idx].atNum[idx1].i);
                printf("j:%d\n",ptNum[idx].atNum[idx1].j);
                printf("k:%d\n",ptNum[idx].atNum[idx1].k);
            }
        }
    }
    
    int main() {
    
        TNums atNums[MAXNUM];
        memset(atNums, 0, sizeof(atNums));
        
        int idx = 0; 
        int idx1 = 0;
        for(idx = 0; idx < MAXNUM; idx++)
        {
            for(idx1 = 0; idx1 < MAXNUM; idx1++)
            {
                atNums[idx].atNum[idx1].i = 1+idx;
                atNums[idx].atNum[idx1].j = 2+idx;
                atNums[idx].atNum[idx1].k = 3+idx;
            }
        }
        
        printf("atNums ptr:%p\r\n",atNums);
        
        printf("func 1:\r\n");
        test(atNums);
        
        printf("func 2:\r\n");
        test1(atNums, MAXNUM);
        
        
        printf("func 3:\r\n");
        test2(atNums);
        return 0;
    }
    

    打印信息:

    atNums ptr:0x7fff87dba270
    func 1:
    atNums1 ptr:0x7fff87dba270
    i:1
    j:2
    k:3
    i:1
    j:2
    k:3
    i:2
    j:3
    k:4
    i:2
    j:3
    k:4
    func 2:
    ptNum ptr:0x7fff87dba270
    i:1
    j:2
    k:3
    i:1
    j:2
    k:3
    i:2
    j:3
    k:4
    i:2
    j:3
    k:4
    func 3:
    ptNum ptr:0x7fff87dba270
    i:1
    j:2
    k:3
    i:1
    j:2
    k:3
    i:2
    j:3
    k:4
    i:2
    j:3
    k:4
    
    

    引经据典

    http://www.oh100.com/kaoshi/c/536660.html

    展开全文
  • c函数传递结构体数组

    万次阅读 多人点赞 2019-08-23 16:35:25
    结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。(结构体变量传递给函数与基本变量传递给函数类似...(结构体数组传递给函数与数组传...

    结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。(结构体变量传递给函数与基本变量传递给函数类似,可参考c函数传值调用和引用调用

    如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。(结构体数组传递给函数与数组传递给函数类似)

    一 形式参数

    形式参数是一个结构体指针

    void average(struct stu *ps, int len)

    {...}

    二 调用方式

    结构体数组名是一个指向结构体数组中第一个元素的常量指针,将结构体数组名(常量指针)传递给函数

    average(stus, len);

    三 案列展示

    #include <stdio.h>
    struct stu{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    }stus[] = {
        {"Li ping", 5, 18, 'C', 145.0},
        {"Zhang ping", 4, 19, 'A', 130.5},
        {"He fang", 1, 18, 'A', 148.5},
        {"Cheng ling", 2, 17, 'F', 139.0},
        {"Wang ming", 3, 17, 'B', 144.5}
    };
    void average(struct stu *ps, int len);
    int main(){
        int len = sizeof(stus) / sizeof(struct stu);
        average(stus, len);
        return 0;
    }
    void average(struct stu *ps, int len){
        int i, num_140 = 0;
        float average, sum = 0;
        for(i=0; i<len; i++){
            sum += (ps + i) -> score;
            if((ps + i)->score < 140) num_140++;
        }
        printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
    }

     

    展开全文
  • 一、结构体的定义struct student{ //struct 结构体名long studentID; //数据类型 成员名1char studentName[10]; //数据类型 成员名2int scoreMath; //数据类型 成员名3};二、结构体变量的定义1先声明结构体模板,再...

    一、结构体的定义

    struct student{ //struct 结构体名

    long studentID; //数据类型 成员名1

    char studentName[10]; //数据类型 成员名2

    int scoreMath; //数据类型 成员名3

    };

    二、结构体变量的定义

    1先声明结构体模板,再定义结构体变量

    struct student{ //struct 结构体名

    long studentID; //数据类型 成员名1

    char studentName[10]; //数据类型 成员名2

    int scoreMath; //数据类型 成员名3

    };

    struct student stu1; //结构体变量1

    struct student stu2; //结构体变量1

    2在声明结构体模板的的同时定义结构体变量

    struct student{ //struct 结构体名

    long studentID; //数据类型 成员名1

    char studentName[10]; //数据类型 成员名2

    int scoreMath; //数据类型 成员名3

    }stu1; //结构体变量

    3在声明结构体模板的的同时定义结构体变量, 结构体名可省略。

    struct { //struct 结构体名

    long studentID; //数据类型 成员名1

    char studentName[10]; //数据类型 成员名2

    int scoreMath; //数据类型 成员名3

    }stu1; //结构体变量

    三、用tyepedef定义数据类型

    关键字typedef用于为系统固有的或程序员自定义的数据类型定义一个别名。

    例如:typedef int STU;为int定义了一个新的名字STU,即STU与int是同义词。

    #include

    typedef int STU;

    void main(){

    STU a=1,b=2,temp=0;

    temp=a;

    a=b;

    b=temp;

    printf("%d%d",a,b);

    }

    所以typedef struct student STUDENT;与下面表示别名是等价的。

    typedef struct student { //struct 结构体名

    long studentID; //数据类型 成员名1

    char studentName[10]; //数据类型 成员名2

    int scoreMath; //数据类型 成员名3

    } STUDENT; //别名

    STUDENTstu1,stu2; //变量

    STUDENT STU[2]; //结构体数组变量的定义

    四、结构体变量的初始化(包括结构体数组)

    STUDENT stu1={2019001,"小范范",100};

    STUDENT stu2={2019002,"王启年",90};

    STUDENT STU[2]={{2019001,"小范范",100},{2019002,"王启年",90}}; //结构体数组变量的赋值

    五、嵌套结构体(是一个结构体嵌套另一个结构体作为自己的成员)(包括结构体数组)

    1定义

    typedef struct data{

    int year; //年

    int month;//月

    int day; //日

    }DTAE;

    typedef struct student { //struct 结构体名

    long studentID; //数据类型 成员名1

    char studentName[10]; //数据类型 成员名2

    int scoreMath; //数据类型 成员名3

    DTAE birthday;//出生日期

    } STUDENT; //别名

    STUDENT stu1;

    STUDENT stu2;

    STUDENT STU[2];

    2赋值

    STUDENT stu1={2019001,"小范范",100,{1998,12,26}};

    STUDENT stu2={2019002,"王启年",90,{1991,12,25}};

    STUDENT STU[2]={{2019001,"小范范",100,{1998,12,26}},{2019002,"王启年",90,{1991,12,25}}};

    3引用(调用)

    结构体名变量名**.**成员名 //不是结构名

    stu1.birthday.year=1991;

    stu2.scoreMath=100;

    STU[0].studentID=2019001;

    从键盘赋值时 char 类型不用添加&

    scanf("%c",stu1.studentName);

    六、结构体指针的定义和初始化

    1 结构体名*指针变量名

    STUDENT *pt;

    2定义并初始化

    STUDENT *pt=&stu1; //结构体指针变量pt指向结构体变量stu1

    上下两者等价

    STUDENT *pt;

    pt=&stu1;

    3标准访问形式

    指针结构体变量名——>成员名

    pt->birthday;

    另一种不常用

    (*pt).studentID;

    4访问数组

    以下三者等价

    STUDENT *pt=STU;//指向数组STU第一个元素的地址

    STUDENT *pt=&STU[0];

    STUDENT *pt;

    pt=STU;

    4结构体指针一般不作输出用,下面这个是普通指针的输出

    int a=9;

    int *pt;

    pt=&a;

    printf("%d",*pt);

    展开全文
  • C语言数组、结构体、结构体数组作为函数参数

    千次阅读 多人点赞 2021-03-27 16:05:32
    调用函数时实际传递的是一个指针,所以函数的形参实际上是一个指针,但为了使程序员新手更容易上手一些,编译器也接受数组形式的函数形参。因此,下面这两个函数原型是相等的: int strlen(char *string); int ...
  • 《C和指针》函数的参数一节(7.3节)指出,C函数的所有参数均以“传值调用”方式进行传递,这意味着函数将获得参数值的一份拷贝。这样函数可以放心地修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数。......
  • 示例代码: #include"stdio.h" #include"stdint.h" ...struct jiegouti//这是个结构体 { int8_t paraone;//第一个参数 uint8_t paratwo;//第二个参数 uint16_t parathree;//第三个参数 hansh...
  • 创建结构体数组 下面的示例说明了如何创建结构体数组。结构体是使用被称为字段的数据容器将相关数据组合一起的一种数据类型。每个字段都可以包含任意类型或任意大小的数据。将记录存储含有字段name、billing和...
  •  这里的难点就处理回调函数结构体数组参数,参数是从dll传出来的,java里面用指针接收,而获取结构体内部的每个值就需要用读内存的方式读取出来,这里就需要对结构体内存的存储方式比较了解才行,因为read...
  • 有时候我们需要两个文件中都使用同一个结构体,这就需要将一个文件中将结构体定义为外部,供另外一个文件使用。方法如下:
  • 结构体指针来访问结构体数组 01——下标法遍历数组 之前我们对于这个结构体数组的遍历是用下标法来访问的,其实还可以使用指针来遍历结构体数组。 02——指针遍历数组 定义了一个结构体指针变量来保存数组的首地址 ...
  • 这里会涉及到全局变量和局部变量的区别吗?我看的资料都是结构体屁股后面初始化结构体变量的,那个函数调用的指针指向结构体数组还是结构体变量呀?我是本比
  • PTR stu2){ /*STU stu2[]或者是STU stu2[100]这三种方式编译器编译时都会编译成第一种*/ } int main(stu1){ } //先声明了一个结构体类型,然后用这个数据类型定义了一个结构体数组并赋值 //数组在函数中传递时,...
  • 一、读取文件结构体数组 | feof 函数使用注意事项、 二、代码示例、
  • C#调用C/C++动态库 封送结构体,结构体数组 一.结构体的传递 Cpp代码 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int osVersion; int majorVersion; int minorVersion...
  • MATLAB定义结构体数组 最近使用MATLAB代码生成,结构体数组的问题困扰许久,先将支持代码生成的结构体数组创建方法总结如下,主要参考MATLAB帮助文档。 0. MATLAB的结构体 结构体是使用被称为字段的数据容器将...
  • C语言 通过指针访问结构体数组
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼#includestruct Stu{char name[20];int Xuehao;float Chinese;float Math;float English;float all;}student[5];/**/struct Stu student[];void TolCom(student){struct ...
  • C#调用 C++ 结构体数组

    千次阅读 2017-11-30 14:51:22
    C++ 结构体定义和赋值 typedef struct { char barcode[13]; int num; }Goods; extern "C" __declspec(dllexport) bool getGoods(Goods* pGoods) { for (int i = 0; i; i++) { sprintf(pGoods[i].barcode, ...
  • 函数使用数组名作为参数时,实际上传递的时数组第一个元素的地址,因为访问数组中的元素时,数组名和指针之间起着等效的作用,因此可以通过以下3种方式在函数中传递数组。 (1)函数使用数组名作为作为形参 (2)函数...
  • 已结贴√问题点数:25回复次数:10 关于从文件读取数据并写入结构体数组各位大大好,本人新手一枚,最近写简单的通讯录的c程序,其他功能完好,最后一个将txt文件的数据写入结构体数组函数无法正常使用。...
  • 结构体&结构体数组

    万次阅读 多人点赞 2018-08-16 18:17:39
    1、结构体的定义 struct 结构体类型名 { 类型名 成员名; 类型名 成员名; …… }; 先声明结构体类型,再定义结构体变量名 声明结构体类型,不分配空间 定义结构体类型变量,就要分配内存空间 1)结构体被...
  • day16.2-结构体数组赋值

    千次阅读 2022-04-25 13:51:24
    一、用下标手动给字符数组赋值>二、通过strcpy给赋值>三、结构体数组赋值>四、作业
  • 研究了一下C# 调用C++ dll时结构体的操作
  • typedef struct XML_DATA { struct XML_DATA DATA[10]; char MENU[10][256]; ezxml_t xml; char *txt; char *strAttr; char *file; }; XML_DATA m_data[10]; 这样使用为什么会报错,应该怎么修改?...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 140,076
精华内容 56,030
热门标签
关键字:

如何在函数中调用结构体数组