您的位置:首页 > 编程语言 > C语言/C++

黑马程序员——C语言基础---结构体

2015-10-26 20:39 176 查看
——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培训、期待与您交流! ——-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: