C语言结构体、指针和结构体指针的基本操作

一、结构体

结构体就是一些值的集合,这些值称为成员变量。这些成员变量可以是不同数据类型的变量,类似于C++中的“封装”。它是将不同数据类型封装在一个类型中。

1、结构体的声明

声明一个结构体类型的一般形式为:

struct 结构体名
{
成员列表
}//分号不能省略

例如声明一个学生信息的结构体:

struct STUDENT
{
  char name[20];
  int num;
  char sex;
  int age;
  float score;
  char addr[30];
};

2、结构体的定义

与函数声明相同,在结构体声明后的位置,都可以直接使用。一般都是在所有函数前面声明结构体类型,方便调用。结构体定义的方式通常有两种。
(1). 方法一:先声明,再定义
此方法定义的结构体变量通常为局部变量。例如在所有函数前面声明上述学生信息的结构体struct STUDENT,在其后的所有函数中可以定义该结构体变量:

struct STUDENT stud1,stud2;

(2). 方法二:声明的同时进行定义
此方法定义的变量通常为全局变量。例如:

struct STUDENT//此处的结构体类型STUDENT可省略,成为直接定义结构体变量的方式
{
  char name[20];
  int num;
  char sex;
  int age;
  float score;
  char addr[30]; 
}stud1,stud2;

注意:
-只有结构体变量才分配地址,结构体类型的声明不分配空间
-结构体中各成员变量的定义也不分配空间
-结构体变量的声明需要在主函数之上或主函数中声明

3、结构体变量的运算

结构体仅可以进行相互赋值操作,前提是两个结构体变量的结构体类型必须相同。

4、结构体变量的引用

(1). 引用成员变量
结构体变量包含多个成员变量,在引用时只能一个成员一个成员的引用,不能将一个结构体变量作为一个整体进行引用,引用方式为:结构体变量名.成员名
例如:

stud1.num=12345;   //“.”为成员运算符

注意:

  • 如果结构体类型中的成员也是一个结构体类型,则要用若干个“.”,一级一级地找到最低一级的成员,只能对最低级的成员进行操作。
  • 当结构体类型中的成员也是结构体类型时,可以将结构体成员释放出来,例如:
struct AGE
{
   int year;
   int month;
   int day;
};
struct STUDENT
{
  char name[20];
  int num;
  char sex;
  struct AGE birthday;
  float score;
  char addr[30];
};

等同于:

struct STUDENT
{
  char name[20];
  int num;
  char sex;
  int year;
  int month;
  int day;
  float score;
  char addr[30];
};

(2). 引用地址
可以引用“结构体变量成员”的地址,也可以引用“结构体变量”的地址。例如:&stud1.num 和 &stud1。前者表示num成员在内存中的首地址,后者表示结构体变量stud1在内存中的首地址。

注意:

  • 在 C 语言中,结构体变量的首地址就是结构体第一个成员的首地址。所以 &student1 就等于第一个成员 name 的首地址。
  • name 是一个数组,数组名表示的就是数组的首地址。所以 &student1 和 student1.name 是等价的。

但是要注意的是,它们只是表示同一个内存空间的地址,它们的类型是不同的,不能在程序中相互替换。(&student1 是结构体变量的地址 ,是 struct STUDENT* 型的;而 student1.name 是数组名,所以是 char* 型的。)

二、指针

指针表示内存地址,指针变量是存放内存地址的变量,不同类型的指针变量占用相同的存储单元长度(指针在32位平台占用4字节,在64位平台占用8字节)。指针既可以对数据本身进行操作,也可以对存储数据的地址进行操作。

1、指针变量的定义

指针变量的一般定义形式为:type + *。该格式仅表示定义一个指针变量,没有间接取值的含义。

char *pc=NULL;//定义空指针
int *pi=NULL;
float *pf=NULL;
double *pd=NULL;

注意:

  • “=”右侧必须为内存中的数据地址,不可以是变量,也不可以直接用整型地址值。
  • 例如:
int a=20;
int *pi=&a;//取变量a所在的地址
int b[2];
int *pi=&b[0];

2、指针的赋值

int year;    //定义变量
year = 2024; //赋值
int *pi;     //定义指针
pi = &year;  //赋值,取year变量的地址

3、使用指针修改内存位置的内容

举个例子:

int main()
{
  int a = 20;
  int *p  =&a;//定义一个指针p,指向变量a的地址
  *p = 10;//通过指针修改它所指向的地址的内容
  printf("%d\n", a);//此时,a的输出值为10
  return 0;
}

三、结构体指针

1、结构体指针的定义

结构体指针就是指向结构体的指针变量,一般形式为:struct 结构体名 *变量名。例如:

struct stu{    //结构体
  char *name;  //姓名
  int num;     //学号
  int age;     //年龄
  char group;  //所在小组
  float score; //成绩
} stu1 = { “Tom”, 12, 18, ‘A’, 136.5 };
struct stu *pstu = &stu1; //结构体指针

//定义结构体的同时定义结构体指针
struct stu{    //结构体
  char *name;  //姓名
  int num;     //学号
  int age;     //年龄
  char group;  //所在小组
  float score; //成绩
} stu1 = { “Tom”, 12, 18, ‘A’, 136.5 },*pstu = &stu1; //结构体指针

2、获取结构体成员

使用结构体指针获取结构体成员的一般形式有两种:
(1). “.”点形式

   (*pointer).membername

该形式中的括号不能省略,运算符“.”的优先级要高于“*”。
(2). “->”箭头形式

   (*pointer)->membername

"->"是特定用来获取结构体成员的运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值