十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
很简单.
宝清ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
首先,我们定义一个指针是
类型
*
变量名,比如int
*pInt
=
NULL;
我们定义结构体指针也是一样的,
结构体名
*pStruct(C语言:struct
结构体名
*pStruct,
C++:结构体名
*pStruct,
struct一般可以省略),
比如:
#include
#include
struct
stStudent
{
char
szName[10];
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.
newlist()函数有问题:
1、返回类型应该为struct LIST*;
2、返回值不能为函数的局部变量!因为函数里的局部变量是不保存的,随函数调用结束而消失~
改成如下形式,试试看:
struct LIST * newlist ()
{
struct LIST *plist1 ;
plist1=malloc(sizeof(struct LIST));
plist1-last=0;
return plist1;
}
struct LNode{
int data;
struct LNode *next;
}*LinkList; //结构体。
修改为
typedef struct LNode{
int data;
struct LNode *next;
}*LinkList; //结构体。
双指针
C语言结构体传参

小-黯
原创
关注
7点赞·2315人阅读
目录
C语言结构体传参
1. 普通传参
1.1 测试代码
1.2 测试结果
1.3 结果分析
2. 单指针传参
2.1 修改结构体数据
2.1.1 测试代码
2.1.2 测试结果
2.1.3 结果分析
2.2 修改结构体地址
2.2.1 测试代码
2.2.2 测试结果
2.2.3 结果分析
3. 双指针传参
3.1 测试代码
3.2 测试结果
3.2 结果分析
C语言结构体传参
结构体传参包括三种传参方式
普通传参:函数接收到结构体参数后,会复制一份原来的结构体作为形参供函数使用,而函数内的任何操作都是对拷贝结构体的修改,不会影响到原本的结构体变化。
单指针传参:函数接收的是一个结构体的地址,该指针指向的是结构体起始地址,也就相当于传入了结构体内所有变量的地址,函数接收到该结构体指针后,我们就可以根据地址访问结构体中每个变量的真实数据,在函数内对结构体内数据的操作,都会影响到原本结构体内数据的变化
双指针传参:函数接收的是结构体指针变量的地址,因为一级指针代表的是结构体的地址,在函数中能够操作结构体内的数据,则二级指针指向的是结构体的地址,则同理我们可以根据二级指针访问修改结构体的地址
即通过一级指针,对结构体内数据的操作会影响到原本结构体内数据的变化
而通过二级指针,对结构体地址的操作会影响到原本结构体地址的变化,例如为结构体分配空间
tail是一个指针,它指向的内容会因函数内的变化而发生变化,但它本身不会因函数的变化而发生变化。
*s表示变量m本身,对*s的赋值就是对m赋值,所以*s=a[p]是正确的。
请注意,函数fun中的s变量是一个地址,只对该地址进行重新赋值,并不对其所指向的变量m造成影响。所以s=a[p]不改变main函数中m变量的值。
如果把*s=a[p]改为s=a[p],输出会是乱码。这具有很大的迷惑性,使人以为地址的赋值过程出现了问题。实际上,若把m改为全局变量(全局变量中字符串默认为空,int变量默认为0):
#includestdio.h
#includestring.h
#define N 10
typedef struct ss
{
char num[10];
int s;
}STU;
void fun(STU a[],STU *s)
{
int t,p=0;
t=a[0].s;
for(int i=1;iN;i++)
{
if(ta[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p]; //这里是错误的语句
}
STU m;
void main()
{
STU a[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
};
printf("the original data is :\n");
for(int i=0;iN;i++)
{
printf("NO=%s MARK=%d\n",a[i].num,a[i].s);
}
fun(a,m);
printf("the lowest is %s who's score is %d\n",m.num,m.s);
}
输出的将会是the lowest is who's score is 0
这说明变量m的值并未改变过。
事实上,若非要使用符号,正确的方法是使用“引用”:
#includestdio.h
#includestring.h
#define N 10
typedef struct ss
{
char num[10];
int s;
}STU;
void fun(STU a[],STU s)
{
int t,p=0;
t=a[0].s;
for(int i=1;iN;i++)
{
if(ta[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p];
}
void main()
{
STU a[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
},m;
printf("the original data is :\n");
for(int i=0;iN;i++)
{
printf("NO=%s MARK=%d\n",a[i].num,a[i].s);
}
fun(a,m);
printf("the lowest is %s who's score is %d\n",m.num,m.s);
}
这里的意思是“引用”,你可以百度上搜索C++中符号的两个意义。