知识点补充(C语言)

165 阅读6分钟

一、字符串

定义的方法

1.静态数组构造:

char a[长度] ,(a即为首地址==&a[0])

2.指针动态构造数组

char * p=(char *)malloc(长度);//其p的内容相当于有了动态分配空间的首地址

3. 初始化字符串

image.png

输入的方法

1、利用scanf

scanf("%s",地址);遇到空格即终止输入

2、利用gets(功能单一,只用于字符串的输入)

gets(地址);空格也默认为是字符串的一部分

3、利用while(ch=getchar())
   输入字符串,按换行后,则getchar根据循环逐一获取字符,局限必须要用while

输出的方法

1.printf

功能多样,输入后不换行

2.puts
格式:
   puts(地址)
功能:
   功能单一,只用于字符串输出, 且输出后自动换行。

strlen函数(要加头文件 #include <string.h>)

格式:strlen(数组名(地址))
功能:读取字符串的长度,但会忽略结束符(\0);

注意点

1、字符串长度的问题

字符串输入后,其长度会加1,因为里面有个结束符"\0",用于终止输入和输出
所以只能char a[4]="had";长度是4,不是3

二、结构体

什么是结构体

一个属性当中其元素的集合

为什么需要结构体

1.因为现实当中,事物的属性远比简单数据类型复杂多变。所以我们经常把同意属性归为一类成为结构体(好比一个人的年龄,升高,体重,事业都是描述这个人的属性)
2.增加便利性:因为若无发送实参,和接受的形参定义太多了,所以及不便利;而我们使用了结构体,只需定义一个结构体变量,然后发送其地址,用指针来处理问题,其在函数中就可以直接调用其结构体中的内部成员。

简单结构体

  • .定义结构体 三种: 我们只讲一种

声明结构体:

struct 类型名(其整体为一个结构体数据类型)
{
    数据类型 成员名;
    ........
 
};

定义结构体变量

  • .结构体赋值和初始化

    1.定义的同时可以进行整体赋初值
    2.定义完之后,就只能单个赋初值

  • .如何取出结构体的每一个成员 三种常见:变量名.成员名 或者 指针变量->成员名(或为 (*指针变量).成员名)

结构体数组

  • 静态结构体数组(和普通数组差不多) 把其当作普通数组来看待,只是说每个元素里面又包含了许多小成员,(这就是好比可以存储多名同学的数据)

      struct student str[];  
      str[].age;
      
      反例:struct student * q[4];//表示q可以连续存放4个struct student
      类型的地址,就不表示结构体数组了
      
    
  • 动态结构体数组

      struct student * p=(struct student *)malloc(字节数);
      p[].age或者*(p+..)age。而不能p->age[]
      且我们只能用指针来输出其中的内容,而不能用定义的普通结构体变量
      
    

image.png

定义了两个结构体变量:  
一个为指针p,且构造了一个动态数组  其里面结构体存放在连续的内存单元中
另一个为普通变量str  其里面结构体存放在另一个连续的内存单元中
所以两个不同的存储单元,互不干涉

对于结构体的核心理解;

1、一个结构体就相当于一个数据类型,
用这个结构体类型定义的变量(所占字节数比较复杂),就相当于int类型定义的变量(其所占四个字节);int i与同类型int j,其i可与j相互赋值,则结构体变量也可相互赋值
2、一个结构体变量
结构体变量就像包含了许多小变量,而其用来赋值时为 变量名.成员名 或者 指针变量->成员名(或为 (*指针变量).成员名)

三、文件操作

文件定义

1.分类

对程序而言分为两类:程序文件,数据文件

  • 程序文件:
  • 数据文件:
2.两文件之间在程序运行时的操作

数据文件

1.文件名
2.文件类型
3.对于FILE的解读
4.几个重要与文件有关的函数

其它的一些小知识

1.流

和之前不同的是,数据所输入输出的对象从终端变成了文件。如printf,scanf分别是将数据输出到屏幕和从键盘输入数据。 如今我们可以将屏幕和键盘换成文件,对文件进行输入和输出。、 流主要是指一种逻辑上的概念,产生数据的叫输入流,消耗数据的叫输出流。至于产生和消耗,因设备不同而有所差异,但C语言中对它们一视同仁,以“流”代之。

将字符放入文件中,或打印到屏幕上,这里的文件和屏幕就是外部设备。如屏幕、网络、文件,硬盘都是外部设备。不同设备的读写方式肯定不一样,为方便起见,故抽象出“流”的概念,以一个“流”字来概括它们的特征。故可把流看作是一种数据的载体,通过它可以实现数据交换和传输,传递数据的方式由“流”决定。我们仅需将数据放入“流”当中即可。

getchar和putchar函数

1.格式:

  char ch=getchar();//getchar 只能获取一个字符,将其赋值给ch;
  putchar(ch(变量)或'字符')//putchar 也是只能输出一个字符,

2.getchar原理和putchar

当使用getchar时,键盘在终端可以输入字符串,每输入一个字符,字符逐一送入缓冲区
进行保存,然后按下回车键(缓冲区进行刷新)(回车键也是字符,也会送入缓冲区),
然后getchar就每执行一次,就按顺序读取缓冲区里的字符一个,所以如果不用while循
环利用getchar则就不能完整读取输入的字符串,缓冲区刷新完之后,getchar读取就停
止了
putchar 也是和getchar一样,ch变量中的数据会被逐一送入缓冲区,然后被putchar
一个一个输出,缓冲区刷新完之后,也就输出停止,且会自动换行

这就很好解释了为什么getchar是一个一个读取,且回车键也是字符被送入缓冲区
image.png

指针和二维数组

image.png