【初识C语言 (三) 】#纯竿获,一看就明白#

/希望能帮到大家/

11.常见关键字

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

C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。
注:关键字是不能自己创建的哦!
接下来向大家介绍几个关键字:

11.1 关键字 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;
}

11.2 关键字static

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

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

11.2.1 修饰局部变量

笔如:

//代码1
#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和代码2的实际效果来帮助大家理解static修饰局部变量的意义,快去试试吧。
结论:

static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束

11.2.2 修饰全局变量

来对比下这两组代码吧。

 //代码1
//add.c
int g_val = 2018;
//test.c
int main()
{
    
    
    printf("%d\n", g_val);
    return 0;
}
//代码2
//add.c
static int g_val = 2018;
//test.c
int main()
{
    
    
    printf("%d\n", g_val);
    return 0;
}

代码1正常,而代码2在编译的时候会出现连接性错误。
结论:

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

11.2.3 修饰函数

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

这里也是同上面一样的
代码1正常,代码2在编译的时候会出现连接性错误。
结论:

一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。

关键字就分享到这里啦,其他的关键字后续还会慢慢跟大家分享。

12. #define 定义常量和宏

在C语言中怎样定义一个常量呢?

在C语言中药定义一个常量需要用预处理器来进行,定义的内容是写在开头部分的,格式如下:#define 常量名 值,常量名一般使用大写,注意值后面不用加分号。

笔如:

 //define定义标识符常量
#define MAX 1000
//define定义宏
#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;
}

13. 指针

13.1 内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地
址。

说白了其实就可以这么理解:指针=地址=内存

变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
笔如:

取出变量地址如下:

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

那么地址如何储存呢?需要定义指针变量。
笔如:

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

再看看指针的使用实例吧。

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

以整形指针举例,可以推广到其他类型,笔如:

#include <stdio.h>
int main()
{
    
    
 char ch = 'w';
 char* pc = &ch;
 *pc = 'q';
 printf("%c\n", ch);
    return 0;
}

13.2 指针变量的大小

指针的大小与其指向的内存中存储的变量类型无关,它只与计算机操作系统有关,在32位操作系统中,指针的大小是4个字节;64位操作系统中,指针的大小是8个字节

#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;
}

指针变量作为C语言中的特殊数据类型,除了用于存储内存地址之外,它与其他类型比较是否具有其他特点呢?
接下来对指针类型进行分析,剖析指针类型的特点。接下来通过定义不同的指针变量类型,计算不同类型指针变量的大小。
笔如下图:
在这里插入图片描述
代码运行结果如下:
在这里插入图片描述

14. 结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
笔如:描述一名学生的身份信息的标准方式:

#include <stdio.h>
struct student //结构体类型的说明与定义分开。//声明
{
    
    
int age;  /*年龄*/
float score; /*分数*/
char sex;   /*性别*/
};
int main ()
{
    
    
struct student a={
    
     20,79,'f'}; //定义
printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
return 0;

再来看看结构体的初始化:

//打印结构体信息
struct Student m= {
    
    "杰克"18"男""20051001"};
//.为结构成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
//->操作符
struct Student *pm = &m;
printf("name = %s age = %d sex = %s id = %s\n", pm->name, pm->age, pm->sex, pm-id);

这种方式属于将它们定义后逐个赋值。

好啦,本次分享就到这里啦,帮到大家就是能给到我的最大Surprise!

猜你喜欢

转载自blog.csdn.net/weixin_73807021/article/details/129074089