关于C语言结构体指针做函数形参的问题
fun函数的第二个参数之所以用指针,就是为了能把函数里面对这个参数做的改动保存下来
而你如果把*s=a;效果相当于,改了s的值,使其不再指向参数(函数
外部变量
m)的地址,虽然*s的值是正确的,但实际m的值则没有改变,所以在外面输出的时候,结果和预期不一致了
s=&a;这个操作本身没有问题
指向结构体的指针作函数参数
很简单.
首先,我们定义一个指针是
类型
*
变量名,比如int
*pInt
=
NULL;
我们定义结构体指针也是一样的,
结构体名
*pStruct(C语言:struct
结构体名
*pStruct,
C++:结构体名
*pStruct,
struct一般可以省略),
比如:
#include
#include
struct
stStudent
{
char
szName;
int
nID;
};
void
Print(stStudent
*pStd)
{
printf(“Name:%s\n“,
pStd-》szName);
printf(“ID:%d\n“,
pStd-》nID);
}
void
InitStudent(stStudent
*pStd)
{
strcpy(pStd-》szName,
“CIW“);
pStd-》nID
=
14;
}
int
main()
{
stStudent
stStd;
InitStudent(&stStd);
Print(&stStd);
return
0;
}
C语言请加struct.
C语言中如何以结构体变量的地址作为函数形参,以便将指向结构体变量的指针传递给它
C语言中,所有的变量都存储在内存中,可以通过&运算符获得变量的内存地址,函数调用时,只需要把普通变量前加上&符号,就可以达到传递变量地址的目的。
例如:
定义一个结构体类型
struct Yearmonthday
{
int year, month, day;
};
定义相关函数,参数类型指定为结构体类型指针
void input(struct Yearmonthday *p1) //函数形参p1是结构体指针类型
{
printf(“请输入年,月,日:“);
scanf(“%d,%d,%d“,&p1-》year,&p1-》month,&p1-》day);
}
在主函数中定义一个结构体变量,调用相关函数,传递变量地址
int main()
{
struct Yearmonthday ymd;
input(&ymd); //传递变量地址,以便带回数据
printf(“date=%d/%d/%d\n“, ymd.year, ymd.month, ymd.day ); //输出结果
return 0;
}
指向结构体的指针应该怎么理解
当一个指针变量指向结构体时,我们就称它为结构体指针。注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,所以给 pstu 赋值只能写作:
struct stu *pstu = &stu1;
而不能写作:
struct stu *pstu = stu1;
还应该注意,结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。
下面的写法是错误的,不可能去取一个结构体名的地址,也不能将它赋值给其他变量:
struct stu *pstu = &stu;
struct stu *pstu = stu;
扩展资料
结构体指针作为函数参数
结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。
如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。
调用中采用的结构体变量。在传入函数时通过指针void *para指针传递过去。需要注意的是不能直接使用para-》a来访问结构体的成员。
这是因为para只是接收过来的地址。para虽然指向的结构体的首地址。但是这个指针并不知道自己指向的是什么内容和有多少成员。需要(date *)para强制转化一下。这样para就可以知道自己是什么类型的指针。有多少成员。
自己写的*.dll用结构体指针做形参把调用结果结构体数组数据传递出来,为什么数据总出错
可以用返回值传递 来解决。
或是传进去一个结构体的引用。
把需要传出的信息,复制到传入的形参指针所对应的内存中。
结构体变量的指针能不能做函数形式参数
结构体变量的指针是不能做函数形式参数的,
因为如果结构体变量的指针,
作为函数形式参数,
那么有些事情可能就不成立了,
如果这些事情不成立的话,
也就是结构体变量的指针,
做了函数形式参数,
是没有任何意义的。
结构体指针作为函数参数
struct ceshi
{
int data;
};
void chage(struct ceshi *p);
void main()
{
struct ceshi *shuju;
shuju=(struct ceshi *)malloc(sizeof(struct ceshi));//要给结构体数据开辟一个存储空间
shuju-》data = 12;
chage(shuju);
printf(“%d\n“, shuju-》data);
system(“pause“);
}
void chage(struct ceshi *p)
{
p-》data = 1000;//这里是指针变量传递进来,不是它自己的地址传递进来
}
//这样就OK了
结构体数组怎么在函数中作形参
作为形参(指针或不定界的数组)当然可以。
struct student{
char name;
int point;
}; // 有分号,别漏了
struct student stu1; // 你声明的是全局量
void fact(struct student *stu1, int n){
参数传递,最好再加一个数组元素个数参数
};
main()
{
fact(stu1,20); // 调用
return 0;
}
—
作为全局量也可以。
void fact(){…} — 无参数
fact(); // 调用也无参数
—
结构体指针作为形参
dengji((struct chengji*)nanzu,renshu);
编译器强类型检查表明你的指针类型实参与形参不匹配,需强制转换成(struct chengji*)类型.
结构体指针与结构体变量用作函数参数时有什么区别,在用法上
结构体指针与结构体变量用作函数参数区别:
(1)结构体指针作为函数参数时,调用时传递的是指向一个结构体变量的指针(即结构体变量的地址);结构体变量作为函数参数时,调用时传递的结构体变量本身。
(2)以下代码显示了调用时的区别
#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\“, p.x, p.y);
/* 调用 fun2:取p的地址作为参数 */
fun2( &p);
printf(“x=%d, y=%d\“, p.x, p.y);
}
程序的输出为:
x=100, y=200
x=110, y=210
(3)观察上面程序运行的结果发现 fun1函数执行后,p并没发生变化;而调用fun2后,p却改变了。这是因为:调用fun1时,所传递的参数p被复制到调用堆栈中,fun1函数所操作是堆栈中的变量而不是原来的那个变量(main中的p);另一方面,调用fun2时,传入的p的地址,fun2通过地址,修改了main中的变量p。这是结构体指针与结构体变量用作函数参数最大的区别。
一个结构体A,当它的指针作为参数传入函数func,那么在func中可以通过指针改变结构体的值,函数返回后,结构体的值被改变; 但是,当结构体变量作为参数传入函数func时,在func函数中即使对他进行了修改,当函数返回时,结构体本身并没有改变,因为修改的只是他的一个副本。
扩展资料
一、用结构体变量和指向结构体变量的指针构成链表
1、链表是一种常见的重要的数据结构。
2、链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。
二、链表中的每一个元素称为“结点”,每个结点都应包括两个部分:
1、是用户需要用的实际数据,
2、是下一个结点的地址。
三、可以看到链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。
四、可以看到,这种链表的数据结构,必须利用结构体变量和指针才能实现。
五、可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。