C语言基础之结构体四

171 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第五天,点击查看活动详情

结构体与共用体

前言

接上篇,继续学习结构体与共用体~

知识点5--指向结构体类型数据的指针

  • 一个结构体变量的指针就是该结构体变量所占据的内存段的起始地址。

  • 可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。

  • 指针变量也可以用来指向结构体数组中的元素。

  • 结构指针变量说明一般形式为:

    struct 结构名 *结构指针变量名
    

    例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为:

    struct stu *pstu
    

    当然也可以在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构指针变量也必须要先赋值后才能使用。

  • 赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。

    如果boy时被说明为stu类型的结构变量,则:

    pstu = &boy;//是正确的!
    pstu = &stu;//是错误的!
    

    这是为什么呢???

这是因为结构名和结构变量是两个不同的概念,不能混淆。

  1. 结构名只能表示一个结构形式,编译系统并不对它分配内存空间。

  2. 只有当某变量说明为这种类型的结构时,才能对该变量分配存储空间。

  3. 因此上面&stu这种写法时错误的,不可能去取一个结构名的首地址。有了结构指针变量,就能更方便地访问结构变量的各个成员。

    其访问的一般形式为:

    (*结构指针变量).成员名
    或
    结构指针变量->成员名
     
    例如:
        (*pstu).num
    或者
        pstu->num
    
  • 结构指针变量做函数参数

将一个结构体变量的值传递给另一个函数,有三种方法:

  1. 用结构体变量的成员作参数

  2. 用结构体变量作实参

  3. 用指向结构体变量(或数组)的指针做实参,将结构体变量(或数组)的地址传给形参

  • 用一个例子来更好理解一下吧!

题目要求:有一个结构体变量stu,内含学生学号、姓名和3门课程的成绩,通过调用函数print中将他们输出

/**
 * 法一:用结构体变量做函数参数 
 **/
 
 #include<stdio.h>
 #include<string.h>
 
 struct student{
 	int num;
 	char name[20];
 	float score[3];
 };
 
 void print(struct student);
 
 int main(){
 	struct student stu;
 	
 	stu.num = 8;
	strcpy(stu.name,"Yummy"); //stu.name = "Yummy";不可以这样 
 	//会报错:不兼容的类型赋值'const char[6]'到'char [20]'
 	//数组的话只能在初始化时整个赋值 例如stu.name[] = ``` 
 	stu.score[0] = 98.5;
 	stu.score[1] = 99.0;
 	stu.score[2] = 100.0;
 	
 	print(stu);
 } 
 
 void print(struct student stu){
 	printf("\tnum     :%d\n",stu.num);
 	printf("\tname    :%s\n",stu.name);
 	printf("\tscore_1 :%5.2f\n",stu.score[0]);
 	printf("\tscore_2 :%5.2f\n",stu.score[1]);
 	printf("\tscore_3 :%5.2f\n",stu.score[2]);
 	printf("\n");
 }
/*法二:改用指向结构体变量的指针做实参*/

 #include<stdio.h>
 #include<string.h>
 
 struct student{
 	int num;
 	char name[20];
 	float score[3];
 };
 
 void print(struct student *);
 
 int main(){
 	struct student stu;
 	
 	stu.num = 8;
	strcpy(stu.name,"Yummy"); //stu.name = "Yummy";不可以这样 
 	//不兼容的类型赋值'const char[6]'到'char [20]'
 	//数组的话只能在初始化时整个赋值 例如stu.name[] = ``` 
 	stu.score[0] = 98.5;
 	stu.score[1] = 99.0;
 	stu.score[2] = 100.0;
 	
 	print(&stu);
 } 
 
 void print(struct student *p){
 	printf("\tnum     :%d\n",p->num);
 	printf("\tname    :%s\n",p->name);
 	printf("\tscore_1 :%5.2f\n",p->score[0]);
 	printf("\tscore_2 :%5.2f\n",p->score[1]);
 	printf("\tscore_3 :%5.2f\n",p->score[2]);
 	printf("\n");
 }

声明

小编是跟着b站上的小甲鱼视频学习的,希望每天都能进步一点点!!

链接附上:C语言学习之小甲鱼视频链接