初识C语言(3)

关键字typedef

typedef类型重命名,例如:

//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名,可以定义变量时候直接使用。
typedef unsigned int uint_32;
int main()
{
  //num1和num2,这两个变量的类型是一样的
  unsigned int num1 = 0;
  uint_32 num2 = 0;
  return 0;
}

关键字static

static 可以修饰局部变量
static可以修饰全局变量
static可以修饰函数
在这里插入图片描述

修饰局部变量

static修饰局部变量,可以改变变量的生命周期,使其延长,一直到程序结束,但是作用域不变,例如:

#include <stdio.h>
void test()
{
  int i = 0;
  i++;
  printf("%d ", i);
}
int main()
{
int i = 0;
  for(i=0; i<10; i++)
 {
    test();
 }
  return 0;
}


//代码2
#include <stdio.h>
void test()
{
  //static修饰局部变量
  static int i = 0;
  i++;
  printf("%d ", i);
}
int main()
{
int i = 0;
  for(i=0; i<10; i++)
 {
    test();
 }
  return 0;
}

在这里插入图片描述
在这里插入图片描述
通过上面两个代码段,我们可以很清晰的看到,代码1 调用函数test()时,为i开辟了一个空间,程序调用完后,空间释放,再次进入需要重新开辟;代码2调用test()时,也为整形i开辟一个空间,但是调用程序结束时,i的空间并没有释放,下次进入时,跳过开辟空间的这段代码,直接执行下一条语句。由此可见static修饰局部变量,可以改变变量的生命周期,使其延长,一直到程序结束。

修饰全局变量

首先需要明确的是,同一文件下,不同源文件之间的定义全局变量时,是具有外部链接属性的举个例子:
在这里插入图片描述
当我们在test.c中想使用 在add.c定义的全局变量g_val时,我们只需要在tset.c中 外部声明一下,就可以使用了。
当我们用,static修饰这个全局变量的时候,就会改变g_val这个全局变量的作用域,使其只具备内部链接属性。只能在本源文件内部使用。

修饰函数

其实修饰函数跟修饰全局变量是差不多的,当我们使用static修饰函数时候,它也只具备内部链接属性。例如:

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

#define 定义常量和宏

当#define定义标识符常量时候,需要注意大写字母表示,例如:

#define MAX  1000;

在接下来使用常量1000时,都可以用我们定义的标识符 MAX 代替。
#define定义宏,例如:

// ADD是宏的名字,x,y是宏的参数,()是宏体
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
  int sum = ADD(2, 3);
  printf("sum = %d\n", sum);
 
  sum = 10*ADD(2, 3);
  printf("sum = %d\n", sum);
 
  return 0;
}

指针

想要了解指针,我们得先了解内存,程序运行时候会载入内存,程序中如果有数据需要存储也会开辟内存空间,例如我们在程序中定义一个整形变量时候,程序会为其开辟一个四个字节的空间 如下图所示:
在这里插入图片描述
在实践中,一个内存单元占用一个字节,当我们开辟完空间之后,我们如何查到这个空间呢,这就产生了地址,我们可以通过编号给每个地址进行有序的编号,也叫指针,就像生活中我们也是通过地址去寻找某个人一样,程序中的内存空间地址是怎么定义的呢,它会占据内存空间吗,用32位电脑举例,32位电脑有32根物理地址线,32根真实存在的线,通过通断电,让其产生高低电平,产生01的二进制数字信号,从而产生2^32次方个地址。

在这里插入图片描述
地址如何存储呢,这时候我们就需要定义指针变量例如:

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

p用来存储指针(地址),所以p叫指针变量,因为指针指向的内容是整形,所以它的类型是int*型。我们可以通过解引用开改变地址里存储的变量 例如:

#include <stdio.h>
int main()
{
int num = 10;
int *p = &num;
*p = 20;
  return 0;
}

当我们定义不同类型的指针变量之后,指针变量所占内存空间为多大呢,其实指针指向的都是各个变量的首地址,变量内部都是存储首地址的,我们知道地址是三十二位 也就是四个字节,所以不管什么类型的指针变量他的大小都是四个字节。
例如:
在这里插入图片描述

结构体

我们在定义年龄,身高,体重的时候,可以 用整形变量,双精度浮点型 在内存上开辟空间存储,但是我们想要描述一个人比如一个学生的信息时候,单独一种变量似乎无法满足,这时候就产生了结构体,结构体使得c语言有能力描述复杂的类型例如:

struct Stu
{
  char name[20];//名字
  int age;    //年龄
  char sex[5];  //性别
  char id[15]//学号
};

当我们把一个学生的信息用结构体表达完成后,我们也要对他进行初始化,这时候就用到我们上文提到的访问结构题操作符 . 和->例如:

//打印结构体信息
struct Stu s = {"张三"20"男""20180101"};
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps-
>id);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值