C复习手记(Day1)

it2024-10-18  20

auto存储类所有局部变量默认的存储类  ex:{int mount;auto int month}  auto只用在函数内,只做局部变量
register 存储类:register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。
循环控制机语句:

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

控制语句描述break语句终止 loop 或 switch 语句,程序流将继续执行紧接着 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); /* 用指针方式输出了这三个域的值 */ }

转载于:https://www.cnblogs.com/wrs9527/p/wrs9527.html

相关资源:匠人手记-完整版.zip
最新回复(0)