初识c语言3

文章介绍了C语言中的typedef关键字用于类型别名,static用于改变局部变量和全局变量的生命周期,以及指针的基本概念,包括如何获取变量地址、存储地址和通过指针访问变量。同时提到了结构体在描述复杂数据类型中的作用。
摘要由CSDN通过智能技术生成

#初步认识C语言
##了解一下大概的知识点
出于一些原因上周没有更新文章😁😁。
希望大家能够坚持,每天练习C语言。古人云:“”孰能生巧”。每天坚持学习并且写C语言,你必定能够成为一个优秀的程序员并且能够找到一个好的offer。
上一章我们提及了常量,字符串+转义字符+注释,选择语句,循环语句,函数,数组,以及操作符。

一.常见的一些关键字
auto , break , case , char, const, contin

cppue, default , do, double , else , enum , exrern , float , for ,goto , if , int , register, return , short , signed , sizeof , static , strust , switch , typedef , union , unsigned , void , volatile ,while

这些关键词有些是数据类型有些是函数名称还有些是语法句子

以下讲解两个比较常见的关键词:
1,typedif
顾名思义type是类型的意思 而def代表的是define也就是定义
这里应该理解为重定义的意思
一个代码解释一下

#include<stdio.h>
typedef int arr;
//这里typedef的目的是将int类型重命名为arr,
//所以这个时候arr也成了一个类型名;

int main()
{

	int a = 0;
	arr b = 0;
	//注意观察这个a,b他们的类型是相同的。
	printf("%d\n", a);
	printf("%d\n", b);
	//这里的输出结果应该是
	//0
	//0
	return 0;
}

这里我们就可以看出typedef的作用是起到一个重命名的作用。
本来整型就是int,但是经过typedef的作用下arr也变成了一个与int类似的类型。


2,static
static是用来修饰函数与变量的

修饰局部变量称为——静态局部变量
修饰全局变量称为——静态全局变量
修饰函数被称为——静态函数

通过举例说明他对于局部,全局变量以及函数的作用。
代码一

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

ldopc()
{
	int c = 0;
	c++;
	printf("%d\n", c);
	return 0;
}
int main()
{
	int a = 0;
	for (a = 0; a < 10; a++)
	{
		ldopc();
	}
	
	return 0;
}

这里的输出结果是
1
1
1
1
1
1
1
1
1
1
因为c在ldopc这个函数里面是一个局部变量所以他的生命周期从进入函数开始出这个函数结束。当再次进入这个函数时c的值依旧是从c=0开始。
下面给出第二个代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

ldopc()
{
	static int c = 0;
	c++;
	printf("%d\n", c);
	return 0;
}
int main()
{
	int a = 0;
	for (a = 0; a < 10; a++)
	{
		ldopc();
	}
	
	return 0;
}

结果为:
1
2
3
4
5
6
7
8
9
10
这里在int c前面加了一个static
对比于代码一,我们可以看出:
这里c每次运行都保持了原来所拥有的值。

static改变了局部变量的生命周期,让局部变量的作用域一直到程序结束,生命周期才结束。
这里static的作用是使局部变量的生命周期变长了。

3,修饰全局变量
代码一

//文件lc.c
int lc = 2022;
//文件ldopc5.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{

	extern lc;
	printf("%d\n", lc);
	return 0;
}

输出结果是2022
这里有两个文件,(但是只能有一个主函数)lc在这里是一个全局变量。(全局变量不仅仅存在与当前的一个文件也可以存在于另外一个源文件,他的作用域是全局所以也能够使用)。
extern是一个关键字(也是全局变量能够引用的关键)他的意思是声明作用,就是告诉你在另外的一个源文件里定义了一个变量。

用法可以参照代码块里。

代码二

//文件lc.c
static int lc = 2022;
//文件ldopc5.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{

	extern lc;
	printf("%d\n", lc);
	return 0;

在这里插入图片描述

这里使用了static后发现结果是不能检测外部文件(报错了!!!!)。
所以我们说static对于全局变量来说是:
使得该变量仅仅只能在该源文件的内部使用不能在其他的源文件中使用。

4,修饰函数
也是使用代码的形式来说明。
代码一:

//文件lc.c
 int lc(int a, int b)
{
	int z = 0;
	z = a + b;
	return z;
}
//文件ldopc.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2939;
    printf("%d\n", lc(a,b));
	return 0;
}

这里输出结果为2939。

代码二

 static int lc(int a, int b)
{
	int z = 0;
	z = a + b;
	return z;
}
//文件ldopc.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 0;
	int b = 2939;
    printf("%d\n", lc(a,b));
	return 0;
}

在这里插入图片描述
这里也发现外部符号lc(也就是定义的lc函数)无法解析。
所以我们可以看出static在这里的作用:
使得本函数只能在本源文件内使用而不能在其他的源文件内使用。

2,然后就是#define定义常量和宏
#define定义变量。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define max 100//这个是define定义常量的格式。
int main()
{
	printf("%d\n", max);
	return 0;
}

复习一下前面所学的define定义变量的知识点
#define定义的宏:
#define机制包括一个规定,即允许把参数替换到文本当中去,这种就称之为#define定义的宏
举几个例子说明一下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define lc(x) x*x//注意这里lc后面的括号必须要与lc紧紧挨着不然就会看成后面x*x的一部分
                     //这是C语言所规定的一个语法规则。
int main()
{
	printf("%d\n", lc(5));/5这个参数可以调换到括号里的x中去。
    //注意这里的使用方法。
	return 0;
}

再给一个代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define lc(x) x*x
int main()
{
	printf("%d\n", lc(5+1));
	return 0;
}

这里你们肯定会觉得是36但是
答案为11
因为参数传上去为5+1*5+1

所以这个计算为先算这个1*5在计算加法因为在C语言中乘法的优先级大于加法的优先级。
关于计算优先级的算法我们以后再讲。因为内容有些多。

那我们应该怎么解决这个问题呢?
下面给出解决方法.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define lc(x) x*x
int main()
{
	printf("%d\n", lc((5+1)));
	return 0;
}

我们只需要在这个5+1这里加上一个括号就行了
或者我们也可以在宏定义上加上两个括号例如
define lc(x) (x)*(x)注意这里lc与后面那个括号应该是紧挨着的
这里是因为格式的差异

5,指针
再讲指针时我们先聊聊内存的意思
5.1
内存是电脑特别重要的器,计算机的程序运行都是在内存中运行的。
所以为了有效的使用内存的话,就将内存分为了一个个小小的内存单元,每个内存单元的大小是一个字节。
为了能够有效的访问到每一个内存单元,就给每一个内存单元进行了编号,这些编号被称为该内存单元的地址。

然后变量是创建在内存单元中的(在内存单元中分配空间),因为,每一个内存单元都有地址,所以变量也是有地址的 。
————–——————————————————————————
这里我们该如何取出一个变量的地址呢?
代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 0;
	&a;//这里叫做取出a的地址
	printf("%p\n", a);
	return 0;
}

%p就是用来打印地址的一个符号。

那地址又该如何储存勒?
给出一个代码解释:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 10;
	
	int *p=&a;//这个p叫做指针变量.
	printf("%d\n", p);
	return 0;
}

地址应该储存在指针变量里面。

那储存了地址之后应该如何使用呢?
一个代码解释:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 10;
	
	int *p=&a;//这个p叫做指针变量.
	*p = 20;//*叫做解引用操作符,间接访问操作符。
	printf("%d\n", a);
	return 0;
}

这个输出结果为20。这里是*p是直接访问a的储存空间然后给a赋值。

类似于int类型其他类型也是一样的例如:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    char arr ='a';
    char *p= &arr;
	*p = 'b';
	printf("%c\n", arr);
	return 0;
}

而对于指针的大小解释:
指针变量的大小取决于地址的大小。
32位平台下的地址是32bit位也就是四个字节。
64位平台下的地址是64bit位也就是8个字节。
添加链接描述
这里将给你解释关于指针大小的原因。

6,结构体
结构体是C语言中特别重要的知识点,它能够使c语言有能力去描述复杂类型
比如:
一般来说我们在电脑存储的数据只有二进制数字,对于描述字符跟数字很简单,但是对于一个人,一个物品C语言又该如何去描述呢?
这里我们引进了结构体:
比如描述一个人:
身高+体重+性别+名字等
这里就只能用结构体去描述了
例如:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct people
{
	char name[13];//这里一个数组表示名字的英文字符的表示。
	int height;//这里表示身高。

};
int main()
{
	//这里利用结构体类型创建一个结构体类型变量
	struct people an = { "名字",180};//这里打印结构体的信息
	struct people* arr = &an;
	
	printf(" %d\n", (*arr).height);
	printf("%s\n", (*arr).name);
    //这里利用arr打印出名字与身高
     //这里还有一种表达方式
     //printf(" %d\n", (*arr)->height);
	//printf("%s\n", (*arr)->name);
	return 0;
}

这里的输出结果
名字
180
对于结构体的初始化:
打印消息体的结构struct people an = { “名字”,180};

**为结构体成员访问操作符
printf(" %d\n", (arr).height);
printf(“%s\n”, (arr).name);

第二种:
**printf(" %d\n", (arr)->height);
printf(“%s\n”, (arr)->name);

到这里我们的初识的C语言就已经结束了。
下次文章就是对于知识点 的细讲了。
拜拜6跟我同为小白的人们。
请添加图片描述
期待下一次的见面。
请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值