精华内容
下载资源
问答
  • *结构体数组作为函数参数时,实际上是将结构体数组的第一个数组成员的地址传递给了形参,用对应的指针或者直接用结构体数组的名称作为实参效果是一样的,操作都直接对结构体数组进行,可以改变其值下面程序中aver...

    2018年5月25日17:49:52

    *结构体变量作函数参数时,函数内的操作不会改变结构体的值,结构体的各成员作为实参传递给了函数的形参,实际操作的是形参,不会影响实参;

    *结构体数组作为函数参数时,实际上是将结构体数组的第一个数组成员的地址传递给了形参,用对应的指针或者直接用结构体数组的名称作为实参效果是一样的,操作都直接对结构体数组进行,可以改变其值


    下面程序中aver(stu+i)中的stu+i的值被赋给了指针形参struct_address   

    需要注意的是,虽然这种传递是合法的,但数组名stu并不是指针变量,而是隐式的等于指向数组首元素的指针的值,这个值是不可更改的 关于数组名和指针的具体区别可参照另一篇博客,点击打开链接我觉得写得很通俗易懂。

    #include "stdafx.h"
    #define N 3
    struct Student
    {
    	int num;
    	char name[20];
    	float score[3];
    	float aver;
    }stu[N];
    void input();
    void print(struct Student str_stu);
    void aver(struct Student *struct_address);
    struct Student max();
    
    int main()
    {
    	while(1)
    	{
    		printf("please input the information of students\n");
    		input();
    		print(max());
    	}
    	
    }
    
    void input()
    {
    	int i;
    	for (i=0; i<N; i++)
    	{
    		printf("please input the num,name,score1,score2,score3 of the student%d\n",i+1);
    		scanf("%d %s %f %f %f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
    		aver(stu+i);   
    	}
    
    }
    
    void aver(struct Student *struct_address) 
    {
    	struct_address->aver = (struct_address->score[0]+struct_address->score[1]+struct_address->score[2])/3;
    }
    
    struct Student max()
    {
    	int i;
    	struct Student stu_swap;
    	stu_swap = stu[0];
    	for (i=0; i<N; i++)
    	{
    		if (stu_swap.aver<stu[i].aver)
    		{
    			stu_swap = stu[i];
    		}
    	}
    	return stu_swap;
    }
    void print(struct Student str_stu)
    {
    	printf("num:%d\nname:%s\nscore1:%f\nscore2:%f\nscore3:%f\naverage:%f\n",str_stu.num,str_stu.name,str_stu.score[0],str_stu.score[1],str_stu.score[2],str_stu.aver);
    }



    另:初学的一点经验

    1、关于指针变量的理解

    我是如下理解的,可能有些不准确,但很形象。如果把变量看成狗,那么指针变量就是拴狗的链子,当函数引用变量时,引用实参是吧原来的狗复制了一条,我们称之为假狗,假狗和狗只是类型和值相同,没有联系,函数内的操作都是对假狗进行,函数结束后假狗会被释放,狗还是原来的狗,而当函数引用指针变量时,是把原来的狗链复制了一条,我们称之为假狗链,虽然假狗链和狗链一样是类型和值相同,没有联系,但当使用*进行寻址运算时,它们都指向原来那条狗,通过假狗链进行的操作也都进行在了狗身上,因此狗被改变了。

    2、本人常犯的一些小错误

        1.数组的第一个元素是a[0]不是a[1]

        2.scanf函数后面要写&a而不是a

        3.*adr_struct.a = n 和 adr_struct->a = n 等价,不要写*adr_sturct->a = n(因为想写第一种写法时,vs识别adr_struct后会自动把.变为->,还要手动改一下,因此最好统一用第二种写法)


    目前使用的教材:谭浩强c程序设计教程(第二版),初学,文章难免存在问题,欢迎指正。

    展开全文
  • 数组作为函数参数 如果想把一个数组参数传递给函数,正确的函数形参应该是怎样的?它是应该声明为一个指针还是一个数组? 调用函数时实际传递的是一个指针,所以函数的形参实际上是一个指针,但为了使程序员新手更...

    数组作为函数参数

    如果想把一个数组名参数传递给函数,正确的函数形参应该是怎样的?它是应该声明为一个指针还是一个数组?

    调用函数时实际传递的是一个指针,所以函数的形参实际上是一个指针,但为了使程序员新手更容易上手一些,编译器也接受数组形式的函数形参。因此,下面这两个函数原型是相等的:

    int strlen(char *string);
    int strlen(char string[]);
    

    结构体作为函数参数

    举例结构体:

    typedef struct {
    	char product[20];
    } transaction;
    transaction current_trans;	//假设已初始化完成
    

    结构体作为函数参数

    void  print_info(transaction trans)
    {
    	printf("%s\n", trans.product);
    }
    
    // 调用方式
    print_info(current_trans);
    

    结构体指针作为函数参数

    void print_info(transaction *trans)
    {
    	printf("%s\n", trans->product);
    }
    
    // 调用方式
    print_info(&current_trans);
    

    结构体数组作为函数参数

    我们知道数组作为函数参数的使用方法,那结构体数组本质上也是数组,所以结构体数组作为函数参数的使用方法应该与数组作为函数参数的方法一样。同时我们也知道,下标引用与间接访问完全相同 。下图中函数访问结构体数组是使用下标引用的方式。
    在这里插入图片描述
    下图是传参另一种方式,同样也是使用下标引用方式:
    在这里插入图片描述

    即然下标引用与间接访问相同,那间接访问应该如何实现?见下图:
    在这里插入图片描述

    上图中第 18 行也可以这样写,(* ( cmd+i ) ).name。由于 " * "取值运算符优先级小于 " . "成员选择运算符,所以需要将 *cmd 用括号括起来。

    另外,void print_info() 函数的第一个参数也可以这样写 ” str_cmd cmd[] “。就是和数组是一样的。变来变去,取自己喜欢的一种即可。

    还有一种写法,如下图:
    在这里插入图片描述
    这种写法实际处理函数只针对某一个结构体(传进来的那个结构体)操作。

    针对不同的应用场景,选择传递合适的参数。

    展开全文
  • C++中使用结构体数组作为函数参数

    千次阅读 2020-06-25 09:51:01
    在写C++的时候,当使用一个数组作为函数参数传入的时候,数组自动转化成指针变量。 int arr[] = {1,2,3}; //arr++; //这里错误 void printArr(arr[]) { arr++; //正确 } 因此在函数内部修改形参数组时,实参也会...

    在写C++的时候,当使用一个数组作为函数参数传入的时候,数组自动转化成指针变量。

    int arr[] = {1,2,3};
    //arr++; //这里错误
    
    void printArr(arr[])
    {
    	arr++; //正确
    }
    

    因此在函数内部修改形参数组时,实参也会发生改变

    展开全文
  • 最近使用VS2008编写程序时,遇到了如何引用结构体数组作为函数形参问题。 现将主要代码粘贴如下(结果如图所示),来达到传递结构体数组函数中的目的: ////--main.cpp--///// #include "Point.h"#include#...

    最近使用VS2008编写程序时,遇到了如何引用结构体数组作为函数形参问题。

    现将主要代码粘贴如下(结果如图所示),来达到传递结构体数组到函数中的目的

    --main.cpp--/

    #include "Point.h"

    #include<iostream>

    #include<fstream> 

    using namespace std;

    typedef struct      //定义结构体

    {

       int num;

       float x;

       float y;

       float z;

    }Position;

    void PassData(Position (&P)[5]);//声明函数

    ///

    void ReadData(char*fname)//Read file's data

    {  

       Position PointN[5];

       for (int i=0;i<5;i++)//数组初始化

    {

    PointN[i].num=0;

    PointN[i].x=0;

    PointN[i].y=0;

    PointN[i].z=0;

    }

    fstream out;                                               

    out.open(fname,ios::in);

    while (!out.eof())

    {

    for (int i=0;i<5;i++)//从文档中读入数据至数组

    {

    out>>PointN[i].num;

    out>>PointN[i].x;

    out>>PointN[i].y;

    out>>PointN[i].z;

    }

    }

    out.close();

    PassData(PointN);//传递结构体数组数据到函数中显示

    }

    ///

    void PassData(Position (&P)[5])//Read file's data

     for(int i=0;i<5;i++)

    {

    cout<<P[i].num<<" "<<P[i].x<<" "<<P[i].y<<" "<<P[i].z<<endl;

    }

    }

    ///

    int main(int argc, char* argv[])                

    {

    ReadData("1.txt");

    system("Pause");return 0;

    }

    数据及运行结果如图:


    问题:为什么“引用”时需要限定数组大小?
    答案:
    如果参数是数组的引用,那么编译器不会将它转换为指针,而是直接传递数组本身,也就是说,数组的长度不可省略,编译器将检查传入函数的实际数组参数的长度和函数的形式参数的长度是否匹配。
    
    
    /*************************************初学C++,有不正之处还望赐教!****************************/

    参考:http://zhidao.baidu.com/link?url=eFwmfcjawrI_qjeYPp8qFABzZRi6V3s44SprAZJ5YyAhEi_SqAVHsoi9A2opJLoVOdVj_oo8tkK7LXm01HwwY_

    展开全文
  • //函数的副本机制,是每个形式参数,都会新开辟一片内存新建一个变量,容纳传入过来的实际参数的值, //设计一函数改变num void change(int num)//函数没有改变成功, { num = 20; printf("changenum=%x\n",&num);...
  • 用VC6.0的MFC编程,一直对结构体作为函数参数的问题比较头疼,一直回避,今天又遇到了,于是查找资料解决一下心头的疑问,一直用指针来处理结构体,所以对于函数的形参也用指向结构体的指针来传递。 完成目的:初始...
  • 请问结构体数组怎样传递参数? 请问结构体数组怎样传递参数?问结构体数组怎样传递参数?例如有结构体: struct _pro_ { char m[20]; char *n; }; 定义结构体数组如下: struct _pro_ problem[][]...
  • 将结构数组 “keytab” 传递给函数 “binSearch“本身没有什么问题,但是数组作为参数传递的是数组的“首地址”, 这将导致接下来的语句计算出现错误:int high = (sizeof table/sizeof table[0]) -1; ①:...
  • 7.8 指针、数组函数 **案例描述:**封装一个函数,利用冒泡排序,实现对整型数组的升序排序 例如数组:int arr[10] = { 4,3,6,9,1,2,10,8,7,5 }; 示例: //冒泡排序函数 void bubbleSort(int * arr, int len) //...
  • 结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。 C++提供了许多种基本的...
  • C#调用c++的dll,返回的是dll的自定义结构体数组,在C#中传递参数是自定义结构体数组的首元素,切记,是首元素,而不是首地址!C++的参数是自定义结构体的指针。 1.C#代码: (1)  public class Form1 ...
  • } 结果运行效果截图: 运行没问题,这里解释一下如何把结构体数组作为参数传入函数,其实在C语言中,任何数组都可以用首地址加上数组长度的方式传入函数结构体数组也是数组,同样可以以首地址加上数组长度的方式...
  • Keil 结构体变量初始化tujidi1csd25142016-09-30一维数组结构体数组结构体数组,通过改变指针类型改变访问数组的方式toto129748850424332014-08-01mfc结构体指针、结构体数组指针u01399024812292014-12-14memset...
  • C++结构体(结构体创建,结构体数组) 目录 C++结构体(结构体创建,结构体数组) 1、结构体创建 2、结构体创建代码演示 3、结构体数组 4、结构体数组代码演示 1、结构体创建 struct结构体名 变量名 struct...
  • C语言结构体数组+结构体类型指针+指向结构体数组的指针+typedef类型结构体数组两种结构体数组的定义形式用sizeof运算符求结构体数组所占字节数结构体类型指针指向结构体数组的指针typedef类型 结构体数组 如果要处理...
  • c函数传递结构体数组

    千次阅读 多人点赞 2019-08-23 16:35:25
    结构体变量名代表的是整个集合本身,作为函数参数传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。(结构体变量传递给函数与基本变量传递给函数类似,可参考c函数传值调用和引用调用) ...
  • 1. 结构体定义 结构体是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。为了定义结构,必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下...
  • 内置类型和结构体类型作为函数参数传递时的共同点 分类: C2013-03-18 20:12 275人阅读 评论(0) 收藏 举报 结构体类型不同于数组,而结构体类型与内置类型有很多相同之处。数组名代表数组的第一个...
  • C 语言结构体数组指针以及函数

    千次阅读 2019-01-23 21:19:48
    结构体数组指针 指针变量可以指向一个结构体数组,这时指针变量的值是整个数组的首地址。 设 ps 为指向结构体数组的指针变量,则 ps 也指向该结构体数组的第 0个元素,ps+1 指向第一个元素,ps+i 则指向第 i 元素,...
  • 主要给大家介绍了关于C语言中二维数组作为函数参数传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 书上说数组都是以传地址的方式进行参数传递的。为什么A,B的输出不同?结构体数组变量s[1] 作为参数和结构体变量成员s作参传递的都是数组,为什么输出不同? A:#include #include typedef struct {char name[10];} ...
  • C#调用C++DLL传递结构体数组的终极解决方案 在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了。但是当传递的是结构体、结构体数组或者结构体指针的时候,...
  • 在通常结构化编程中,通常涉及到数据做成和传递,我们通过参数传递一块内存区域的指针到函数中,希望在函数中做成指定格式的数据,放在传递到函数的指针所指向的内存区域,在主函数中通过传递到函数中的指针访问该...
  • JNA结构体数组

    万次阅读 2014-08-18 15:28:14
    本文主要讲述使用JNA模拟结构体并将结构体数组作为参数传递给对应的方法。
  • 首先,结构体里面的字符串指针输出出现乱码的问题: 相信很多遇到过这种问题的人都跟我一样写过这样的代码(好吧,或许不一样。。。): #include #include typedef struct{ int age; const char* name; const ...
  • 话不多说,上代码 函数调用数组  #include void main() { void f1(int a); void f2(int x[]);... int a[10] = { 0,1,2,3,4,5,6...//函数调用数组数组名存的就是数组首地址) } void f1(int a)//就像调用一个变量一

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,216
精华内容 20,886
关键字:

结构体数组作为函数参数传递