分享

C语言知识总结,你还有哪块知识不懂吗(上)

 岐岐feng 2018-06-03

一、函数

  • 什么情况下需要定义一个函数

  • 常用的功能

  • 重用的功能

  • 低效率的代码

  • 一个函数可以没有参数

void test(void){ //void可以不写 //函数体中不用写返回函数(return)}
  • 一个函数可以没有返回值,如果没有定义,默认是返回int类型

test(int a, int b){ //返回值类型可以不写,如果不写,默认为返回int类型}
  • 在没有接触指针前,函数中的形参是修改不了实参的值的

  • 函数从源文件自上往下执行编译,所以在调用函数之前,需要声明函数

  • 函数内部定义不能和形参同名的变量

  • 默认情况下,不允许两个同名的函数出现

  • 如果函数有声明,没有定义,编译不会报错,链接会报错,因为链接会检测函数是否存在

  • return函数的作用

  • 退出函数

  • 返回一个具体值给函数调用者

  • 函数不强制要求返回,虽然声明了返回值类型,也无济于事

  • 什么叫做链接?

  • 把项目中所有相关联的”.o”文件和C语言函数库,合并在一起,生成可执行文件,期间会检查可能发生的错误,如果出现错误,就会回到编写代码的步骤,修改相应错误代码后,再执行流程

  • 函数的定义和声明

  • 函数的定义放在”.c”文件中

  • 函数的声明放在”.h”文件中

  • main函数返回值0代表正常退出,返回其他值代表异常退出,系统会记录日志

  • printf()函数其实也有返回值,它返回字符串的字节数,在当前的编译器中,中文占3个字节二、指针

  • 定义和初始化指针

int a = 10; //定义了一个int类型的变量int *pa = NULL; //定义了一个int类型的指针pa = &a; //将int类型变量a的地址赋值给pa指针,或者说pa指针指向了变量a*pa = 20; //通过指针简介修改变量a的值,*称为取消引用运算符或间接运算符

C语言知识总结,你还有哪块知识不懂吗(上)

二、指针

  • 指针只能指向相同类型的变量并且指针只能存储地址

  • 任何指针都占用8个字节的存储空间,当然也受编译器的影响

  • 通过指针就可以利用形参修改实参的值,因为指针指向的是地址

  • 指针字符串

//使用char数组存储字符串,这个叫做字符串变量char str1[] = “luoguankun”;//使用指针存储字符串,它指向字符串的首字母//这个称为字符串常量,如果再声明一个字符串值一样的指针字符串//那么他们会指向同一 个字符串,而不会创建一个新的char *str2 = “luoguankun”;
  • %s

  • 上面的输出语句中的%s是字符串输出控制格式符

  • 它从第一个字符开始直到遇到’\0’终止符号结束(不包括)

  • 内存

  • 栈——就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等

  • 堆——就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收

  • 自由存储区——就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的

  • 全局/静态存储区——全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区

  • 常量存储区——这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

  • \0

  • 只有拥有’\0’终止符,才说明这是一个字符串,字符是没有的
  • \0 的ASCII码值为0,也就是false
  • 指针数组

  • 数组就是地址
int *name[5]; name[1] //取出元素下标为1的元素(指针)
  • 字符串数组(两种方式定义)

  • char *name[10] //10个字符串
  • char name[2][10] //二维字符数组,可存放2行字符串,每行有10个字符
  • 指向指针的函数

//定义了一个加法函数int sum(int a, int b){return a+b;}//将定义好的指针指向函数//首先声明一个指针int (*p)(int,int); //其中(*p)代表将来指向的函数,(*p)左右分别为返回值类型和形参定义p = sum; //将指针p指向test函数p(10,22); //通过指针调用函数,它等于sum(10,22);当然在调用之前别忘了声明函数
  • 可以使用sizeof()运算符计算字符串长度(计算的是字节数)

  • sizeof()的结果类型是size_t类型,它在头文件中用typedef定义为unsigned int类型
  • sizeof()运算符可以用任何类型做参数,甚至函数
  • 也可以使用strlen()函数计算字符串长度

  • strlen()只能用char*做参数,且必须是以’’\0’'结尾的
  • 要想使用需要引入头文件
  • 变量类型

  • 全局变量
  • 定义:在函数外面定义的变量叫做全局变量
  • 作用域:从定义变量的那一行开始,到文件结尾
  • 生命周期:当程序启动开始分配存储空间,到程序退出才会被销毁
  • 初始值如果未定义就为0
  • 局部变量
  • 定义:在函数代码块内部定义的变量
  • 作用域:从定义变量的那一行开始到代码块结束
  • 生命周期:从定义变量开始分配存储空间,代码块结束后就会被回收
  • 初始没有确定的值

初学者有什么不懂的可以私信我,需要系统学习资料和系统学习框架图的同学,可关注小编头条号,欢迎留言评论和私信小编。【私信方法】文章上方处点击“作者头像”,进入作者首页,在作者主页上方点击“关注”旁边的“发私信”即可。私信内容:学习帮助。

C语言知识总结,你还有哪块知识不懂吗(上)

三、结构体

数组只能存储一组同类型的数据,而结构体可以保存一组不同类型的数据

  • 定义结构体类型

//以下定义没有分配存储空间,仅仅定义类型

struct Person { int age; int sex; char *name;};
  • 定义结构体变量

struct Person p;
  • 赋值

p.age = 13; //一种方式//另一种方式,初始化的同时进行赋值,同时进行分配存储空间//结构体的存储空间是最大成员字节数的倍数,称为补齐算法struct Person p = {13,1,”luoguankun”};p = {13,1,”luoguankun”}; //这是错误的!只能在定义结构体时赋值
  • 输出结构体中定义的变量值

printf(“age=%d,sex=%d,name=%s”,p.age,p.sex,p.name);
  • 另一种定义结构体变量的方式

//定义类型的同时定义变量,甚至可以不写类型名称,称为匿名结构体,它不能被重用//并且变量名不能重复struct Student{ int age;}stu;
  • 类型不能重复定义,例如上面的Student不能被定义两次,变量名也一样不能重复

  • 结构体数组

//定义结构体类型struct Person{ int age; double height; char *name;}stu;//定义结构体数组变量并赋值初始化struct Person stu[3] ={ {11,12.1,'o'}, {12,12.2,'u'}, {13,12.3,”l'}};//循环遍历结构体数组,并打印for (int i = 0; i < sizeof(stu)="" sizeof(stu[0]);="" i++)="" {="" printf('age="%d,height=%.1f,name=%s\n',stu[i].age,stu[i].height,stu[i].name);}//stu[i]" =="" {4,1.22,”dkdk”};="" 这是错误的stu[i].age="4;">
  • 指向结构体的指针

//省略类型定义,如上,下面使用结构体变量并赋值初始化struct Person stu = {11, 1.73, '罗冠坤'}; //定义了一个指针p并指向结构体变量stustruct Person *p = &stu;//三种输出方法都可以输出数据,作用相同,其中p->成员名的方式较为新颖printf('age=%d,height=%.2f,name=%s\n',stu.age,stu.height,stu.name);printf('age=%d,height=%.2f,name=%s\n',(*p).age,(*p).height,(*p).name);printf(“age=%d,height=%.2f,name=%s\n',p->age,p->height,p->name);//赋值方法的调用方法相同
  • 嵌套结构体

int main(){ struct Date{ int year; //年 int month; //月 int day; //日 }; struct Student{ int no; //学号 //嵌套两个Date来分别表示生日和入学日期 struct Date birthday; //生日 struct Date SchoolDay; //入学日期 }; struct Student stu = { 1, {1989,10,24}, {2009, 9, 1} }; //间接取值,嵌套访问 printf('学号为:%d\n生日为:%d年%d月%d日\n入学日期为:%d年%d月%d日\n', stu.no,stu.birthday.year,stu.birthday.month,stu.birthday.day, stu.SchoolDay.year,stu.SchoolDay.month,stu.SchoolDay.day);return 0;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多