前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初学C语言的福音-初识关键字和指针

初学C语言的福音-初识关键字和指针

作者头像
MicroFrank
发布2023-01-16 12:02:27
2840
发布2023-01-16 12:02:27
举报
文章被收录于专栏:同步文章1234同步文章1234

种一棵树最好的时间是十年前,其次是现在

文章目录

  • 一。关键字
  • 1. typedef
  • 2.static
    • 2-1 修饰局部变量
    • 2-3修饰全局变量
    • 2-3修饰函数
  • 3.register
  • 4.define
    • 4-1定义标识符常量
    • 4-2定义宏
  • 二.指针
    • 1-1内存
    • 1-2指针的大小
  • 三. 分支与循环语句
    • 1.什么是语句?
      • 1-1 控制语句:
      • 1-2关于代码风格
  • 2.switch(break和continue)
    • 2-1EOF
    • 2-2getchar和scanf

一。关键字

在这里插入图片描述
在这里插入图片描述

1. typedef

顾名思义:类型重命名 作用:简化书写 作用对象;数据类型

代码语言:javascript
复制
typedef unsigned int uint;
struct Node
{
int date;
struct Node* next;
}Node;
//类型重命名
int main()
{
  unsigned int a=10;
  uint a=10;
  struct Node* Phead;
  Node* Phead;
{

2.static

  • static,顾名思义:静态
  • 修饰的变量称为静态变量
  1. 修饰局部变量
  2. 修饰全局变量
  3. 修饰函数

2-1 修饰局部变量

代码语言:javascript
复制
void show()
{
	static int i = 1;//只初始化一次
	i++;
	printf("%d ", i);
}

int main()
{
	int i = 0;
	while (i < 10)
	{
		show();
		i++;
	}
}

运行结果:

在这里插入图片描述
在这里插入图片描述

反汇编看statia修饰的局部变量:

在这里插入图片描述
在这里插入图片描述

总结static修饰的局部变量的效果:

  • static修饰的局部变量出了作用域不消毁,实际了是改变了局部变量的存储位置.
  • 影响了变量的生命周期,生命周期延长至程序的生命周期

拓展:变量存储位置

在这里插入图片描述
在这里插入图片描述

2-3修饰全局变量

下面的代码涉及:

  • 多文件(多个源文件和一个头文件)的使用
  • extern:多文件使用全局变量或函数的声明,告知编译器其他文件已定义该 变量或函数,但此处为声明,不能赋值
在这里插入图片描述
在这里插入图片描述

总结static修饰的全局变量作用:

  • 改变全局变量的作用域,仅限定在本文件内使用
  • 防止多文件的变量与其重名引发的问题
  • 防止被随意更改,安全性提高

2-3修饰函数

函数也有外部链接属性,该处和static修饰的全局变量极度相相似,这里不过多介绍

3.register

电脑的存储设备: 寄存器(集成到CPU上) 高速缓存(cache) 内存 硬盘

在这里插入图片描述
在这里插入图片描述

rigister修饰的变量的特点:

  • 尽量定义到寄存器中,优点:快
  • 常被定义到被经常被打印的局部变量中,优点:利用率高且占时少
  • 可能被定义到寄存器中,因此不可对变量取地址,原因:寄存器中变量无地址

4.define

替换,注:其非关键字

4-1定义标识符常量

代码语言:javascript
复制
#define NUM 2022
int main()
{
	printf("%d\n", NUM);
	int n = NUM;
	int arr[NUM] = { 0 };
	return 0;
}

4-2定义宏

代码语言:javascript
复制
#define ADD(x,y) x+y
int main()
{
	int a = 10;
	int b = 20;
	int c = ADD(a, b);
	printf("%d\n", c);
}

简单解释宏:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二.指针

1-1内存

  • 内存会划分为一个个内存单元(一个内存单元是一个字节:1byte)
  • 每个内存单元都有一个编号
在这里插入图片描述
在这里插入图片描述

bit 比特位(1byte=8bit) byte 字节 (1kb=1024byte) KB (1MB=1024KB) MB (1GB=1024MB) GB (1TB=1024GB) TB (1PB=1024TB) PB 为什么 一个内存单元是一个字节:一个比特位忒小,一个KB忒大

代码语言:javascript
复制
int a=10;
//向内存申请4个字节的空间,
在这里插入图片描述
在这里插入图片描述

%p和%x打印的区别: %p全部(包括0)打印出来,按地址打印 %x部分(不包括0)打印出来,按数值打印

代码语言:javascript
复制
int a=10;
int* p=&a;
p拿到的是存放变量a的四个字节的内存的首字节的地址
在这里插入图片描述
在这里插入图片描述

*p:解引用操作符,意思是通过p中存放的地址,找到p所指向的对象(内容)

1-2指针的大小

代码语言:javascript
复制
int main()
{
    printf("%d\n", sizeof(char*));
    printf("%d\n", sizeof(short*));
    printf("%d\n", sizeof(int*));
    printf("%d\n", sizeof(float*));
    printf("%d\n", sizeof(double*));

    return 0;
}
  • 不管什么类型的指针,都是在创建变量
  • 指针变量是用来存放地址的
  • 指针变量的大小却决于一个地址存放的时候需要多大的空间
  • 32位的机器:32bit位地址—>4byte , 所以指针变量的大小是4个字节
  • 64位的机器:64bit位地址—>8byte , 所以指针变量的大小是8个字节

32位计算机:

在这里插入图片描述
在这里插入图片描述

64位计算机:

在这里插入图片描述
在这里插入图片描述

三. 分支与循环语句

  • 分支语句:if,switch
  • 循环语句:while for do while

1.什么是语句?

由分号;隔开的就是一条语句 分类:

  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句
1-1 控制语句:

在这里插入图片描述
在这里插入图片描述

C 语言中0为假,非0为真 表达式为假就是0,表达式为真就是1

错误用法:18<=100为假就是0,即使是10为真也就是1,然后后面也成立

在这里插入图片描述
在这里插入图片描述

if只能控制下面的一条语句,含多条语句时得用花括号括起来(这里的if else是一条语句)

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
	if (a == 1)
		if (b == 2) printf("b==2");
		else printf("b==1");
	//上面的代码等价于
	if (a == 1)
	{
		if (b == 2) printf("b==2");
		else printf("b==1");
	}
1-2关于代码风格
代码语言:javascript
复制
	//1.变量的命名(有意义,规范)
	//2.空格,空行,换行
	int firstname = 10;//不好
	int first_name = 10;//好
	int FirstName = 10;//好

这个这样写就是if else的意思(省略else,但是不好阅读代码)

代码语言:javascript
复制
	void test()
	{
		int a = 3;
		if (a == 3)
			return 1;
		return 0;
	}

关于100==age//建议这样写,但是1==num%2就不用 如果少些了一个等号,就会报错,会出现表达式左边必须是可修改的左值的报错。(左右值的概念)

悬空else指的就是else和离他最近的上一个if匹配

2.switch(break和continue)

当要输出星期一-天的时候用if elseif else麻烦,所以用switch

在这里插入图片描述
在这里插入图片描述

备注:case只能放整型&&常量表达式

代码语言:javascript
复制
	int n = 1;
	switch (n)
	{
	case n://错误
	case 2.0://错误

case管的不止一条语句,但是建议加上{},或者封装函数

在这里插入图片描述
在这里插入图片描述

break

Switch可以嵌套(和if一样) 嵌套时: break只能跳出当前的switch(和for的一样)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

continue

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2-1EOF
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2-2getchar和scanf

函数原型:int getchar(void)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

scanf和getchai的区别:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

缓冲区

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
int main()
{
	char str[20];
	printf("请输入密码:");
	scanf("%s", str);
	printf("请确认密码(Y/N)\n");

	int ch = 0;
	while ((ch = getchar()) != '\n');//当输入为925623  25028带有空格的时候,循环干掉这些空格+空格后的字符,'\n'为我们的回车


	//int ch = getchar();//当输入的没有空格的时候,只用干掉我们最后的那个'\n'就可以啦

	char ret = getchar();
	if (ret == 'Y')
	{
		printf("Yes");
	}
	else
	{
		printf("No");
	}


	return 0;
}

非法额

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一。关键字
  • 1. typedef
  • 2.static
    • 2-1 修饰局部变量
      • 2-3修饰全局变量
        • 2-3修饰函数
        • 3.register
        • 4.define
          • 4-1定义标识符常量
            • 4-2定义宏
            • 二.指针
              • 1-1内存
                • 1-2指针的大小
                • 三. 分支与循环语句
                  • 1.什么是语句?
                    • 2.switch(break和continue)
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档