C复习手记(Day1)

时间:2022-10-09 23:47:02
  • auto存储类:所有局部变量默认的存储类  ex:{int mount;auto int month}  auto只用在函数内,只做局部变量

  • register 存储类register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。

  • 循环控制机语句:

循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建的自动对象都会被销毁。C 提供了下列的控制语句

控制语句 描述
break语句 终止 loopswitch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。
continue语句 引起循环跳过主体的剩余部分,立即重新开始测试条件。
goto语句

将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。


  • 函数参数调用:

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有两种向函数传递参数的方式:

调用类型 描述
传值调用 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
引用调用 该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。


  • 传递数组给函数

    如果您想要在函数中传递一个一维数组作为参数,您必须以下面三种方式来声明函数形式参数,这三种声明方式的结果是一样的,因为每种方式都会告诉编译器将要接收一个整型指针。同样地,您也可以传递一个多维数组作为形式参数。

    方式一(形参是指针)

    void myFunction(int *param) {……….}

    方式二(形参是一个已定义大小的数组)

    void myFunction(int param[10]) {……….}

    方式三(形参是一个未定义大小的数组)

    void myFunction(int param[]) {……….}


  • 从函数返回数组

    C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:

    int * myFunction() {}

    另外,C不支持在函数外返回局部变量的地址,除非定义局部变量为static变量


  • 指针取数组地址

    ex:         {….int var[10],int *ptr;…..

    ptr = var;            /*指针数组地址*/

    ptr = &var[10-1];  /*指针中最后一个元素的地址*/     }


  • 字符串操作函数

    函数 描述
    strcopy(s1,s2) 复制字符串 s2 到字符串 s1的末尾
    strcat(s1,s2) 连接字符串 s2 到字符串 s1的末尾
    strlen(s1) 返回字符串s1的长度
    strcmp(s1,s2) 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
    strchr(s1,ch) 返回一个指针,指向字符串s1中字符ch的第一次出现的位置
    strstr(s1,s2) 返回一个指针,指向字符串s1中字符串s2的第一次出现的位置

  • 结构体为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型    ex:
  • struct Books
    {
    char title[50]; /*member define*/
    char author[50]; /*member define*/
       char  subject[100];/*member define*/
    int book_id; /*member define*/
    } book; /*实例*/

    指向结构体的指针:

    struct book *struct_pointer;

    struct_pointer = &book;

    /*访问结构成员*/

    struct_pointer –> title;


  • 位域

    有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。

    所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

    典型的实例:1、用 1 位二进位存放一个开关量时,只有 0 和 1 两种状态。

         2、读取外部文件格式——可以读取非标准的文件格式。例如:9 位的整数。

  • 位域的定义和位域变量的说明

形式:  struct  位域结构名 {位域列表}

位域列表形式:  类型说明符 位域名:位域长度

ex:struct bs{int a:8;

int b:2}data

说明data为bs变量,共占两个字节;其中位域a占8位,位域b占2位,剩余6位空着。

注:

1、一个位域必须存储在同一个字节中,不能夸两个字节,如一个字节所剩空间不够存放另一位域时,应从下一单元起开始存放该位域。

2、由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。如果最大长度大于计算机的整数字长,一些编译器可能会允许域的内存重叠,另外一些编译器可能会把大于一个域的部分存储在下一个字中。

main(){
struct bs{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1; /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
bit.b=7; /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
bit.c=15; /* 给位域赋值(应注意赋值不能超过该位域的允许范围) */
printf("%d,%d,%d\n",bit.a,bit.b,bit.c); /* 以整型量格式输出三个域的内容 */
pbit=&bit; /* 把位域变量 bit 的地址送给指针变量 pbit */
pbit->a=0; /* 用指针方式给位域 a 重新赋值,赋为 0 */
pbit->b&=3; /* 使用了复合的位运算符 "&=",相当于:pbit->b=pbit->b&3,位域 b 中原有值为 7,与 3 作按位与运算的结果为 3(111&011=011,十进制值为 3) */
pbit->c|=1; /* 使用了复合位运算符"|=",相当于:pbit->c=pbit->c|1,其结果为 15 */
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c); /* 用指针方式输出了这三个域的值 */
}