黑马程序员——C语言基础---结构体
2015-10-26 20:39
176 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、概念
结构体是一种构造类型,它是由若干个成员组成的,每一个成员可以是一个基本数据类型或者又是一个构造类型。结构体可以把功能相同的数据组织起来,存在一起,用的时候方便,而且在调用函数时,若传递参数较多,传一个结构体相对简单。
二、结构体定义
1.结构体一般定义形式
定义一个学生
注意点:结构体定义时注意大括号后面有分号。
三、结构体变量的定义
1.先定义结构体类型,再定义变量。
结构体变量名为stu
2.定义结构体类型的同时定义变量
结构体变量名为stu
3.省略类型名,定义结构体类型变量
结构体变量名为stu
四、结构体变量赋值
1.第一种赋值方式
2.第二种赋值方式
3.第三种赋值方式
注意:
这种赋值方式是错误的,定义结构体的时候应该同时一次性初始化,或者这样赋值
补充:结构体变量也可以作为另一个结构体的成员,如果某个成员也是结构体变量,可以连续使用成员运算符”.”访问最低一级成员
结构体数组用法和普通数组用法一样
五、结构体内存问题
定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样的道理。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。
前面四行是没有分配存储空间的,当执行第5行时才分配存储空间给stu变量。
结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列。
六、结构体作为函数参数
将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中的成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。
示例代码
输出结果:
![](http://img.blog.csdn.net/20151026224702069)
七、指向结构体的指针
每个结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量。
结构体指针变量的定义形式:struct 结构体名 *指针变量名
有了指向结构体的指针,那么就有3种访问结构体成员的方式
1.结构体变量名.成员名
2.(*指针变量名).成员名
3.指针变量名->成员名
示例代码
![](http://img.blog.csdn.net/20151026230227498)
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一、概念
结构体是一种构造类型,它是由若干个成员组成的,每一个成员可以是一个基本数据类型或者又是一个构造类型。结构体可以把功能相同的数据组织起来,存在一起,用的时候方便,而且在调用函数时,若传递参数较多,传一个结构体相对简单。
二、结构体定义
1.结构体一般定义形式
struct 结构体名{ 类型名1 成员名1; 类型名2 成员名2; 类型名3 成员名3; ... };
定义一个学生
struct Student { char *name; int age; float height; };
注意点:结构体定义时注意大括号后面有分号。
三、结构体变量的定义
1.先定义结构体类型,再定义变量。
struct Student { char *name; int age; }; struct Student stu;
结构体变量名为stu
2.定义结构体类型的同时定义变量
struct Student { char *name; int age; }stu;
结构体变量名为stu
3.省略类型名,定义结构体类型变量
struct { char *name; int age; }stu;
结构体变量名为stu
四、结构体变量赋值
1.第一种赋值方式
struct Student stu; //结构体变量名.成员 stu.name = "kingwang"; stu.age = 23; printf("name=%s\n,age=%d\n",stu.name,stu.age);
2.第二种赋值方式
struct Student stu = {"kingwang",23 }; printf("name=%s\n,age=%d\n",stu.name,stu.age);
3.第三种赋值方式
struct Student stu = {.name = "kingwang", .age = 23}; printf("name=%s\n,age=%d\n",stu.name,stu.age);
注意:
struct Student stu; stu = {"kingwang",23};
这种赋值方式是错误的,定义结构体的时候应该同时一次性初始化,或者这样赋值
stu.name = "kingwang";stu.age = 23;
补充:结构体变量也可以作为另一个结构体的成员,如果某个成员也是结构体变量,可以连续使用成员运算符”.”访问最低一级成员
struct Date{ int year; int month; int day; }; struct Student { char *name; struct Date birthday; }; struct Student stu; stu.birthday.year = 1993; stu.birthday.month = 11; stu.birthday.day = 2;
结构体数组用法和普通数组用法一样
struct Student { char *name; int age; }stu[2] = {{"kingwang",23},{"wang",22}};
五、结构体内存问题
定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样的道理。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量。
struct { char *name; int age; }; struct Student stu;
前面四行是没有分配存储空间的,当执行第5行时才分配存储空间给stu变量。
结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列。
六、结构体作为函数参数
将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中的成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。
示例代码
#include<stdio.h> //定义一个结构体 struct Student { int age; }; void test(struct Student stu){ printf("修改前的形参:%d\n",stu.age); //修改实参中的age stu.age = 10; printf("修改后的形参:%d\n",stu.age); } int main(int argc, const char * argv[]){ // insert code here... struct Student stu = {30}; printf("修改前的实参:%d\n",stu.age); //调用test函数 test(stu); printf("修改后的实参:%d\n",stu.age); return 0; }
输出结果:
七、指向结构体的指针
每个结构体变量都有自己的存储空间和地址,因此指针也可以指向结构体变量。
结构体指针变量的定义形式:struct 结构体名 *指针变量名
有了指向结构体的指针,那么就有3种访问结构体成员的方式
1.结构体变量名.成员名
2.(*指针变量名).成员名
3.指针变量名->成员名
示例代码
#include <stdio.h> int main(int argc, const char * argv[]) { // insert code here... //定义一个结构体类型 struct Student { char *name; int age; }; //定义一个结构体变量 struct Student stu = {"kingwang",23}; //定义一个指向结构体的指针变量 struct Student *p; //指向结构体变量stu p = &stu; //方式1.结构体变量名.成员名 printf("name=%s,age=%d\n",stu.name,stu.age); //方式2.(*指针变量名).成员名 printf("name=%s,age=%d\n",(*p).name,(*p).age); //方式3.指针变量名->成员名 printf("name=%s,age=%d\n",p->name,p->age); return 0; }
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
相关文章推荐
- IOS开发笔记10-字符串-C语言笔记
- C++:派生类的构造函数和析构函数
- 【C语言】【笔试题】实现函数itoa(int n,char s[]),将整数n这个数字转换为对应的字符串,保存到s中
- C语言指针总结
- C++:基类和派生类
- C++拷贝构造函数语意学 copy constructor(The Semantics of Constructors)
- IOS开发笔记9-数组-C语言笔记
- const int *p, int *const p的区别
- 【C语言】【笔试题】实现一个函数int my_atoi(char s[]),可以将一个字符串转换为对应的整数。
- C/C++ 中的0长数组(柔性数组)
- c语言结构体注意事项及用法
- IOS开发笔记8-进制-C语言笔记
- C++:友元(非成员友元函数、成员友元函数、友元类)
- C++ 矩阵计算库 Eigen 使用笔记(一)
- UE4学习笔记-人物旋转控制(c++实现)
- C语言:实现一个函数itoa(int n,char s[]),将整数n这个数字转换为对应的字符串,保存到s中
- 【剑指offer】C语言:实现函数可以将一个字符串转换为对应的整数,如+1234输出1234
- C++:静态成员
- 动态规划解0-1背包问题(C语言版)
- C++:向函数传递对象(对象、对象指针、对象引用)