结构体入门&调试技巧(一)

简介: 结构体入门&调试技巧(一)
+关注继续查看

前言:


 结构体是很重要的C语言内容,打好结构体的基础是很有必要的!另外,再把程序员必备的硬技能---调试技巧掌握好,可以让我们高效的找出bug的地方。调试就是在寻找使程序出现不符合预期的错误逻辑代码。


一.结构体


 结构体是用来描述有多种参数特征的复杂对象,比如描述一本书,有书名、有价格、作者、书号等。但是如果只说书名,是描述不清楚的具体是哪一本书的---(也就是用一个字符数组)。用一个书的价格更不可能描述清楚~。


 结构体使用的关键字是struct,和枚举类型(enum)一样,都是使用关键字创建一个新的数据类型;结构体成员可以是不同的数据类型。


#include <stdio.h>
struct Book
{
    char author[7];
    char BookName[20];
    float Price;
    int ed;
}b2;//参数列表 在结构体后面可以创建该结构体类型的全局变量
int main()
{
    struct Book b1 = {"张三", "我的牢底生活", "55.5", 2};
}

 使用struct创建一个名为Book的结构体类型,在C++中,创建b1结构体变量的时候,不需要加struct,在C语言中struct不能省略。在C语言想要这么做的话,可以typedef重命名一下,一般都会这么做,因为每次都要多写一个struct,不仅显的长,还麻烦。

#include <stdio.h>
typedef struct Book
{
    //结构体成员 --- 成员列表
    char author[7];
    char BookName[20];
    float Price;
    int ed;
}Book;//Book和struct Book等效
//重命名和参数列表是不能一起表示的
int main()
{
    struct Book b1 = {"张三", "我的牢底生活", "55.5", 2};
}

1.1结构体的初始化和访问

 结构体的初始化和数组一样使用列表{}初始化,注意不能在创建结构体类型的时候给结构体成员初始化,因为它只是一个类型,是一张蓝图,并没有实际的空间。只有在实例化(使用结构体类型创建结构体变量)才有分配空间。


 结构体初始化有两种方式:第一种就是按照成员列表依次初始化;第二种就是不根据列表的顺序初始化,但第二种需要加上一些指定性的东西才能实现,请看代码:


image


 在打印的时候,点操作符(.)是访问结构体成员的一种方式,使用结构体变量名.成员变量的方式访问。所以在使用第二种方式初始化可以这样理解,.height其实就是在访问s2里的height成员,因为这是在初始化s2。


 补充:不要第一种方式和第二种方式混合使用。


 结构体访问的两种方法:

第一种是前面提到的结构体变量.成员

第二种是结构体指针->成员

image


 第一种方法和第二种方法都行,第三种其实就是指针解引用拿到结构体变量,再使用第一种方法,duck不必~


二.结构体传参


 传值方式和传址方式:

#include <stdio.h>
struct Stu
{
    char number[12];
    char name[10];
    int age;
    char address[50];
};
void Print1(struct Stu s1)
{
    printf("%s %s %d %s\n", s1.number, s1.name, s1.age, s1.address);
    s1.age = 70;
}
void Print2(struct Stu* ps)
{
    printf("%s %s %d %s\n", ps->number, ps->name, ps->age, ps->address);
    (*ps).age = 80;
}
int main()
{
    struct Stu s1 = {"1111", "张三", 23, "阿拉斯加"};
    Print1(s1);
    printf("%d\n", s1.age);
    Print2(&s1);
    printf("%d\n", s1.age);
    return 0;
}


image


 Print1是把s1这一整个变量传给形参,相比与传址而言,传值浪费空间严重,因为结构体本身是很大的,形参是实参的一份临时拷贝,传值会在栈区上开辟一模一样结构体s1。而地址的大小无非就是4个或者8个字节。


 第二就是传地址可以在函数内改变函数外部的变量,因为使用的是s1本身。传值改变不了的原因是,形参是一块新的空间,改变不了原来的。


image


 总结:对于结构体,传地址可以节省空间,可以改变外部变量,一般情况下传的是结构体的地址。

相关文章
|
1月前
|
供应链 C语言
【结构体】C语言结构体使用教程
【结构体】C语言结构体使用教程
26 0
|
1月前
|
程序员 C语言 C++
c语言学习之调试技巧
c语言学习之调试技巧
32 0
|
1月前
|
存储 编译器 C语言
C语言知识之结构体及实用调试技巧(二)
C语言知识之结构体及实用调试技巧(二)
23 0
|
1月前
|
C语言
C语言知识之结构体及实用调试技巧(一)
C语言知识之结构体及实用调试技巧
17 0
|
1月前
|
编译器 程序员 C语言
初识C语言 ----> 调试篇(1)
大家平时写代码是不是这样的:看完题目,好,咔咔开始写,没有什么思路,好不容易写完了,一运行,嘎嘎报错,咦?这里错了?,改!运行,哎?又错了? 最后连蒙带猜,带着疑问运行成功了,这样的习惯不太好,所以调试就显得很重要。
22 0
|
2月前
|
程序员 C语言 Windows
实用调试技巧——C语言
当我们在编写程序的时候,我们会遇到种种问题,有时候运行的结果和预期不同,甚至直接编译不通过。这时我们就应该寻找代码中的bug,那bug是什么呢?
31 0
|
2月前
结构体基本知识
结构体基本知识
|
2月前
|
C语言
C语言实验十四 结构体
C语言实验十四 结构体
18 0
|
3月前
|
程序员 C语言 Windows
第十章:C语言的调试
很多小伙伴刚开始听到C语言的调试,这是个啥,表示很怀疑,敲代码不就是直接就是干嘛,结果很多小白们,一运行错误多的数都数不过来。就开始这改改,那删删,莫名奇妙就运行成功了。到最后都不知道到底那错了。有一种小朋友是否有多问号的感觉。可想而知代码调试有多么重要,一个正真的大佬,20%在敲代码,80%在调试代码。咱们不扯别的,直接进入今天的主题--C语言调试。
20 0
|
3月前
|
存储 编译器 程序员
结构体入门&调试技巧(二)
结构体入门&调试技巧(二)