C语言学习记录230627

        今天久违地用健身环在家运动了一下,感觉还不错,但是健身完之后,洗了个澡,却能明显感觉到人的精力不够充沛,怎么形容呢,虽然因为肾上腺素的原因人很亢奋,但是仔细感受,却能明显感受到人有点疲惫,所以今天发博客也有点晚。诸位也可以把这个当做是这么迟才发今日学习记录的借口吧,但好歹现在也算是补上了不是?

        在说今日总结之前,我先说下我昨晚看《C方法》一书得到的收获,昨天包括之前,我都给予了“指针是地址,地址是指针”这么一个对指针的肯定回答,但是《C方法》一书中,恰好在课后回答中,给这个问题给出了答案,答案是“通常情况下是对的,但某些特殊情况不对”,其实不难理解,通常情况也就是我们这种刚入门的水平了,接触不到那么深,并且也用不到;那么什么事特殊的情况呢?我们之前知道内存内的地址是按字节存放的,有那么一种情况,那就是内存内的地址不是按字节存放的,他是按字存放的,《C方法》一书中给出了一种情况,按字存放,并且一个字占据4个字节,那么假如我们寻找某个字符类型的地址时,我们会发现我们找到的是好几个字符类型的数据,这时就会出现问题。所以可以说通常情况下是对的,而某些情况下是错误的。

        刚刚算是题外话,接下来总结下今日所学。

        (一)结构体基础

                今天学习的内容相对简单,除开结构体,那就是调试的内容了,这里简单说一下结构体,结构体是一些数据的集合,这些数据被称为结构体成员,这些数据可以是不同类型的变量,数组、指针,乃至于结构体。

                那么结构体是如何定义声明的呢?仔细看,我前一句话说是定义声明,这是有顺序的,结构体是需要我们先自己定义,然后才能声明及使用的,那么如何定义呢?下面给出定义结构体类型的基本方式:

struct 结构体名
{
    成员列表
};

                struct是结构体的关键字,定义和声明结构体,必须要再结构体名的前面加上struct,表明这是一个结构体,成员列表内可以有一个成员,也可以有多个成员,而一个成员应该包含这个成员的类型及其名称。

                当我们定义了一个结构体后,我们就可以通过下面两种方式声明对应的结构体变量:

struct a
{
    int b;
    char c;
}d;

struct a e;

                上面是两种简单的声明方式,第一种是在定义结构体的同时在其末尾直接加上一个变量名,这样声明的变量将会是一个外部变量,具有静态存储期。第二种方式则是正常的在类型名后写上变量名,两种方式都可以。

                有时候也能看到利用typedef类型定义功能,给一个结构体类型换个名字,如上面的struct a e用类型定义修改后,这个声明可以简化为下面这样:

typedef struct a
{
    int b;
    char c;
}d;

struct a e;
d f;

                 上面的结构体定义前面加上了typedef,这时末尾的d不再是新声明的变量名,其含义为,用d代替了struct a这一个结构体类型,即d等效于struct a,所以后面声明结构体变量e和f,在他们前面加struct a和在他们前面加d,其实本质是一样的。

                结构体的初始化,跟初始化数组差不多,当结构体成员有数组和别的结构体时,对应那个位置再加个花括号进行区分即可。有点类似于二维数组。

                对结构体成员的访问有两种方式,根据手头有的东西对应去使用,手头直接拿的是结构体变量的时候用成员访问运算符“.”,手头拿的是一个指向结构体的指针的时候,我们可以用箭头运算符“->”。点运算符的使用方法就是结构体的变量名后加点号,然后写上对应的成员名称即可进行访问。箭头运算符则是直接在指针后加上运算符,然后写上想要访问的对应结构体的结构体成员名即可。

                最后简单说一下结构体传参的两种方式,我们调用函数有两种方式,一种是传值调用,一种是传址调用,结构体本质上也是一个情况,这里情况特殊的就是,有时候因为结构复杂,一个结构体本身会很庞大,当采用传值调用的时候,系统会生成一个一模一样的新结构体,这样会造成内存的浪费。这种情况下采用传址调用就会好很多,因为一个指针目前所占大小不是4就是8个字节,不管怎样都很小。

        (二)调试

                今天剩下的内容主要是调试,讲师那边用的是VS,而我依然用的是Dev-c,所以调试的功能差距很大,但是还是能知道不少东西的。

                首先调试功能,默认是直接运行到底,如果我们什么都不做,就跟正常运行程序一样,我们需要加上断点(我觉得更像锚点),相当于做上标记,程序到了这个地方就会停止,这时我们就可以打开监视器,进行下一步操作,我们可以选择进行逐过程调试(粗略地调试,一个语句一个语句过),也可以选择逐语句调试(精细地调试,不错过任何一个语句),乍看好像一样,实际上逐语句调试能进入语句的函数内,而逐过程不行,这就是差别。

                Dev-c的调试功能我只知道个大概,但是VS里,老师演示了很多功能,包括内存的监控,寄存器的监控,对断点的触发条件进行设定等等。可能后续我也需要换一个编辑器或者IDE来进行学习。

                考虑到不同语言还会有不同的调试器,等我正式学Java的时候,到时候直接学习Java的调试方式吧~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值