C语言的初识(2)

目录

1.常见关键字

1.1关键字的使用场景

1.2关键词typedef:类型重命名

1.3关键字static:静态的

1.3.1:static修饰局部变量

1.3.2:static修饰局部变量

1.3.3:static修饰函数

1.4:#define定义常量和宏

2.指针

2.1:内存

2.2指针变量

2.3解引用操作

2.4指针变量的大小

3.结构体


1.常见关键字

C语言提供了非常丰富的关键字,这些关键字都是本身预先设计好的,用户是不能创造关键字的

auto        reak        case        char        const        continue        default        do        double        else        enum        extern        float        for        goto        if        int        long        register        return        short        signed        sizeof        static        struct        switch        typedef        union        umsigned        void        volatile        

1.1关键字的使用场景

类型分支循环函数
autoifbreak:打破return:返回
const:修饰常变量elsecontinue:继续
char:字符数据类型switch

do

while

int:整形casefor
enumbreak:打破
short:短整型default
uniongoto
struct
float:单精度浮点型
typedef
double:双精度浮点型
signed:有符号的
unsigned:无符号的
static:静态的
void

 extern:声明外部符号                 

 register:寄存器

 sizeof:计算所占内存的大小

关键词先介绍下面几个,以后遇到了再讲。

1.2关键词typedef:类型重命名

顾名思义就是把类型重命名,如下图。

#include<stdio.h>
typedef unsigned int uint;
//uint就是unsigned别名
int main()
{
	unsigned int age;
	//我们定义一个无符号的整形age时,unsigned名字太长,我们就可以使用typedef重命名
	uint age2;
	//这里可以使用重命名后的unsigned
	return 0;
}

总而言之typedef可以使复杂的类型简单化

1.3关键字static:静态的

static有三种使用方法:

1.3.1:static修饰局部变量

我们利用一个循环讲解,阅读程序先从main函数开始,这里话没有使用static修饰。

 

 如图所示,最终的打印结果是十个一,因为通过循环进到test函数之后,a是0,a++之后变成1,然后printf把它打印出来,而a是一个局部变量,局部变量的生命周期是进入作用域生命周期开始,出作用域生命周期结束,a出了生命周期之后就销毁了,所以每次进到test函数里面a重新创建,出了函数a销毁,循环十次,所以会打印十个一

注:这里忘记作用域和生命周期可以参考我的上一篇文章

 static修饰后的结果为下图

如图所示,最后打印的结果为12345678910

为什么会打印这个结果呢?我们就先需要了解一下内存的知识。 

在内存里面分为三个区域,分别是栈区,堆区,静态区,每个区域放的都是不同的数据类型

当我们简单了解了内存,后面就很容易被理解了。

普通的局部变量是放在栈区上的,这种局部变量进入作用域创建,出了作用域释放。

但是局部变量被static求时候,这种变量就放在静态区,放在静态区的变量,创建好后,直到程序结束才释放。

本质上:static的四u是该百年来局部变量的储存位置,因为储存位置的差异,使得执行效果不一样。

注:被static修饰是不影响作用域的!!!但是生命周期变长了。

当你希望这个变量出了这个范围不要销毁,下次进来的时候还在,就可以使用static修饰局部变量。

1.3.2:static修饰局部变量

全局变量本身是具有外部连接属性的

在A文件中定义的变量,在B文件中可以通过【链接】使用

但是如果全局变量被static修饰后,这个外部连接属性就变成了内部链接属性,则这个全局变量只能在自己所在的源文件使用,最终使得全局变得作用域变小。

当在A文件定义的全局变量不想在B文件中使用时,就可以使用static修饰全局变量

1.3.3:static修饰函数

函数本身是具有外部连接属性的

被static修饰后,外部连接属性变成了内部连接属性

使得这个函数只能在自己坐在的源文件使用,其他文件无法使用

限制了作用域

当这个函数只想在自己的源文件内使用,不想与其他的发生冲突时,就可以使用static修饰函数。

1.4:#define定义常量和宏

//define定义标识符常量
#define MAX 000
//define定义宏
#define ADD (x, y)((x)+(y))
#include<stdio.h>
intmain()
{
	int sum = ADD(2, 3);
	printf("sum=%d\n", sum);
	sum = 10 * ADD(2, 3);
	printf("sum=%d\n", sum);
	return 0;
}
比

2.指针

要讨论指针,首先要理解内存

2.1:内存

内存时计算机上的一种存储空间

程序运行的时候会载入内存

程序中如果有数据需要储存,也会申请内存空间。

以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址

打个比方说,内存就是一栋大楼,一栋大楼里面会有很多的房间,每个房间有自己的门牌号,例如102,103,104等等,门牌号就相当于内存中内存单元的编号,也可以称为地址,我们可以通过地址找到相对应的房间,而地址存在C语言中,就是指针

如果访问一个内存单元,那内存单元的的地址(指针)如何产生呢?

我们拿32位地机器举例,通电后电信号有高电平和低电平,转换成数字信号假设是0和1.

32根地址线如果通电,32位地址线上全是低电平时,转换成数字信号就是全0。

00000000000000000000000000000000

全是高电平时,转换成数字信号就是全1。

11111111111111111111111111111111

电信号转换成数字型号就是这样的二进制序列。

在32位地址线上,我们总共可以产生2的32次方这样的二进制序列。

我们就可以产生2的32次方个地址。

就可以管理2的32次方个内存单元。

也就是2的32次方个内存空间。

#include<stdio.h>
intmain()
{
	int num = 10;
	&num;//取出num的地址
	//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
	printf("%p\n", &num);//打印地址,%p是以地址的形式打印
	return 0;
}

最终打印出来的会是所占内存中四个字节,第一个字节的地址。

2.2指针变量

int main()

{

        int a=1;//向地址申请4个字节

        int * pa=&a;

        printf("%p",&a);

        printf("%p",pa);

        //pa是一个变量,这个变量是用来存放地址的

        //而地址又叫指针

        //所以在C语言中把pa叫指针变量(指针变量是存指针的变量)

        //最后他们打印的结果是一样的

        return 0;

}

*号告诉我们pa是指针

int 告诉我们pa指针是int类型的变量

2.3解引用操作

当我们了解了指针变量,接下来了解解引用操作。

当我们把a放到pa里面后,我们怎么才能通过pa找到a呢?

int main()

{

        int a=1;//向地址申请4个字节

        int * pa=&a;

        *pa=20;

        //解引用操作

        //他的作用是通过pa整的地址,找到a,然后改变它的值

        printf("%p\n",a);

        //a为20

        return 0;

}

这就是指针最底层最核心的原理

指针的本质是地址

但是在口头语种指针一般是指针变量

2.4指针变量的大小

#include<stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
intmain()
{
printf ("%d\n",sizeof (char*));
printf ("%d\n",sizeof (short*));
printf ("%d\n",sizeof (int*));
printf ("%d\n",sizeof (double*));
return 0;
}

指针变量大小是多少呢?

指针变量存放地址的!

地址: 32位机器上是32个bit位

32位的机器上,指针变量存放的是32bit的地址 32位机器上,指针变量的大小是4个字节

64位机器上是64个bit位

64位的机器上,指针变量存放的是64bit的地址 64位机器上,指针变量的大小是8个字节


3.结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含:名字+年龄+性别+学号这几项信息。
这里只能使用结构体来描述了。

结构体的关键字叫:struct

例如:

struct Stu

{    

        char name [20];  //名字    

        int age;              //年龄    

        char sex [5];       //性别    

        char id [15];     //学号

};

结构体的初始化:

//打印结构体信息 

struct Stu s = {"张三", 20, "男", "20180101"};

//.为结构成员访问操作符

printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);

//->操作符

struct Stu *ps = &s;

printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps- >id);


初识C语言的知识就到这里了,大多数知识点我们只是过了一下,让大家直到有这么个东西,以后看到代码大概能看懂,下一章是分支和循环。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值