结构体数组做函数参数,c语言中数组名作为函数参数
结构体数组做函数参数,c语言中数组名作为函数参数详细介绍
本文目录一览: 关于c语言中的结构体数组作为函数参数传递的
printf("The Euclidean distance between two Points is %lf",PointDist(d[2]));
这一行有问题,你直接把d[2]作为参数传递过去了,d[2]是一个Point类型,而函数的形参是指针类型,所以会报错。要做的就是改成printf("The Euclidean distance between two Points is %lf",PointDist(d));就好。
printf("The Euclidean distance between two Points is %lf",PointDist(d[2]));
输出格式是%lf, 而PointDist(Point)的返回值是int型的。
还有PointDist()是求两点见的距离吗?似乎公式不对呀?
坐标最好使用float型数据,
楼主朋友,你的程序有问题的几个地方是:
1、参数传递不对,因为你的函数定义时的形参为 以Point 为基类型的指针,而在函数声明和调用中你用的是Point 类型变量;
2、函数的返回值类型和你最后输出的时候的数据格式说明符不符,因此出现了你所说的错误。
修改如下就没问题了
#include
#include
typedef struct {int x; int y;} Point;
int PointDist(Point *);
int main()
{
Point d[2];
printf("Enter the x value of point1:"); scanf("%d",&d[0].x);
printf("Enter the y value of point1:"); scanf("%d",&d[0].y);
printf("Enter the x value of point2:"); scanf("%d",&d[1].x);
printf("Enter the y value of point2:"); scanf("%d",&d[1].y);
printf("The Euclidean distance between two Points is %d\n",PointDist(d)); //把lf改成 d
system("pause");
return 0;
}
int PointDist(Point dot[2]) //实际上如果不修改上面的lf时可以把此处以及函数声明中
//的int改成double
{
int a,b;
a=(dot[0].x-dot[1].x)+(dot[0].y-dot[1].y);
b=a+1;
return b;
}
1、结构体数组传给指针,实质上是不可能的,本质上传的是数组首地址,根据偏移来操作数组,这样看起来好像是真在操作数组一样。就和普通指针一样使用,只不过它是结构体数组。2、例程:
typedef struct Student{ char name[10] ; int age ;}Student;#define LEN 10 //print all Student infomationvoid fun(Student *pStu,int len){ int i ; for(i = 0 ;i < len ;++i) { printf("%s\t%d",pStu[i].name,pStu[i].age) ; }}int main (){ Student stu[LEN] ; fun(stu,LEN) ; }
结构体数组怎么在函数中作形参?
作为形参(指针或不定界的数组)当然可以。
struct student{
char name[10];
int point;
}; // 有分号,别漏了
struct student stu1[20]; // 你声明的是全局量
void fact(struct student *stu1, int n){
参数传递,最好再加一个数组元素个数参数
};
main()
{
fact(stu1,20); // 调用
return 0;
}
---
作为全局量也可以。
void fact(){...} -- 无参数
fact(); // 调用也无参数
--
C语言中结构体数组名作为函数参数的问题
两种方法:
函数声明:int oid(snmp_seq sp, rmc1207 ramp[], int size)
函数声明:int oid(snmp_swq sp, rmc1207 * ramp, int size)
两种方法实际上是一样的,数组在函数调用时会退化成指针,因此需要传入数组的大小,即int size。
调用: oid(sp, ramp, BUFFER_SIZE)即可。
函数声明中不能直接写BUFFER_SIZE,只能写size。
函数声明:int oid(snmp_seq sp, rmc1207 ramp[], int size)
函数声明:int oid(snmp_swq sp, rmc1207 * ramp, int size)
函数定义和声明的参数应该是: int oid_check(struct snmp_seq sp, struct rmc1207 * ramp, int BUFFER_SIZE);
函数调用: flag=oid_check(sp, ramp, BUFFER_SIZE);
-------------------------------------------------------------------------------
在这里, ramp 是结构体数组的指针
C语言:结构体数组怎样做形参?字符数组怎样输出?使用%s?
1、print函数定义,记得在TC里参数最好这样写:
print(stu)
struct
student
stu[5];
{
……
}
2、printf函数中的参数
stu[i].name[20]
引用方式是错误的
字符串输出应该使用字符串的首地址,正确的格式应该是:
stu[i].name
C++ 结构体数组 引用类型作为函数形参时,编译错误,提示“引用”使用的不对
把程序中的所有的:
void print(student &pstud[])
都改为:
void print(student (&pstud)[])
即可。
(共修改两处, 一处main()函数中的声明,另一处就是后面的定义)
只要把print函数定义和声明处的参数中 & 符号去掉就行了,你加上这个符号愿意可能是想按引用使用参数,但是pstud[]是数组,直接使用它就是使用他的地址,也即按引用使用,所以不必加它。
而你非要用&,则相当于传递了一个指针,但是这个类型的指针并不是指向pstud结构体的指针,而是指向pstud[]类型的指针,这么说如果不理解,建议你去研究一下二维数组和指向指针的指针
结构体参数传递问题 定义struct student {} 想定义一个函数void rank(参数想传入n个学生的数据),怎么做
void rank(struct student s[],int n)
{
int i;
for(i=0;i
<n;i++)
{
/*student[i]*/
}
}
或
void rank(struct student *s,int n)
{
}
不管你想传结构中的哪部分信息,都要把整个结构数组的指针传进来,另外再传个表示数组长度的变量。
void rank(struct* stu);
1)定义一个结构体数组:
typedef struct student {
char name[64];
int xuehao;
……
};
2)函数定义的时候,参数用指针或地址(&)形式(因为便于传值);
void rank(*student)
{
……
}
3)在主函数中声明一个结构体数组,用于存储多名学生的信息
void main()
{
student stu[128]; //最多能够统计128位学生信息
//此处可以录入学生信息到结构体数组(stu)中,即进行赋值操作
rank(&stu)//传递给函数rank,然后在函数中进行信息的处理
}
</n;i++)
如何把结构体数组作为实参传递给函数?
结构数组也是数组,传递结构数组的名称就是传递指针,只要注意新指针指向类型也是同一个结构类型编译器就不会卡你了,给你个我做实验验证指针数组属性的时候写的代码和跑的结果截图你慢慢体会下
里面两个强制转换就涉及到了对底层实现的理解,“类型”这个概念的本质就是告诉程序怎么解释一段内存里的数据,我这里初始化了两个整数,按字节分割每个字节都是可显示的ASCII字符,便于验证。后面把两个整数的地址赋给了一个指向结构体的指针和一个指向结构数组的指针,结合结构体的定义,就是在告诉程序把e这个4字节的内存里的数据解释为4个ASCII字符,g这个8字节内存里的数据解释为2*4个ASCII字符,然后剩下的打印就不需要解释了
数组传给指针,实质上是不可能的,本质上传的是数组首地址,根据偏移来操作数组,这样看起来好像是真在操作数组一样。另外你程序报错是因为输入没有加“&”。
#include
struct student{ int num; char name[20]; int score[3];}stu[30];void input(struct student *p){ int i,j,k; printf("The number of students:");scanf("%d",&k); for(i=0;i
num); printf("Name:");scanf("%s",&(p+i)->name); for(j=0;j<3;j++) { printf("score[%d]:",j); scanf("%d",&(p+i)->score[j]); } }}int main(){ input(stu); return 0;} 还有另一种做法,数组传数组,这个就是做了傻瓜式封装,其实质还是【数组首地址】传给【指针】
#include
struct student{ int num; char name[20]; int score[3];}stu[30];void input(struct student p[]){ int i,j,k; printf("The number of students:");scanf("%d",&k); for(i=0;i
<k;i++) { printf("num:");scanf("%d",&p[i].num); printf("name:");scanf("%s",&p[i].name); for(j="0;j<3;j++)" printf("score[%d]:",j); scanf("%d",&p[i].score[j]); } }}int main(){ input(stu); return 0;}
数组传给指针,实质上是不可能的,本质上传的是数组首地址,根据偏移来操作数组,这样看起来好像是真在操作数组一样。另外你程序报错是因为输入没有加“&”。
void repeat(city *la,char name,int x,int y)
改为:
void repeat(city *la,char * name,int x,int y)
因为char name[10]是数组,而函数的参数为字符,所以调用失败。
结构体数组传给指针,实质上是不可能的,本质上传的是数组首地址,根据偏移来操作数组,这样看起来好像是真在操作数组一样。就和普通指针一样使用,只不过它是结构体数组。
扩展资料:
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
参考资料来源:百度百科-结构体
定义5个元素的struct STUDENT 数组a[5],编写函 数(结构体数组名作为函数参数)下实现如功能:
#include
#include
main()
{
struct STUDENT
{
char name[80];
int age;
float chinese;
float math;
float average;
}a[5];
int i,j,k;
float max;
struct STUDENT temp;
for(i=0;i<5;i++)
{
a[i].average=0;
scanf("%s%d%f%f",a[i].name,&a[i].age,&a[i].chinese,&a[i].math);
a[i].average+=(a[i].chinese+a[i].math)/2;
}
for(i=0;i<4;i++)
{
max=a[i].average;
k=i;
for(j=i;j<=4;j++)
{
if(a[j].average>max)
k=j;
}
if(k!=i)
{
strcpy(temp.name,a[k].name);
temp.age=a[k].age;
temp.chinese=a[k].chinese;
temp.math=a[k].math;
temp.average=a[k].average;
strcpy(a[k].name,a[i].name);
a[k].age=a[i].age;
a[k].chinese=a[i].chinese;
a[k].math=a[i].math;
a[k].average=a[i].average;
strcpy(a[i].name,temp.name);
a[i].age=temp.age;
a[i].chinese=temp.chinese;
a[i].math=temp.math;
a[i].average=temp.average;
}
}
printf("姓名\t年龄\t语文\t数学\t平均分\n");
for(i=0;i<=4;i++)
{
printf("%s\t%d\t%.2f\t%.2f\t%.2f\n",a[i].name,a[i].age,a[i].chinese,a[i].math,a[i].average);
}
return 0;
}
#include
#include
#include
#include
#include
#include
struct STUDENT{ std::string Name; unsigned int Age; unsigned int ReadGrade; unsigned int MathGrade; unsigned int average;};std::vector
sort(std::vector
tmp){ using namespace std; list
T; for (int i = 0; i
<tmp.size(); i++) { tmp[i].average="(tmp[i].ReadGrade" + tmp[i].mathgrade) 2; t.push_back(tmp[i].average); } t.sort(); vector
trans; while (!T.empty()) { for (int i = 0; i
<tmp.size(); i++) { if (tmp[i].average="=" t.back()) trans.push_back(tmp[i]); tmp.erase(tmp.begin() + i); t.pop_back(); break; } return trans;}int main(){ using namespace std; vector
a(5); for (int i = 0; i < 5; i++) { cout << "学生" << i<
> a[i].Name >> a[i].Age >> a[i].ReadGrade >> a[i].MathGrade; } a = sort(a); for(int i = 0;i<5;i++) cout << a[i].Name << ' ' << a[i].Age << ' ' << a[i].ReadGrade << ' ' << a[i].MathGrade << ' ' << a[i].average << endl; system("pause"); return 0;}
c语言中数组名作为函数参数
因为你从主函数传过来之后,是给了a[10]啊,与arrlen无关啊,而且在调用函数时是会给局部变量重新分配内存,但这也只是说原先那个内存消失了,那么内存里面的值也会消失了,就会重新执行rrlen=sizeof(a)/4
函数定义和声明的参数应该是:
int
oid_check(struct
snmp_seq
sp,
struct
rmc1207
*
ramp,
int
buffer_size);
函数调用:
flag=oid_check(sp,
ramp,
buffer_size);
-------------------------------------------------------------------------------
在这里,
ramp
是结构体数组的指针
要将数组长度作为一个参数传给average函数,不能在average函数内部通过int arrLen = sizeof(a) / 4;来计算数组长度。因为float average(float a[10])就相当于float average(float *a) ,所以sizeof(a)恒等于4,sizeof(a) / 4恒等于1。
应该这样:
float average(float a[10],int arrLen) {
float sumSco = 0;
for (int i = 0; i < arrLen; i++)
{
sumSco += a[i];
}
return sumSco / arrLen;
}