初始C语言(三)

初始C语言(三),第1张

        接着上次没说完的关键字咱们继续说。


1、关键字详解

1.1 关键字typedef

        如果我没记错的话,上期我应该是写错了,因为这次敲起来感觉很陌生……以本期为准哈。


这个关键字是类型定义,我们可以理解他为类型重命名。


作用就是当我们定义类型名时会遇到较为麻烦的名字,比如 unsigned float ,这个类型名的含义是无符号的浮点型。


为了方便我们敲代码和这个代码的清晰整洁度,我们在main函数外部可以对 unsigned float进行一个新的命名,比如说就叫他 uflt,那么在后续的代码中,uflt就相当于unsigned float,具体使用情况如下:

typedef unsigned float uflt;

int main()
{
    unsigned float a = 3.14; //和下面一个意思

    uflt a = 3.14; //和上面一个意思

    return 0:
}

        因为我平时会看些篮球,就拿NBA球星扬尼斯. 西纳. 乌戈. 阿德托昆博来说,看到这个名字看球的和不看球的都沉默了吧,没错这就是字母哥的全名。


你说解说要是在开场进行双方球员首发球员介绍的时候,念字母哥的全名,“雄鹿这面的首发阵容扬尼斯……”,怕是念完了中场都休息了。


        所以,为了方便我们就叫他字母哥了,那这个关键字其实作用就是这样的。


1.2 关键字static

1.2.1static修饰局部变量

        static修饰局部变量称为静态局部变量,其实现的作用就是改变了局部变量的生命周期,即便出了作用域,还能存在,不会废除,知道程序结束,生命周期才结束。


我自己的理解就是把他看成一个有了全局变量生命周期的局部变量。


其本质是因为static修饰的局部变量存储的地方由栈区变到静态区,而得以实现延长生命周期,我们列举一段代码来体现它的实际意义:

#include

void test ()
{
    int i = 0;
    i++;
    printf("%d ",i);
}
int main()
{
    int i = 0;
    for (i=0;i<10;i++)
    {
        test();
    }
    return 0;
}

// 这段代码的结果为 1 1 1 1 1 1 1 1 1 1 因为每次进入test循环后,i都重新定义为0,然后i++后变为1输出,出了test之后i=1自动销毁,i变为for里面的值。


#include void test () { static int i = 0; i++; printf("%d ",i); } int main() { int i = 0; for (i=0;i<10;i++) { test(); } return 0; } //这段代码的输出结果为 1 2 3 4 5 6 7 8 9 10 因为static修饰的变量i在保存在了test中,下一次再进入到test()中时,i调用上一次的值,所以实现逐次+1的效果。


1.2.2static修饰全局变量

        在介绍这个之前,需要给大家补一点知识。


我们在创建一个项目的时候,一个项目里面可以包含一个或者多个源文件,项目是啥?源文件是啥?上图!

 

         没错第一个是创建项目,第二个是创建源文件。


你会发现创建完一个源文件后还可以创建另一个源文件。


明白了这个,我们还要知道一个关键字——extern。


它的作用就是直接将其他源文件中调到自己的源文件中进行使用,比如一个源文件里面我们定义了一个int a = 1,我们在另一个源文件想要调用这个变量需要进行外部变量声明,extern int i 即可在其他源文件中直接引用变量i。


        如果一个全局变量被static修饰,,那么这个全局变量只能在自己的源文件中使用,不能在其他源文件中使用,一旦强行在其他源文件进行外部变量声明,则会出现连接性错误。


        同样的,static修饰一个函数时,效果和修饰全局变量的效果是一致的。


这里便不再详细说明,参考全局变量即可。


1.3 关键字#define

1.3.1 定义常量

        当#define定义标识符常量时:

#define Min 100

//含义为 Min变量的值为100

 1.3.2 定义宏

 

#define ADD(x, y) ((x)+(y)) //ADD 宏名;(x, y)中x、y为宏的参数,无类型;((x)+(y))为宏体,括号不能省略

#include 

int main()
{
    int sum = ADD(2, 3);
    printf("sum = %d\n", sum);
    
    sum = 10*ADD(2, 3);
    printf("sum = %d\n", sum);
    
    return 0; }
//打印结果为5 50

        实际就是将add加法函数通过宏定义来简便的进行了替换。


1.4关键字register

        register是寄存器的关键字。


电脑中的存储设备有硬盘、内存、高速缓存和寄存器,空间逐次减小,造价逐次增大。


寄存器是最快的存储设备,register这个关键字就是建议电脑用寄存器来存储数据,但只是建议,具体由电脑决定。


2、指针

 2.1 内存

        内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。


为了有效地使用内存,就把内存划分为一个个小的内存单元,每个内存单元的大小就是1个字节。


为了能够有效地访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。


变量的创建需要在内存中分配空间,每个内存单元都有地址,所以变量也是有地址的,取变量地址的代码如下:

#include 

int main()
{
    int a = 0;
    &a;//取出a的地址,这里a有四个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
    printf("%p",&a);//打印地址用%p
    return 0;
}

2.1指针变量

        地址在电脑中如何存储呢?这里就要引入一个新的变量——指针变量。


具体如何用指针变量来存储地址,如代码所示:

int a = 1;
int * p;
p = &a;

         p就是一个整型指针变量,它里面存储的就是整型a的地址。


指针的使用实例:

#include 
int main()
{
    int num = 10;
    int *p = #
    *p = 20;
    return 0; 
}
//结果输出为20

        p是一个指针变量,这里存放的是num的地址,通过解引用p即*p能够获取p指向的变量,从而通过更改*p而直接更改原变量的值。


 

除了整型指针变量同样还有char*、float*、double*等,用法同整型。


2.3 指针变量的大小

        不论是整型还是字符型的指针变量,他的本质还是指针,是地址,所以所有的指针变量的大小都是一样的,在32位处理器下是4个字节,在64位处理器下是8个字节。


3、结构体

        我们在之前学到的知识中,定义变量类型的时候只能是单一的类型,如果你要定义一个人的话,有姓名(char)、年龄(int)、身高(float)、性别(char),我们该怎么描述呢?这里就引入了结构体这一知识点。


struct Stu
{
    char name[20];//姓名
    int age;      //年龄
    float weight;  //身高
    char sex[5]; //性别
};

        结构体初始化:

//打印结构体信息
struct Stu s = {"张三", 20, "170.3", "男"};
//.为结构成员访问 *** 作符
printf("name = %s age = %d weight = %.2f sex = %s\n", s.name, s.age, s.weight, s.sex);
//结构体名.结构体内变量名 来取出对应的信息。


//-> *** 作符 struct Stu *ps = &s; printf("name = %s age = %d weight = %.2f sex = %s\n", ps->name, ps->age, ps->weight, ps- >sex); //结构体地址->结构体内变量名 来取出对应的信息。


        其实struct Stu的功能和int、float等都是一样的,只不过是struct Stu的中包含的类型比较复杂,总体的思路和传统的int、float等一样。


磕磕绊绊总算复盘完了,说的乱七八糟请各位谅解,下期见兄弟姊妹们!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存