结构体
我们知道c语言中有多种数据类型比如 int char float 等数据类型,我们可以给一个变量或者数组给定同一类型的数据。
而在结构体中允许用户自定义一个可以存放多种数据类型的成员变量,这就是一种自定义的数据类型–结构体。
具体来看一下结构体
声明结构体
struct tag //结构体名称
{
member-list; //成员变量
}variable-list;//结构体变量
定义结构体
先来看一下结构体的形式:
struct Student -->结构体名称 struct Student
{ //在没有重定义之前 必须使用完整的结构才能对结构体进行访问
char name[20];//定义的成员变量
int age;
//结构体内多种数据类型
}; //分号不能少
那么如何定义结构体变量呢?有两种:
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
这里如果我们把整个结构体看作一个数据类型那么 (struct Point) p2 可以理解为 定义一个(struct Point) 类型的 变量p2;
结构体中的变量赋值、访问
那么结构体中的赋值和访问应该如何进行呢?先来看一段代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Student//重定义为 Student 定义结构体变量就可以直接使用 Student 定义
{
char name[20];
int age;
char tell[11];
}Student ;
Student ps;//定义变量
void Print(Student*ps)
{
printf("%s %d %s\n",ps->name,ps->age,ps->tell);//通过 " -> "来访问结构体内的成员变量
printf("\n");
printf("%s %d %s\n",(*ps).name,(*ps).age,(*ps).tell);//或者通过解引用来访问
}
int main()
{
strcpy(ps.name,"张飞");//通过strcpy来给成员变量赋值
ps.age=20;
strcpy(ps.tell,"12345676789");
Print(&ps);
printf("\n");
{
struct p1
{
char* name;
int age;
char* tell;
}ps1;
//也可以定义变量然后直接赋值 struct p1 ps2 {"张飞",20,"123456789"};
struct p1 ps2 {"张飞",20,"123456789"};
ps1.age=20;
ps1.name="关羽";
ps1.tell="12345678912";
printf("%s %d %s\n",ps1.name,ps1.age,ps1.tell);
printf("%s %d %s\n",ps2.name,ps2.age,ps2.tell);
}
system("pause");
}
看一下运行结果:
操作符 " . " 和 " - >" 定义:
" . " 访问结构成员
" - >" 访问结构指针成员
" . " 和 " - >"的区别
首先我们来看这两部分
1.
ps1.age=20;
ps1.name=“关羽”;
ps1.tell=“12345678912”;
strcpy(ps.name,“张飞”);
ps.age=20;
strcpy(ps.tell,“12345676789”);`
这里当定义的是一般的结构体时,用 " . " 就可以对结构体进行赋值和访问,在这里注意当定义的是字符数组时就需要使用 strcpy 来进行赋值
2.
void Print(Student*ps)
{
printf("%s %d %s\n",ps->name,ps->age,ps->tell);
printf("%s %d %s\n",(*ps).name,(*ps).age,(*ps).tell);
}
这里我们看到这里使用了结构体传参,传了一个结构体指针过来,那么在访问成员变量的时候就要进行解引用 那么就必须用 " - >" 或者 " * " 来进行访问。
那么当定义的是指针类型的而且还需要传参的话应该如何赋值和访问呢?
下来看一段代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Student
{
char* name;
int age;
char* tell;
}Student ;
Student ps;
void InsertAndPrint(Student*ps)
{
ps->name="张飞";
ps->age=20;
ps->tell="15339257765";
printf("%s %d %s\n",ps->name,ps->age,ps->tell);
}
int main()
{
InsertAndPrint(&ps);
system("pause");
return 0;
}
运行结果:
或者通过解引用:
验证可以通过 - > 或者 " * " 和 " . " 来进行赋值。