结构体数组指针作为函数参数,请教ctypes如何实现传入结构体数组指针的参数
结构体数组指针作为函数参数,请教ctypes如何实现传入结构体数组指针的参数详细介绍
本文目录一览: 关于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) ; }
结构体变量的指针能不能做函数形式参数?
结构体变量的指针是不能做函数形式参数的,
因为如果结构体变量的指针,
作为函数形式参数,
那么有些事情可能就不成立了,
如果这些事情不成立的话,
也就是结构体变量的指针,
做了函数形式参数,
是没有任何意义的。
C语言中怎么给一个结构体用scanf进行赋值?
结构体数组指针作为函数参数,通过数组的首地址与偏移量对结构体数组进行scanf的赋值,在函数中通过指针间接访问到其指向的内存。
举例:编写函数,输入5个学号(int),5个姓名(字符串),5个成绩数组(每组三个成绩)(int[3]),依次调用函数
#include
#include
struct student //建立结构体,学号,姓名,3门课的分数
{
int num;
char name[10];
int score[3];
}Stu[5]; //初始化,一共5个学生的数据
void getScore(struct student * p) //函数:向结构体读取分数,一共三门课
{
int i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 3; j++)
scanf_s("%d", (&(p+i)->score[j]));
}
void getNum(struct student * p) //函数:向结构体读取学号
{
int i;
for (i = 0; i < 5;i++)
scanf_s("%d", &(p + i)->num);
}
void getName(struct student * p) //函数:向结构体读取姓名
{
int i;
for (i = 0; i < 5; i++)
scanf("%s", &(p + i)->name);
}
int main()
{
int i, j, average[3] = { 0 }; //average数组储存每门课的平均分
getNum(Stu); //函数调用
getName(Stu);
getScore(Stu);
for (j = 0; j < 3; j++)
{
for (i = 0; i < 5; i++)
average[j] += Stu[i].score[j];
}
for (i = 0; i < 5; i++)
{
printf("num = %d name = %s Score:", Stu[i].num, Stu[i].name); //依次打印学号 姓名
//printf("%d %d %d", Stu[0].score[0],Stu[0].score[1],Stu[0].score[2]);
for (j = 0; j < 3; j++) //打印三门课的分数
printf(" %d", Stu[i].score[j]);
printf("\n");
}
printf("average:");
for (i = 0; i < 3; i++)
printf("%f ", (float)average[i]/5); //打印三门课平均分
printf("\n");
system("pause");
return 0;
}
如:
scanf("%c%c%c",&a,&b,&c);
输入为:
d e f
则把'd'赋予a, ' '(空格)赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。
只有当输入为:def(字符间无空格) 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
扩展资料:1、函数原型
int scanf(const char * restrict format,...);
函数 scanf() 是从标准输入流stdin [1] (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。
函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。
2、返回值
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。如:
scanf("%d %d",&a,&b);函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。
例:使用scanf函数输入数据。
#include
int main(void)
{
int a,b,c;
printf("Give me the value of a,b,c seperated with whitespaces:\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
注意:&a,&b,&c中的&是寻址操作符,&a表示对象a在内存中的地址,是一个右值。变量a,b,c的地址是在编译阶段分配的(存储顺序由编译器决定)。
如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。
参考资料:
百度百科——scanf(计算机语言函数)
关于C语言结构体指针做函数形参的问题
fun函数的第二个参数之所以用指针,就是为了能把函数里面对这个参数做的改动保存下来
而你如果把*s=a[p];改成s=&a[p];效果相当于,改了s的值,使其不再指向参数(函数
外部变量
m)的地址,虽然*s的值是正确的,但实际m的值则没有改变,所以在外面输出的时候,结果和预期不一致了
s=&a[p];这个操作本身没有问题
a[p]是个数组,在计算机里面存储的就是他的地址,用&再在他地址的基础上在取地址明显是会报错的。
在c语言里面数组都是存的首地址,所以数组和指针有的时候是可以互换的,&是取地址符号,数组里面本就已经是地址了在用&肯定回有问题的
结构体数组怎么在函数中作形参?
作为形参(指针或不定界的数组)当然可以。
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语言中的结构体二维数组做参数问题
1、如果在函数外定义的结构数组,又要在一个函数中进行输入、输出,通常情况下,其参数传递类型需要传址,即
void shuchu(struct std **cansu);
void shuchu(struct std *cansu[]);
这样调用改为 shuchu(&aa);
对函数内的相应操作改为指针操作即可。
2、通常情况下,对于一个系统设计而言,其输入输出是分开的,也即在2个函数中,从系统分析而言,建议分开。当然,就测试而言,是可以的。
3、如果一定要采用2维数组做参数,按照对于多维数组做参数的要求,前几维一定要给出确切的数值
如2维: void shuchu(struct std cansu[5][]) 就可以了。
C语言里 用指针或者数组名做函数参数时,在被调用的函数体里 为什么有时候在参数或者指针前面加有的不用
为什么要加*,一个是指针,一个是数组,消息来自华夏联盟
第一个程序:a是指向结构体s[0]的指针,a[0]...a[i]就是第0-i个结构体,a[i].s表是结构体中s域;
a[i].s; (*(a+i)).s; (a+i)->s 3个的值是相等的;意思就是当定义一个结构体指针STREC *p_str后,把地址p_str起始的内容结构体化,同时(p_str+1)也是一个指向结构体类型STRECD的指针
其指向的地址为p_str的地址+sizeof(STREC)
sizeof(STREC) = 10(num[10])+2(为了对齐 凑成3*4)+4(int s) = 16byte
贴一段代码,在vc++6.0上跑的
#include
#include
typedef struct
{
char x[10];
int y;
}str;
void func(str *m,str *n);
void main()
{
str m[16]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},
{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}};
str *n;
n = (str *)(&m); //&m为一个void型指针,(str *)将其强制类型转换
func(m,n);
system("pause");
}
void func(str *m,str *n)
{
int i;
for(i=0; i<16; i++)
{
printf("%d ",m[i].y);
printf("%d ",(*(m+i)).y);
printf("%d\n",(m+i)->y);
}
printf("%x",n);
printf("%x",n+1);
}
第二个程序
a是指向s[0]的指针,你的意图应该是给数组s[81]赋值;显然*(a+i) == s[i];
*(a+i)也能写成a[i];
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语言.定义一个函数实现交换两个整数的功能,(用指针做函数参数)。
C语言.定义一个函数实现交换两个整数的功能,(用指针做函数参数)。 #include
void swap(int *p,int *q)
{ int t;
t=*p; *p=*q; *q=t;
}
main()
{ int a=5,b=4,*p,*q;
p=&a; q=&b;
swap(p,q);
printf("a=%d b=%d",a,b);
return 0;
}
..
C语言 指针做函数参数 的优点
首先你要认识函数传参是怎么进行的
函数传参是复制形的,举个例子说:
void modify(int a)
{
a++;
}
void main()
{
int a=5;
modify(a);
printf("%d",a);
}
这个程序的答案还是5。为什么?
因为当调用modify(a)时,在执行modify函数时,是另外开辟了一个内存空间,将main中a的值复制过来,modify函数中所有的操作都是相对于这个新开辟的内存空间而言的,对原来的a没有任何改变。
现在就来说说指针,如果用指针传参的话那就完全不一样了,指针(pointer),说白了即是指向变量内存地址。同样上面的例子:
void modify(int * a)
{
(*a)++;
}
void main()
{
int a=5;
modify(&a);
printf("%d",a);
}
这个答案当然是6
因为你传进去的是a的地址,所以在modify函数中的操作都是对a地址上的内容进行操作,即是操作a所以modify函数不用返回这个数,main中a的值也会改变。因为大家都是操作同一个内存空间,而上面不用指针,modify操作的是另一个新开辟的内存空间,只是这个内存空间初始值和a一样。
现在来说说传参,其实你“为什么函数参数是字符串的多用指针?” 那句我不是很明白,C中的字符串传参好像就指针一种形式(除非用结构体)。
何时用指针,何时用拷贝。当传的参数是一个结构体,而这个结构体比较大,这时最好用指针,因为如果用拷贝的话,单单花在拷贝的时间就要浪费很多,而如果这个函数经常被调用,那么这效率问题就出现了。
你在子函数中要对你的主调用函数中变量进行操作时也可以用指针做参数,这样子函数就可以不用return 如果不是用指针的话,就要再子函数的未尾加上一条return x;把这个数返回当返回值。
多看点书,多写点程序,刚开始学都会对指针比较迷茫。写多了,自然而然就懂了。
c语言中如果函数的参数不用指针而用整数能否实现值交换?
不能
解释:
1.就像是 你复印了一份文件, 对复印的文档进行修改 那么你的原文档上面能有改动吗?
C语言; 编写一个函数,用指针方法实现功能
int find(char* source/*源串*/, char* target/*子串*/)找到返回在源串中的位置,未找到返回-1,如果要改为找到返回1,把return i改为return 1;{ int i,j; int s_len=strlen(source); int t_len=strlen(target); if(t_len>s_len) { return -1; } for(i=0;i<=s_len-t_len;i++) { j=0; int flag=1; if(source[i]==target[j]) { int k,p=i; for(k=0;k
<t_len;k++) { if(source[p]="=target[j])" p++; j++; continue; } else flag="0;" break; if(flag="=1)" return i; -1;}
C语言,用指向函数指针的知识实现两个函数求和的功能
两个函数求和?是两个数求和的函数吧!
int add(int a, int b){ return a+ b;}
int main()
{
int sum;
int (*fn)(int , int );
fn = add;
sum = fn(3,5);
}
利用指针作函数参数,设计一函数实现将n个元素进行排序
将这n个元素存在数组里,然后用指针类型参数接收即作为形参,然后采用排序算法对这些元素进行排序即可
C语言,编写一函数,其功能是求一个长整数各位数字之和。要求使用指针函数实现
其功能是求一个长整数各位数字之和:
int function(long l){
int sum = 0;
String s = l+"";把长整数转成字符串
for(int i=0;i
<s.length();i++){
sum +=Integer.ValueOf(s.charAt(i));
}
return sum;
}
c程序,使用指针作为函数参数,编写函数实现两个字符串连接
char *mycat(char *a,const char *b){ char *t; if(!a || !b) return NULL; t=a; while(*a) a++; while(*a++=*b++); return t;}
编一个函数sort,使10个整数按升序排列,在main函数中输入这10个数,并输出排好序的数,函数参数用指针实现
#include
void sort(int *a,int n)
{
int i,j,temp;
for(j=0;j
<n;j++)
for (i=0;i
<n-j-1;i++)
if (a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
void main()
{
int i,j,temp;
int a[10];
for(i=0;i<10;i++)
scanf ("%d,",&a[i]);
sort(a,10);
for(i=0;i<10;i++)
printf("%d ",a[i] );
printf("\n");
}
c语言编程:用指针变量作函数参数求三个数和
#include "stdafx.h"#include "process.h"double getsum(double *a, double *b, double *c);声明函数 参数为double类型的指针int main(int argc,char* argv[]){double *sum=new double;*sum = 0;double x = 1.33332;double y = 2.1;double z = 6.4;*sum=getsum(&x, &y, &z);用变量地址做参数调用函数printf("%g\n",*sum);delete sum;释放空间sum = NULL;system("pause");return 0;}double getsum(double *a, double *b, double *c){ return (*a +*b+ *c );}
</n-j-1;i++)
</n;j++)
</s.length();i++){
请教ctypes如何实现传入结构体数组指针的参数
直接将函数参数,定义为结构体指针类型即可。
然后传入对应结构体数组名,或者结构体变量的地址。
比如
struct test {int a;};
struct test t[100];
定义
void func(struct test *p){}
调用
func(t);