【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:} 打算学习Java先谢谢了 楼主的精神值得赞扬!!! 学习了结构体{:1_927:} 感谢大家支持!!!我会坚持下去的{:301_998:} 谢谢楼主分享,学习了。 非常感谢,楼主辛苦了, C语言的结构体和指针好难的啊,特别是指针,要崩溃了 certainMreleven 发表于 2017-4-3 19:42
C语言的结构体和指针好难的啊,特别是指针,要崩溃了
多看看吧,我也是刚刚学习。感觉郝斌老师的还不错,讲的挺清晰的 楼主总结的很完善,待到以后学习C++的类时会很轻松的:lol
页:
[1]