结构体变量的使用
赋值和初始化
- 定义的同时可以整体赋初值
- 定义完成后,只能单个的赋初值
如何去除结构体变量中的每一个成员
- 结构体变量名.成员名
- 指针变量名->成员名
指针变量名->成员名 在计算机内部会被转化成 (*指针变量名).成员名
例子
第一种方式初始化
#include <stdio.h>
struct student{
int age ;
float score ;
char sex;
};
int main ()
{
struct student st1={80,55.5,'F'}; //定义的同时初始化
struct student st2; //定义完之后在初始化
st2.age=10;
st2.score=44.2;
st2.sex='f';
printf("%d %f %c\n",st1.age,st1.score,st1.sex);
printf("%d %f %c",st2.age,st2.score,st2.sex);
return 0 ;
}
第二种方式初始化
#include <stdio.h>
struct student{
int age ;
float score ;
char sex;
};
int main ()
{
struct student st={55,22.2,'F'};
struct student *p = &st2;
p->age = 88 ; //p->在计算机内部会被转化成(*p).age (硬性规定)
// p->age 等价于 (*p).age 等价于 st.age
p->score = 77.7;
p->sex = 'F';
printf("%d %f %c",p);
return 0 ;
}
总结
- p->age 在计算机内部会被转化成(*p).age 这是一种硬性规定
- p->age 等价于 (*p).age 等价于 st.age
- 所以我们知道p->age 等价于 st.age 是因为p->age 被转化成了(*p).age来执行
结构体变量和结构体变量指针作为函数参数传递的问题
调用函数时发送地址还是发送内容
示例
#include <stdio.h>
#include <string.h>
struct student {
char name[10];
float score ;
char sex ;
};
void Inputstudent(struct student *p_1);
void Outputstudent(struct student p_2);//值传递输出
/*
要是在函数内部进行输出既可以选择通过
地址来输出,也可以同过值传递(拷贝)
来进行输出。
*/
int main()
{
struct student stu;
Inputstudent (&stu); //对结构体变量的输入
/*
输入时 只能发送stu的地址(即 Inputstudent(&stu)),
不能发送stu本身(即 Inputstudent(stu)),因为在
函数中“值的传递 ”等待该函数运行结束后形参所接受的
实参(即实参的一个拷贝)会自动释放掉。传递地址不会出
现这种情况。
*/
Outputstudent (stu); //对结构体变量的输出
/*
通过地址来输出时,需要将stu的地址发送给*p_2
Outputstudent (&stu);
*/
return 0 ;
}
void Inputstudent (struct student *p_1)
{
strcpy(p_1->name,"严乐");
p_1->score = 55.2 ; // 或者 (*p_1).score 或者 stu.score
p_1->sex = 'F';
}
void Outputstudent (struct student p_2)//值传递输出(在函数内部进行输出)
{
printf("%s %f %c\n",p_2.name,p_2.score,p_2.sex);
}
/*
通过地址传递来输出(发送stu内容中前四个字节的地址给*p_2)
void Outputstudent (struct student *p_2)
{
printf("%s %f %c",p_2->name,p_2->score,p_2->sex);
}
*/
最好使用结构体指针变量作为函数参数来传递结构体变量的运算
结构体变量的运算
struct student {
int a ;
};
int main (void)
struct student stu1,stu2;
st1 + st1 st1*st2 st1/st2 //错误
st1 = st2 st2 = st1 //正确
int main ()
- 冒泡排序
#include <stdio.h>
void sort(int *pArr , int len);
int main (void)
{
int a[5] = {10,2,33,-1,2};
int i ;
sort (a , 5);
for(i = 0 ; i < 5 ; i ++)
printf("%3d",a[i]);
return 0 ;
}
void sort(int *pArr , int len)
{
int i , j , t ;
for(i = 0 ; i < len - 1 ; i ++)
for (j = 0 ; j < len-1-i ; j ++)
{
if(pArr[j] > pArr[j+1])
{
t = pArr[j+1];
pArr[j+1] = pArr[j];
pArr[j] = t ;
}
}
}