黑马程序员学习笔记--------C语言变量类型,结构体,枚举

本章学习的知识是定义结构体,枚举等自定义的数据类型,已经宏命令,变量类型等细小的知识点,在开始本章的新知识学习之前首先我们要明白的是C语言有丰富的数据类型和运算符,因此计算能力非常强大,计算过程中使用的值一般用变量来存储。变量也是有分类型的,不同类型的变量有不同的存储类型、不同的生命周期、不同的作用域,C语言也提供了一些关键字来设置变量的属性(比如设置存储类型、生命周期)。

一、变量类型

变量分为全局变量和局部变量。

首先说明一下局部变量的特点

1> 定义:在函数内部定义的变量,称为局部变量。形式参数也属于局部变量。

2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。

3>生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收

4>局部变量没有固定的初始值

然后是全局变量的特点

1> 定义:在所有函数外部定义的变量,称为全局变量。

2> 作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。

3> 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁

3>全局变量默认的初始值就是0

二、结构体

1.结构体是系统为我们定义一些包含复杂的变量或者包含类型不同的变量时使用的 ,下面是结构体使用的一些定义规则和使用注意:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    struct Date {
        int year;
        int month;
        int day;
    };// 定义结构体

    struct Date1 {
        int year;
        int month;
        int day;
    }d1;  //定义结构体的同事定义变量

    struct {
        int year;
        int month;
        int day;
    }d2;  //省略类型名定义变量 坏处是不能重复使用

    struct Date d={2000,1,20};//赋值 第1,2,3个数据一一对应

    d.day=30;  //可以使用变量.属性调用

    /*如果要定义直接写struct Date d2 = {2000,1,20};
     struct Date d2;
     d2 = {2000,1,20}; 这么定义是不对的
     */
    return 0;
}

2.结构体还有几点需要注意:

1>不允许对结构体本身递归定义

2>结构体内可以包含别的结构体

3>定义结构体类型,只是说明了该类型的组成情况,并没有给它分配存储空间,就像系统不为int类型本身分配空间一样。只有当定义属于结构体类型的变量时,系统才会分配存储空间给该变量

4>结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列

5>结构体所占的内存空间是按照结构体内占用内存最大的类型的倍数 例如

#include <stdio.h>

int main(int argc, const char * argv[]) {
    struct Student{
        int age; //4个字节
        double gao; // 8个字节
        char *name;  // 8个字节
    };// 定义结构体
    struct Student s1={12,1.77,"jack"};

    int a=sizeof(s1);
    printf("%d",a); //输出24 4+8+8=20 取8的最小倍数24
}

3.结构体作为函数参数

将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。

4.指向结构体的指针

结构体指针变量的定义形式:struct 结构体名称 *指针变量名

有了指向结构体的指针,那么就有3种访问结构体成员的方式

1>结构体变量名.成员名

2>(*指针变量名).成员名

3>指针变量名->成员名

三、枚举

枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天、夏天、秋天、冬天。

枚举的定义规则

enum 枚举名 {枚举元素1,枚举元素2,……};

例如:

enum Sex{
        man,//0
       woman,//1
       unknown, //2
}enum Sex s=man;

PS:枚举元素的值取决于定义时各枚举元素排列的先后顺序。默认情况下,第一个枚举元素的值为0,第二个为1,依次顺序加1。

总结:在本章中,我们学习了结构体和枚举的相关知识,这些知识虽然感觉上没有其他知识那么复杂,但也是常用的数据类型,所以也是我们应该掌握的。主要学习了结构体的定义,其中定义结构体变量有三种不同的方式,还学习了结构体的内存分析,包括结构体的作用域,内存分配和所占存储空间,结构体跟之前所学复杂数据类型数组,指针等有密切的联系和应用,结构体也重点讲述了结构体和数组,指向结构体的指针,同时了解了结构体和函数的关系,当结构体作为函数参数的一些注意点。还学习了枚举在C语言中的定义方式,因为C语言中没有bool类型,所以我们经常要用到枚举,由于枚举相当于定义了枚举常量,所以返回值仍然是int类型数据。

时间: 2024-08-02 02:49:22

黑马程序员学习笔记--------C语言变量类型,结构体,枚举的相关文章

黑马程序员学习笔记2014/7/5

观看视频:011_标识符_黑马程序员_Java基础视频.avi Java语言的基础组成 关键字.标识符.注释.常量和变量.运算符.语句.函数.数组.   关键字     标识符 1.在程序中自定义的一些名称 2.由26个英文字母大小写,数字,0-9符号 :_ $ 组成 3.定义合法标识符的规则: a.数字不可以开头 b.不可以使用关键字 4.Java中严格区分大小写 5.注意:在起名的时候尽量起一个有意义的名称       观看视频:012_常量_黑马程序员_Java基础视频 常量与变量 Jav

黑马程序员学习笔记-C指针小结

黑马程序员学习笔记-C指针 1. 指针简介: 指针是C语言中非常重要的数据类型,是C语言的精华 2. 指针变量定义: 格式:类名标识符 *指针变量名; 指针变量只能存储地址 指针就一个作用:能够根据一个地址值,访问对应的存储空间 指针变量p前面的int:指针变量只能指向int类型的数据 3.实例: 4. 注意点: 指针变量只能存储地址.指针变量未经初始化,不要拿来间接访问其他存储空间.指针变量的初始化可以int *p = &a;也可以拆分成两句:int *p; p =&a;.定义变量时的*

黑马程序员学习笔记_OC之给NSString增加分类

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>.<a href="http://www.itheima.com"target="blank">.Net培训</a>.期待与您交流! ---------------------- 黑马程序员学习笔记_OC

黑马程序员学习笔记-OC之foundation框架

黑马程序员学习笔记-OC之foundation框架 1.简介:foundation框架是其它所有ios框架的基础,包含了很多常用类型,结构体.枚举.类等. 2. 结构体:NSRange表示范围的结构体. NSPoint/CGPoint表示坐标点的结构体 NSSize/CGSize表示宽高的结构体 NSRect/CGRect表示坐标点+宽高的结构体 3. 类字符串:NSString  字符串类 NSMUtableString  易变字符串类 NSArray         数组类 NSMUtabl

黑马程序员学习心得------C语言复杂数据类型之指针

众所周知,指针是C语言中最重要也是最难的一种数据类型,这是C语言中与其他类似于Java等语言不同的直接操纵内存的一种数据.也有人如此形容指针的重要性“如果你C语言中除了指针都学得很好,信手拈来,唯独不会指针,那么你就是没学过C语言!”.下面来回忆一下这段时间学习指针的心得. 1 定义的格式: 指向内容的数据类型  *指针变量名 例如: int  *p; 2 指针的赋值问题 int a=10; int *p=&a;//指针p指向的a的地址值 int *p; p=&a  //这两种赋值都可以.

黑马程序员-学习笔记 字符流相关

1.FileWriter FileWriter fw = new FileWriter("demo.txt"); fw.writer("abcde");fw.flush();fw.close(); writer()方法只是把数据写入到内存(流)中:flush():把当前流中的数据刷入到目的地中(demo.txt)中. 如果 fw(流)不关闭,使用writer()方法重复写入数据. close():关闭此流,但要先刷新一次缓存中的数据. flush()和close()

马程序员学习笔记——红黑树解析四

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 本篇是将上面三篇的理论知识转化成代码,java实现 首先,看一下算法导论里的伪代码 一.左旋 The pseudocode for LEFT-ROTATE assumes that right[x] ≠ nil[T] and that the root's parent is nil[T].(伪代码的左旋方法中假设X的右孩子不为空) LEFT-

马程序员学习笔记——红黑树解析二

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 四.树中删除元素 1.先找到需要删除的元素. 2. 2.1如果被删元素没有子元素,那么直接用NIL节点代替他: 2.2如果被删元素只有一个子元素,那么直接用这个子元素代替他: 2.3如果被删元素有两个子元素,那么就用左子元素中的最大元素或者右子元素的最小元素代替他. 比如说原来要删除的元素是N,N有两个分支,其中P是N左分支中的最大元素,那么就

马程序员学习笔记——红黑树解析三

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 六.树的前序.中序.后序 前序遍历(根左右): 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历(左根右): 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历(左右根): 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点 扩展:已知前序.中序遍历,求后序遍历? 例: 前序遍历: GDAFEMHZ 中序遍历: