结构体指针做形参 函数

关于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、是下一个结点的地址。

三、可以看到链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。

四、可以看到,这种链表的数据结构,必须利用结构体变量和指针才能实现。

五、可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。