初识c语言系列(五)初始完结篇、关键字、指针、结构体

常见关键字

c语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。常见的关键字有如下这些

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

我们先简单介绍其中几个,剩下的关键字我们在今后的学习中在与大家分享。

关键字typedef

typedef顾名思义就是类型的定义,我们可以理解为是对类型的重命名。比如我们可以把复杂的类型名称重新定义成方便我们书写的类型名称。例如:


int main ()
{
	typedef unsigned usit;
	
	unsigned int num1 = 0;//这里的unsigned指的是无符号的整形
	usit num2 = 0;
	//这里的num1 和 num2 的类型是一样的

	return 0;
}

关键字static

c语言中static是用来修饰变量和函数的

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

当我们创建变量时都会向内存申请空间用于储存变量,不同的变量会储存在内存不同的区域,例如局部变量会储存在内存的栈区,全局变量会储存在静态区,堆区的空间比较大,需要自己申请,自己释放,用于动态内存的开辟,例如malloc()当然这些的是后话了,了解了这些之后让我们看看在关键字static的修饰下,这些变量和函数究竟发生了什么变化。

static修饰局部变量

#include <stdio.h>

void test() {
	int a = 3;
	a++;
	printf("%d", a);
}

int main()
{
int i = 0;

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

上述代码中的int a = 3;是一个局部变量,所以当test函数结束后,局部变量a被释放,最后输出的结果是4444444444十个4,那么如果我们用static修饰int a = 3这个局部变量结果又会怎样呢?

#include <stdio.h>

void test() {
	static int a = 3;
	a++;
	printf("%d", a);
}

int main()
{
int i = 0;

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

我们再次执行,输出的结果为45678910111213,这是为什么呢?原因是普通的局部变量是放在内存的栈区上的,进入局部范围,变量创建,出来局部范围变量销毁。当static修饰局部变量的时候,局部变量实在静态区开辟的内存空间,这时的局部变量,出了作用域变量不销毁,下次进入时,使用的是上一次遗留的数据。总结一下static修饰局部变量的作用为

改变了存储位置,由栈区->静态区,使得变量的生命周期发生了变化

static修饰全局变量

#include <stdio.h>
 int year = 2022;
#include <stdio.h>

extern int year;//声明外部符号

int main()
{
printf("%d\n,year);

return 0;
}

全局变量是具有外部链接属性的,extern声明一下就可以在其他源文件中使用全局变量。如果使用static修饰全局变量会有什么变化呢?

#include <stdio.h>
static int year = 2022;

我们发现,使用static修饰后的全局变量,在其他源文件中无法使用。这是因为,如果全局变量被static修饰,外部链接属性就变成了内部链接属性其他源文件没法在通过链接找到这个符号。

static修饰后的全局变量只能在自己所在的.c文件内部使用

static修饰函数

修饰函数同全局变量,函数是具有外部链接属性的,其他源文件想使用函数,只需要声明就可以。但是函数被static修饰,外部链接属性就变成了内部链接属性,这个时候函数只能在自己所在的.c文件内部使用,不能在外部使用。

指针

想要理解指针,我们需要对计算机中的内存有一定的了解。内存是电脑上的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,计算机把内存划分成立一个个小的内存单元,每个内存单元的大小是一个字节。为了能够有效的访问到内存的每个单元,就给每个内存单元进行了编号,这些编号被成为该内存单元的地址
在这里插入图片描述
了解了内存之后我们在讲讲指针的使用。

#include <stdio.h>

int main ()
{
int a =4;
int* pa = &a;//pa是创建出来存放地址(指针)的,pa就是指针变量
*pa = 20;//*是解引用操作符,*pa就是通过pa中存放的地址,找到pa指向的空间

printf("%d",a);

return 0;
}

我们创建一个局部变量int a = 4;占用了4个字节,每个字节都有一个地址(编号),&a拿到的是第一个字节的地址。int* pa = &a;int说明是pa指向的对象是int类型的,*说明pa是指针变量,int*整体是一个类型整形指针类型

总结一下
1.指针其实就是地址,地址就是内存单元的编号。
2.把地址进行存储的时候,就可以放到一个变量中,这个变量就是指针类型
口头语中说的指针,一般都是指指针类型。

我们都知道int char float等变量都有大小,那么指针变量的大小是多少呢?因为指针变量是用来存放地址的,所以指针变量的大小取决于存储第一个地址需要多大的空间,因为&a拿到的是第一个地址。在32位操作系统下有32跟地址线所以有32个0或1组成的地址序列,需要32个bit,所以每个地址占4个字节,所以指针变量的大小需要4个字节的空间存储,同理64位环境下,指针变量需要8个字节进行存储。

结构体

我们在这之前了解了很多数据的类型,那些都是简单的数据类型,但当我们描述一个复杂的数据类型时,不能简单的使用int float进行描述,c语言中提供了结构体来描述复杂对象。例如下面的代码创建了一个学生的复杂类型。

#include<stdio.h>

struct Stu
{
	char name[20];
	int age;
	float score;
};

void Print(struct Stu* ps)
{
	printf("%s %d %f\n", (*ps).name, (*ps).age, (*ps).score);
	printf("%s %d %f\n", ps->name, ps->age, ps->score);
}



int main()
{
	struct Stu s1 = { "zhangsan", 20, 95.5f };
	struct Stu s2 = {"lisi", 40, 99.8f};

	scanf("%s %d %f", &(s2.name), &(s2.age), &(s2.score));

	printf("%s %d %f\n", s1.name, s1.age, s1.score);
	Print(&s2);

	return 0;
}

在这里我们大致了解一下结构体是什么就可以了,在今后的学习中我们在进行细致的分享。好了到这里我们的初始c语言系列就结束了,不知道大家有没有收获呢?

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悲伤猪小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值