初识C语言(3)

系列文章目录


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

十一、关键字

常见关键字:

auto break 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 unsigned void volatile while
注:先介绍几个比较常用的,其它的后期遇到会讲解。

11.1 关键词 typedef

typedef顾名思义是类型定义,这里应该理解为类型重命名。
比如:

//将unsigned int 重命名为uint_2, 所以uint_2也是一个类型名
typedef unsigned int uint_2;
int main()
{
   
  //观察num1和num2,这两个变量的类型是一样的
     unsigned int num1 = 0;
     uint_2 num2 = 0;


     return 0;
}

11.2 关键字static

在C语言中:static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数

示例代码:

#include <stdio.h>
//void在这里表示不需要函数返回任何值
void test()
{
        
        
	int a = 1;
	a++;
	printf("%d\n", a);
}
int main()
{
        
        
	int i = 0;

	while (i < 10)
	{
        
        
		test();
		i++;
	}

	return 0;
}

代码分析:当i=0时,i <10为真,进入while循环,下来执行test();自定义函数。test函数中局部变量a的生命周期要开始了,紧接着创建a并赋值为1,接下来,a自增变为2,当执行完printf函数时。a的生命周期就结束了,就会把a的这块空间给销毁掉,还给操作系统。如此反复直到i>=10,循环结束,整个程序结束。最终代码运行结果如下图:
在这里插入图片描述
如果将上述代码中的int a = 1;改写为:static int a = 1;其余保持不变。得到结果如下图所示:
在这里插入图片描述
当执行第一次循环过后,a的值为2,但是当第二次循环过后a的值为3,那就说明在第二次调用test这个函数时,static int a = 1;并没有再次创建a,那么a的值是怎么来的,所以
如此看来只能有一种可能性,上一次出test函数范围的时候,a没有被销毁,正因为没有销毁,所以下一次进函数里面也没有被创建,还是保留着上一次留下来的值。根据结果可以推测出:每一次调用test函数,使用的a都是上一次函数调用留下的a。知道static大概的用法,知其然知其所以然,因此我们再来进行深度剖析。看下图,学习C语言我们比较关注这三个区,每个区各自存放的东西是不一样的。从下图可以看出,我们的静态变量就是存放在静态区的。所以当我们的局部变量a被static修饰之后,它就会变成静态局部变量,属于静态变量。综上可以得出,static修饰局部变量的时候,其实是改变了变量的存储类型(栈区存储->静态区),从而是的静态的局部变量出了自己的作用域也不会销毁,其实相当于局部变量的生命周期。
结论:
static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
在这里插入图片描述
上例是static修饰局部变量,那它修饰全局变量呢?
先看个例子:
在这里插入图片描述
我们在原来的基础上创建了一个add文件,在add中定义一个全局变量g_val,但是代码运行后会报错。如果想要在原基础上实现效果,可以稍作修改。在其他文件中引用全局变量时,需添加extern修饰符进行变量声明,表示“引用外部定义的变量”。
在这里插入图片描述
那么当static修饰全局变量g_val呢?代码如下图:
在这里插入图片描述
从上图中可以看出,当static修饰全局变量g_val后,代码运行后会报错。由此我们可以这样理解:一个全局变量在整个工程的其他文件内部被使用,是因为全局变量具有外部链接属性,当一个全局变量被static修饰的时候,这个变量的外部链接就变成了内部连接属性,使得这个全局变量只能在自己所在的源文件内部使用,其他文件不能再使用,给我们的感觉是作用域变小了,但是它的生命周期没有发生任何变化。
需要注意的是,三种静态持续变量具有不同的链接性。全局变量具有外部链接性,静态全局变量具有内部链接性,静态局部变量没有链接性。即在其他文件中可以引用当前文件定义的全局变量,但静态全局变量和静态局部变量只能在当前文件中使用。
接下来,我们来讨论static修饰函数。代码如下图:在这里插入图片描述
代码结果和我们预想的一样,结果是30。这就说明了函数也是具有外部链接属性的。下来我同样用static修饰add函数,是不是似曾相识,和上面我们讨论static修饰全局变量出现了一样的错误。我们也可以推测出来,函数也是具有外部链接属性的。
在这里插入图片描述

结论:static修饰函数的时候,函数本来也是具有外部链接属性的,被static修饰的时候,就变成了内部链接属性,这个函数只能在自己所在的源文件内部使用,不能在其他文件内部使用,给我们的感觉是改变了作用域~

12、#define定义常量和宏

示例代码:#define定义标识符常量

 #define定义宏:

13、指针

13.1 内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

我们可以画图来形象的表示:

 再看示例代码:

a是int型,在内存里面占四个字节。那么a的地址是什么呢?其实a的地址就是它所占这四个字节的第一个字节的地址,因为我们只要知道了它的值起始地址,后面的地址就都能知道了。如下图所示:

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址如下:

#include <stdio.h>
int main()
{
  int n = 10;
  &n;    //取出n的地址
  //注:这里n的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)

  printf("%p\n", &n);//打印地址,%p是以地址的形式打印,地址是以16进制显示的

  return 0;
}

那地址如何存储,需要定义指针变量。

int num = 10;
int *p;  //p为一个整形指针变量
p = &num;
 

猜你喜欢

转载自blog.csdn.net/m0_63289584/article/details/122759179
今日推荐