文章目录

  • 前言
  • 一,static关键字
  • 二,#define 定义常量和宏
  • 三,初识指针
  • 总结

前言

本节主要记录初识C语言第四节内容。

内容包括:static关键字------#define 定义常量和宏---------初识别指针

———————————————————————————————————————————                                                                     ****正文开始****

一,static关键字

static--静态的

在C语言中:
static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数

(1)修饰局部变量

Q : 首先我们先看这段代码,它的执行结果是什么?

void test() {int a = 1;a++;printf("%d\n", a);
}
int main(){int i = 0;while (i < 10) {test();      i++;}return 0;
}

Q:是10个2 还是 2-11呢?

我们看演示结果:

A:在这里我们可以看到结果是10个2,为什么是10个2呢?

原因是在这里a是局部变量,作用域在test函数内部,出了自己的作用域会销毁,所以导致每一次代码走到test函数中a的起始值都是int 定义的1 ,而不会随着a++累加,所以每次输出结果都是2。

Q : 我们再看这段代码,它的执行结果是什么?

void test() {static int a = 1;a++;printf("%d\n", a);
}
int main(){int i = 0;while (i < 10) {test();  i++;}return 0;
}

Q:我们可以发现这段代码和上一个代码只是在a前加了一个static,那么这段代码的执行结果10个2 还是 2-11呢?

我们看演示结果:

A:     在这里我们可以看到结果是2 -11,为什么呢?我们首先可以确定,一定是这个static起了作用,我们可以看到他的作用仿佛是让a可以累加,不会每一次执行后被销毁。

          所以这里我们了解到static的第一个作用,当static作用在局部变量时:a本来是局部变量  static 修饰局部变量的时候,其实改变了变量的存储类型(栈区存储->静态区),所以使得这个静态的局部变量出了自己的作用域也不会销毁 其实相当于改变了这个局部变量的生命周期,不销毁 作用域是test函数  生命周期变成函数的生命周期。

拓展了解:  内存是一块比较大的存储空间,在使用内存时会划分不同的功能区域,在学习编程语言的时候: 栈区:   局部变量
                     堆区:动态内存分配(malloc,free,calloc,realloc)
                 静态区:   存全局变量 和 static修饰的静态变量

所以执行结果是:2 3 4 5 6 7 8 9 10 11

(2)修饰全局变量

Q : 观察下列代码,我们会打印出g_val的值吗? 

//代码1
//add.c
int g_val = 2021;
//test.c
int main()
{printf("%d\n", g_val);return 0; }

观察执行结果:

A : 代码1正常打印 原因是 : 一个全局变量在整个工程的其他文件内能被使用。是因为全局变量具有外部链接属性。    

Q:如果观察这段代码,我们还会和代码1一样打印出g_val的值吗? 

//代码2
//add.c
static int g_val = 2021;
//test.c
int main()
{printf("%d\n", g_val);return 0; }

我们看执行结果:

 A :代码2在编译的时候会出现连接性错误,这是因为 一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。当一个全局变量被static修饰的时候,这个变量的外部链接属性就变成了内部连接属性,使得这个全局变量只能在自己所在的源文件内部使用,其他文件不能再使用,static 修饰全局变量,让全局变量的外部链接属性变成了内部链接属性,作用域变小了  生命周期不变。

(3)修饰函数

Q : 我们接下来看这两段代码?请问代码会运行吗?

//代码1
//add.c
int Add(int x, int y) {return c+y; }
//test.c
int main()
{printf("%d\n", Add(2, 3));return 0;
}

我们看运行结果:

 A : 我们会发现,代码一正常运行,这是因为函数本来也是具有外部链接属性的

Q:那代码二还会正常运行吗?

//代码2
//add.c
static int Add(int x, int y) {return c+y; }//test.c
int main()
{printf("%d\n", Add(2, 3));return 0; }

运行结果发现:

A : 代码2在编译的时候会出现连接性错误, static修饰函数的时候,函数本来也是具有外部链接属性的,被static修饰的时候,就变成了内部链接属性。这个函数只能在自己所在的源文件内部使用,不能再其他文件内部使用, 给我们感觉是改变了作用域。

本质上:static 是讲函数的外部链接属性变成了内部链接属性!(和static修饰全局变量一样!)

二,#define 定义常量和宏

define 是一个预处理指令

(1)#define 定义标识符常量

#define 定义标识符常量
#define M 100
#define STR "hehe"
int main() {printf("%d\n", M);printf("%s\n", STR);return 0;
}

(2)#define 定义宏

#define ADD(X,Y) ((X)+(Y))
int main() {int a = 10;int b = 20;int ret = ADD(a, b);printf("%d\n", ret);return 0;
}

Q :我们观察这段代码,他的执行结果是多少?

#define ADD(X,Y) X+Y
int main() {//4*2+3printf("%d\n", 4 * ADD(2, 3));//执行结果:11return 0;
}

A:他的执行结果是11 ----->  4 * 2 + 3 

Q:那么在观察这段代码?

#define ADD(X,Y) ((X)+(Y))
int main() {//4*(2+3)printf("%d\n", 4*ADD(2, 3));//执行结果:20return 0;
}

这段代码的执行结果是:20  -----> 4 * ( 2 + 3 )

这是因为宏的参数是替换的。

三,初识指针

我们知道一个内存单元是一个字节  然后分配地址,一个内存单元 byte。

     &        取地址操作符
     %p     是以地址的形式打印

int      a =   10  ;   a要在内存中开辟空间

int    * p =  &a ;   p 就是一个指针变量   int是说明,

* p  --->      *  解引用操作符号

//指针:
int main() {int a = 10;// a 在内存中要分配空间 - 4个字节printf("%p\n",&a );//   %p专门用来打印地址int * pa = &a;//pa是用来存放地址的,在C语言中叫是指针变量// * 说明 pa 是指针变量//int 说明 pa 指向的对象是int类型的char ch = 'w';char * pc = &ch;return 0;
}
地址   ==  指针
地址是放在指针变量中

记录两个问题 :

Q1 : 给定秒数 seconds ,把秒转化成小时、分钟和秒。

输入描述:

一行,包括一个整数,即给定的秒数。

输出描述:

一行,包含三个整数,依次为输入整数对应的小时数、分钟数和秒数(可能为零),中间用一个空格隔开。

实现代码:

int main() {int seconds = 0;scanf("%d", &seconds);int h = seconds / (60 * 60);int m = seconds / 60 - h * 60;int s = (seconds % 3600) % 60;printf("%d %d %d", h, m, s);return 0;
}

运行结果:

Q2 : 将一个四位数,反向输出。

输入描述:

一行,输入一个整数n(1000 <= n <= 9999)。

输出描述:

针对每组输入,反向输出对应四位数。

实现代码:

#include <stdio.h>
int main(){int x = 0;scanf("%d",&x);int a1 = x /1000;int b1 = x /100 - a1*10;int c1 = x /10 - a1*100 - b1*10;int d1 = x % 10;printf("%d%d%d%d",d1,c1,b1,a1);return 0;
}

运行结果:

****正文结束****

———————————————————————————————————————————

总结

本节内容结束,由于本人技术水平有限,若各位大佬发现错误,还望各位读者及时纠正。

[C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)相关推荐

  1. #define 定义常量和宏,指针和结构体

    目录 #define 定义常量和宏 #define 定义常量 #define 定义宏 指针 内存 指针变量的大小 结构体 #define 定义常量和宏 #define 定义常量 在变量和常量2,#de ...

  2. C语言——初识C语言(define定义常量和宏,指针,结构体)

    1.1define定义常量和宏 define    定义符号(定义常量) //define 定义标识符常量 #define MAX 1000 define    定义宏(宏是有参数的,参数用来替换) ...

  3. C语言中的#define定义常量和宏

    C语言中的define是一个预处理指令. 1.define定义常量        格式为:#define  标识符  常量  , 注意:语句末尾没有":". 2.define定义宏 ...

  4. define定义常量和宏 以及 寄存器关键字register

    在C语言中,# 指的是预处理指令.像#define就是在main函数之前预先进行定义. define定义常量 这里定义了常量NUM,我们知道数组固定下标值必须是常量,这也进一步说明了这里define定 ...

  5. C语言 define 定义常量 - C语言零基础入门教程

    目录 一.define 简介 二.define 实战 1.不使用 define 2.使用 define 3.使用 define 优点 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学 ...

  6. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)

    在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...

  7. UIKIT_EXTERN和define定义常量

    看过我其他的博客的人都知道,我喜欢用define定义常量,最近看了一个开源的轮子,使用UIKIT_EXTERN这个定义的常量,了解了一下,发现使用宏定义的常量会在内存中临时开辟一份内存空间,而使用UI ...

  8. python关键字define_在Python中,使用关键字define定义函数。

    在Python中,使用关键字define定义函数. 以下属于生药学有效性评价的是A:有效成分定量分析B:限量检查C:重金属检测D:基原鉴定 若有如下定义和语句:A:7B:12C:8D:9 图示电路中的 ...

  9. python的define_在Python中,使用关键字define定义函数。

    在Python中,使用关键字define定义函数. 答:错 Charles Lamb wrote a series of miscellaneous essays, collected in 1823 ...

最新文章

  1. kali用Squid简单配置搭建http代理服务器
  2. 最优化课程(part1)
  3. .NET Core开发实战(第16课:选项数据热更新:让服务感知配置的变化)--学习笔记...
  4. Spring Data REST的实际应用
  5. SQL Sever 刪除重複數據只剩一條
  6. 数据结构与算法笔记-------选择排序
  7. 当你是个35岁的硬件工程师,该如何选择未来的职业道路
  8. java520.1314表白_520表白套路对话大全 表白算式521.1314大全
  9. 盘点7大影视类宝藏公众号,影迷/编导生必备,强烈推荐第3个【覃小龙课堂】
  10. 深度学习tracking学习笔记(2):图像/视觉显著性检测技术发展情况梳理(Saliency Detection、Visual Attention)
  11. MySQL复制表结构、表数据的方法
  12. malloc()动态分配内存
  13. 走进计算机病毒-受限文件夹的建立
  14. 成都java培训要多少钱
  15. mac下实现内外网通用
  16. 每日总结(第一天)(2020/3/27/22:11)(1/90)
  17. hs8545m5虚拟服务器,华为HS8545M光猫怎么开启路由功能
  18. 杰西·李佛摩尔的股市存亡战
  19. 你的、我的、我们的翻转课堂
  20. Android记录22-关于开发中账号绑定的逻辑处理

热门文章

  1. apple watch更新系统时出现红色感叹号解决方法
  2. Godot实现项目差异热更新
  3. 【数字信号去噪】基于matlab小波阙值数字信号去噪和求信噪比【含Matlab源码 2191期】
  4. Spring学习【2】
  5. 一个9年运维的经验之路
  6. 生产内存溢出定位分析
  7. 常见字母组合发音规律
  8. 花呗能不能不还?支付宝说春节集五福中彩蛋可帮还
  9. VMware vSphere 介绍、安装 服务器虚拟化部署完整配置
  10. matlab中m文件是什么,MATLAB中M文件的使用