SupKevin 发表于 2017-3-28 17:13

【C语言笔记】结构体

本帖最后由 SupKevin 于 2017-4-4 17:13 编辑

1.   结构体是什么         结构体:把一些基本的数据类型,整合到一起,组成的一个新的复合数据类型

# include <stdio.h>
struct Student
{
         int age;
         floatscore;
         charsex;
};
int main(void)
{
         structStudent st = {80,66.4,'F'};


         return0;
}

//在本例中,struct Student 可以把其理解为一种由基本数据类型组合而成的
的一种新的数据类型, st 则是可以理解为是结构体中的的有其他基本类型
变量所构成的一种新的 变量;
2.为什么需要结构体
         为了表示一些复杂的事物,而普通的基本类型无法满足实际要求。
3.如何定义结构体
三种方法:
一.
structStudent
{
         intage;
         floatscore;
         charsex;
};
二.
struct Student
{
         intage;
         floatscore;
         char sex;
}st2;//直接从这里定义变量名
三.
struct     //不定义名字也能使用
{
         int age;
         float score;
         char sex;
};
小结:
         从这三种方式中,我们最常用的方法是第一种,如果用第二种则是会只能定义一次,下次如果还想调用此结构体,那么必须要再写个结构体,第三种方法虽然可行,但是没有“结构体的名字”如果程序所用到的结构体比较多的话,那么就会很乱,就会导致别人看不懂你写的结构体是表示什么功能。
4      .如何使用结构体
      1.   结构体的赋值和初始化
定义的同时可以整体赋初始值;
如果定义完之后,则只能单个的赋值。
例如:
# include <stdio.h>
struct Student
{
   intage;
   floatscore;
   charsex;
};
int main(void)
{
struct Student st = {80,66.4,'F'}
//这个地方一定不要写成了struct st或者是st,自己多加注意
   struct Student str;//注意的地方和上面一样!!@@!
str.age = 34;
   str.score= 45.5;
   str.sex= 'M';
   printf("%d%f %c\n",str.age ,str.score ,str.sex );
   printf("%d%f %c\n",st.age ,st.score ,st.sex );


   return 0;
}

2017/3/25
如何取出结构体变量中每一个成员1.   结构体变量名.成员名2.   指针变量 –> 成员名


struct Student
{
   intage;
   floatscore;
   charsex;
};
此段代码表示的是只是定义了一种新的数据类型,并没有定义变量!
struct Student st = {80,66.4,'F'} //这里的“st”可以说才struct Student 这个新的数据类型的 “新的变量”。下面就会用到;

# include <stdio.h>
struct Student
{
   intage;
   floatscore;
   charsex;
};
int main(void)
{
   structStudent st = {80,66.4,'F'};
struct Student str;
   structStudent st3;//定义指针变量
struct Student * pst3 = &st3;//给指针变量赋st3 的地址;
   str.age= 34;
   str.score= 45.5;
   str.sex= 'M';
   pst3->age= 88;
   pst3->score= 45.6;
   pst3->sex= 'M';
   printf("%d%f %c\n",str.age ,str.score ,str.sex );//这便是三种方式,以后用指针
   printf("%d%f %c\n",st.age ,st.score ,st.sex ); //变量的方式会比较多,但是指
   printf("%d%f %c\n",pst3->age,pst3->score,pst3->sex);//针变量必须要先定义。


   return0;
}
三种方法的比较;
1.   第一种方法,直接赋初始值,思路相对简单,输出时也是只要“变量名.内容”就能完成;
2.   第二中方法,首先先定义好变量,然后再给变量中的各个元素赋值,最后也是以 变量名.内容的形式输出,思路略微复杂;
3.   第三种方法,和第二种方法差不多,先定义变量,然后用”变量名->内容”的方式赋值,并且最后以此种方式输出;
小结:
1.   pst3 –>age 在计算机内部会被转化成(*pst3).age,这就是->的含义,也是一种硬性的规定;
2.   所以 pst3->age 等价于(*pst3).age,也等价于st3.age;
3.   我们之所以知道pst3->age等价于st3.age,是因为pst3->age是被转化成了(*pst3).age来执行了;
4.   pst 3-> age的含义:
      pst3 所指向的那个结构体变量中的age这个成员
2017/3/27
结构体变量和结构体指针变量作为函数参数传递的问题
         1.推荐使用结构体指针变量作为函数参数来传递
# include<stdio.h>
# include<string.h>
structStudent
{
         char name;
         char sex;
         int score;
};
intmain(void)
{
         void Inputstudent(struct Student *pstu);//函数的声明
void Outputstudent(struct Studentss); //函数的声明
struct Student st;                                       //定义struct Student 类型的变量 st
Inputstudent(&st);             //一定是取st的地址
Outputstudent(st);                //只是简单输出,没改变内容,则不需要&
return 0;
}
void Inputstudent(struct Student * pstu) //定义输入函数
{
         //strcpy((*pstu).name,"张三");这里和下面的用法是等价的
strcpy(pstu->name,"张三");    //这里字符串处理上用到strcpy函数,老师说以后讲,我也很绝望啊!!!
pstu->sex = 'F';
         pstu->score = 87;


}
void Outputstudent(struct Student ss)     //定义输出函数
{
printf("%s %c %d\n",ss.name,ss.sex,ss.score);
}
通过上面的例子我们可以知道的以下的方法和技巧:
小结:


1. strcpy(pstu->name,"张三");      //这里字符串处理上用到strcpy函数,老师说以后讲,我也很绝望啊!!!,这个地放老师说以后讲,我也不知道他什么时候讲。。。就先这样吧哈。
2. Inputstudent(&st);               //一定是取st的地址
Outputstudent(st);                //只是简单输出,没改变内容,则不需要&符号,这两个的区别在于Inputstudent 函数的作用是改变了st的值,所以要用到取原来st变量的地址,老师呢,也是强调过很多次的不是,改变形参的值,是不能改变实参的值的,当然了如果函数有了返回值,则是另当别论了(其实只是把一个函数的最终值传递给了main函数,形参和实参的值依然是没有影响的),然而Outstudent函数只是作为“输出功能”所以这里用指针和不用指针效果是一样的(本质是并没改变原来实参的值)。
3.这个程序体现了 指针 具有快速更改和传递数据的优点。
4.在这节课中还复习了指针是指向地址问题,无论指针是指向的多少字节,指针变量只占4个字节。指针变量前面的数据类型确定了指针所指向变量的数据类型,即 指针变量的数据类型和他所指向变量的数据类型是完全一致的。
2017/3/28
void Outputstudent(struct Student ss)     //定义输出函数
{
printf("%s %c%d\n",ss.name,ss.sex,ss.score);
}
由上面的例子也说明了,这个函数,既可以直接输出,uefa可以通过指针传递地址的方式输出,下面来比较两种方法:
         如果直接输出的话,对于变量 st 所占的字节数是108 ,通过sizeof(st)函数即可实现,但是如果是指针的话,只是4 个字节,这就体现了指针的高效性。但是也同样是有着一定的缺点,这样虽然加快了程序的执行速度和减少了内存的占用,但是却是“不安全”的,因为输出的内容也能随时改变!!!
复习指针的重要性
1.   表示一些复杂的数据结构
2.   快速的传递数据,减少了内存的耗用【重点】
3.   使函数返回一个以上的值【重点】
4.   能直接访问硬件
5.   能够方便的处理字符串
6.   是理解面向对象语言中引用的基础上上面的例子中,通过Outputstudent函数就可以实现了利用指针来传递数据的问题,使所占内存减少,程序的执行效率提高;
其中,在Inputstudent函数中,随意的更改st 变量的值,也是通过指针的第三个特点:可使函数发挥一个以上的值;

结构体变量的运算
结构体变量不可以相加,不可以相乘,不可以相减,不可以相除;
但是可以相互赋值。


static/image/hrline/2.gifhttp://www.52pojie.cn/static/image/hrline/2.gifhttp://www.52pojie.cn/static/image/hrline/2.gif




最后希望大家评下分,大恩不言谢!告辞!!{:301_986:}

骑狗的猴子 发表于 2017-3-28 18:07

打算学习Java先谢谢了

xqlecnu 发表于 2017-3-28 18:40

楼主的精神值得赞扬!!!

netbox 发表于 2017-3-28 19:04

学习了结构体{:1_927:}

SupKevin 发表于 2017-3-28 20:50

感谢大家支持!!!我会坚持下去的{:301_998:}

xiyou2015 发表于 2017-4-3 16:39

谢谢楼主分享,学习了。

邪梦 发表于 2017-4-3 18:32

非常感谢,楼主辛苦了,

certainMreleven 发表于 2017-4-3 19:42

C语言的结构体和指针好难的啊,特别是指针,要崩溃了

SupKevin 发表于 2017-4-3 23:06

certainMreleven 发表于 2017-4-3 19:42
C语言的结构体和指针好难的啊,特别是指针,要崩溃了

多看看吧,我也是刚刚学习。感觉郝斌老师的还不错,讲的挺清晰的

霓裳舞朝阳 发表于 2017-4-4 15:43

楼主总结的很完善,待到以后学习C++的类时会很轻松的:lol
页: [1]
查看完整版本: 【C语言笔记】结构体