0
点赞
收藏
分享

微信扫一扫

C语言第五课

钵仔糕的波波仔 2022-04-13 阅读 84
c语言

目录

  1. 常见关键字
    1.1 关键字 typedef
    1.2关键字static
  2. #define 定义常量和宏
  3. 指针
    3.1内存
    3.2指针变量的大小
  4. 结构体

1.常见关键字

关键字–C语言本身内置的,关键字不是自己创建出来的,也不能创建出来的。C 语言一共有32个关键字,根据功能不同,可以分以下四类:

其中auto(自动变量)是常常被忽略的关键字

auto) int a=10;//自动变量,auto被忽略

1.1关键字typedef

typedef 顾名思义是类型定义,这里应该理解为类型重命名。typedef只针对类型。

#include<stdio.h>
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
printf("%d %d",num1,num2);
return 0;
}

在这里插入图片描述

1.2关键字static

在C语言中:static是用来修饰变量和函数的

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

static修饰局部变量

a. 函数中局部变量:
声明周期延长:该变量不随函数结束而结束
初始化:只在第一次调用该函数时进行初始化
记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
存储位置:不会存储在栈区,放在数据段
例如:无static修饰的局部变量


```bash

```bash

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

在这里插入图片描述
有static修饰的局部变量:

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

在这里插入图片描述
可以看出没有static修饰局部变量a时候,输出结果是10个2,有static修饰局部变量a的时候,输出结果是2到11。这是因为static修饰局部变量时候,局部变量出来作用域,不被销毁的,本质上static修饰局部变量,是通过改变变量的储存位置由栈区变到静态区,也使该变量的生命周期变长,使其生命周期和程序生命周期一样。

static修饰全局变量

全局变量是具有外部链接属性的(编译+链接=可执行程序)
static修饰全局变量时候,全局变量的外部链接属性变成了内部链接属性。其他源文件(.c)就不能再使用这个全局变量。(作用域变小了)
例如:没有static修饰全局变量时候
在这里插入图片描述
有static修饰全局变量时候
在这里插入图片描述

static修饰函数

函数也具有外部链接属性,被static修饰时候,外部链接属性变为内部链接属性,其他源文件(.c)不能再使用该函数。
例如,没有static修饰函数时候:

有static修饰函数时候:

2.define定义常量和宏

//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))//其中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;
}

以后详细讲解。

3.指针

指针是程序数据在内存中的地址,而指针变量是用来保存这些地址的变量。

3.1内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。例如:
在这里插入图片描述
就比如一栋居民楼中每一个房间都有一个编号,可以通过这些编号快速查询到相应的房间。

上图中0x00AFFDF0是储存a的地址,也是向内存申请4个字节中的首地址,其中&是取地址操作符
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。取出变量地址如下:

#include <stdio.h>
int main()
{
int num = 10;
&num;//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
return 0;
}

在这里插入图片描述
此时0053FD9C是num的地址。
内存单元:编号–》地址–》地址也被称为指针
那地址如何存储,需要定义指针变量。存放指针(地址)的变量就是指针变量

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

*说明p是指针变量,int说明p(指针变量)指向的对象是int类型的
在这里插入图片描述
*p是解引用操作符,就是通过p中存放的地址,找到p所指的对象,其中 *p是p的指向对象。

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

指针变量的大小

#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0;
}

在这里插入图片描述
这是32位机器的地址下的指针大小。
在这里插入图片描述
这是在64位位机器的地址下的指针大小。以后详细讲解

结构体

结构体是C语言中特别重要的知识点,结构体使得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);//结构体指针变量-->成员名

在这里插入图片描述
以后详细讲解。

总结

今天学到了很多知识点,特别是结构体是C语言中很重要的知识点,指针又是C语言中的难点,这些知识点将在以后在小沐文章中揭开神秘面纱。如果以上有什么不足之处,还望指正,谢谢。

举报

相关推荐

0 条评论