C语言高级(详情讲解一)

我们在学习C语言之前,首先要了解C语言所使用的代码编译器,这样我们才能熟练的使用C语言进行工作学习。

目录

GCC编译器

数组

Const关键字:

函数:

函数中的特殊函数

指针的总结


  • GCC编译器

1.编译流程:

  1. 预处理:宏操作、引入头文件等。

该操作不会检查代码的语法错误。

gcc -E hello.c -o hello.i

  1. 编译:检查语法错误,将C代码转换为汇编代码。

gcc -S hello.i -o hello.s

  1. 汇编:将汇编代码转换位二进制的机器码

gcc -c hello.s -o hello.o

  1. 链接:将多个二进制机器码文件链接到一起,构成一个可执行的文件,将程序中所用到的库链接到文件中。

gcc hello.o -o a.out

2.GCC编译器的组件:

1)编译器:C转换为汇编

2)汇编器:汇编转换为二进制机器码

3)链接器:二进制机器码与库或其他需要的二进制机器码,进行链接生成可执行文件

4)C库

3.GCC编译报错:

1)语法错误:标点符号错误或者代码单词错误。

2)头文件错误:头文件缺失或头文件名字错误。

3)链接错误:引用其他文件的变量或函数错误。

4)未定义符号:变量或者函数没有定义或声明就使用。

4.运行时错误(BUG逻辑错误)

1)段错误:一般是程序非法操作内存。

2)参数错误:程序中所使用的参数没声明。

错误类型太多在实际使用中理解。。。。。。。。

  1. 程序的调试:
  1. 使用专用工具或软件调试

一般是使用GDB字符界面的调试工具

  • 指针

指针的本质就是对内存的操作。

  1. 什么是指针:就是C语言中直接操作内存的一个工具。

一般指针有两个含义:(1)表示内存的地址。(2)表示一个存放内存地址的变量。

  1. 指针变量的定义和表示含义:

存储类型   数据类型  变量名;

auto        int       a  = b;   // int  b=10;

auto int *     p = &a;  // 指针的定义与初始化

含义: 定义了一个指针变量p,该变量将会存储一个地址,该地址所在的内存是int类型

&变量名:表示取变量地址运算,其运算结果为一个常量地址。

1)指针变量的赋值:

指针变量 = 地址常量或其他指针变量。

指针变量赋值的物理意义:

通过指针变量赋值与对应的地址建立指向关系;

野指针:表示在对指针定义时,没有给定初始值,或者指针指向内存地址不可用。

空指针:指针变量的值为地址0即NULL。

2)指针的使用(* 为指针取值运算符)

*指针变量:表示将该指针指向地址中的值取出;

例如:a=1;

 Int *p=&a;

 *p=1;

写一个函数,实现交换两个数

 

其中*p和*q就是取得对应地址中所存储得值。

同时在函数参数的使用过程中,我们应当注意,函数实际操作的是形参,只要函数的地址传参方式,才能实现函数操作实参。

  1. 指针的运算:

指针的关系运算: !=    其左右两边只能给指针类型。

例如:P!=NULL;

表示判断这两个指针是否指向同一内存空间。

同时<  >  <=   >=  ==都是可以在指针中进行的关系运算。但是其表示的含义是判断两个指针的位置关系。

指针的算数运算:

指针只能进行有条件的算数运算。

两个指针相减:在大地址可以减去小地址。(其表示这两个指针之间所相距的距离,单位为指针所指向的类型,且这两个指针是指向内存空间连续的数组)

数组

数组的本质是一个内存空间地址且是一个元素类型的地址。(在C语言基础中我们有讲过数组的基本知识,这里我就不再讲解)。

由于数组的本质,其数组名是可以当作指针使用的,其表示是一个指向其元素类型的指针,是一个指针常量不能进行指针赋值操作。指针变量可以当数组用,数组的所有操作均可使用。

  •  多级指针、指针数组、二维数组等

1.二级指针:即表示一个指针指向另一个指针,该指针中存放的是另一个指针的地址

例如:int **pp = &p;  (二级指针定义)。

  1. 指针数组:即表示一个数组中存放的元素是指针类型的。

例如:int *arr[5];

int **p=arr; //二级指针

  1. 字符串指针数组:

例如:const char *arr1[3] = {"hello", "world", "你好"};

const char **pp = arr; // 二级指针

1)二维数组与数组指针: 数组指针:  一个指针指向一个数组 &数组名

int arr[5];

int* p = arr;

int arr[2][3];

int  (*p)[3] = arr; // 数组指针

二维数组:

int arr[2][3];其中一维元素的类型为int[3]。

  • Const关键字:

修饰变量,表示该变量只读,在程序运行过程中,不可重新被赋值。

例如:char *p = s;

*p     ; 表示*p 可读可写,p是可读可写的

const *p ; 表示*p 只读,p是可读可写的

* constp ; 表示 p 只读,*p可读可写的

const * const p; 表示 p 只读,*p也只读。

  • void
  1. void修饰函数:则表示该函数没有返回值。

当函数没有形参时,也可使用void表示该函数不存在参数。

例如:int fun(void)

{};

void修饰指针变量:void *p;

表示该指针可以指向任意类型的地址-----万能指针。

注意:1)该指针只能使用赋值操作,其他所以的指针操作均不能进行。

2)在使用该指针时,需要进行强制类型转换,转换为对应类型的指针使用。

  • 函数:

  1. 函数的定义:返回值类型   函数名(形参列表){函数体}

例如:

  1. 函数声明:返回值类型  函数名 (形参列表);  // 函数原型

例如:

 

  1. 函数的五要素:
    1. 功能明确
    2. 函数原型
    3. 函数的作用,传参方式
    4. 返回值
    5. 注意事项即BUG部分。
  2. 函数的调用:函数名(实参列表);

例如:

 

  1. 传参
    1. 复制传参    实参复制其值并且赋值给形参,函数中操作形参(不会改变实参的值)
    2. 地址传参    将实参的地址赋值给形参(指针类型),函数可以通过这个指针操作实参。

例如:

 

  • 函数中的特殊函数

  1. 指针函数:指一个函数的返回值是一个指针但其不能为野指针。

返回的该指针应当注意 不能指向无效或者非法的地址。

通常该指针主要指向静态区、堆区、常量区。

通过参数返回数据。

  1. 函数指针:是一个指针变量 指向一个函数的入口地址

函数类型:

int func(int *a,int *b);

其类型为  int (int *,int *);

如何定义函数指针 : int (*p) (int *,int *);

函数指针初始化: int (*p) (int *,int *) = func;

函数指针赋值 :  p = func;  或 p = &func;

int arr[3];

int (*p)[3] =&arr;

int *p = arr;

  1. 函数名:

1) 代指这个函数   

2) 代指这个函数 的 首地址(函数入口地址)

4. 函数指针的使用:

通过该指针调用这个函数  除此外,其他指针操作均不能使用

1) (*函数指针)(参数表)

2) 函数指针(参数表)

指针的总结

1)* & 互为逆运算

2)对指针 * 运算 就是指针指向的 对象本身

3)指针赋值 即 建立指向关系

4)指针算数运算  

5)指针的关系运算

6)数组arr元素类型 *p = arr;

7)判断指针操作是否可行  是否有物理意义  是否满足运算规则。

很多同学对咱们C语言的课程、学习存在着很多误解,而且很多同学还不知道《C语言高级教程》后面的课程安排是什么,因此这里并做个说明。有同学问“别人都说开发数据库系统、Web系统还是Java、C#等最流行,咱们用C语言学了开发也不是浪费吗?”、“C语言不是做嵌入式开发、操作系统等底层的东西吗?”、“我们为什么不讲C语言的嵌入式开发?”、“人家都学Web开发,咱们这学C语言开发C/S的程序不是落伍了吗?”。 确实在实际工作中,由于C语言的门槛比较高,很少有实际项目用C语言进行数据库系统、Web系统等的开发的。但是我不止次强调“学习时学东西和工作时学东西是不样的”。 工作以后选用的技术、语言定是选择做合适、最方便做所从事方面的,比如开发Web程序肯定首选PHP、Java、.net,开发底层系统肯定首选C/C++开发桌面系统肯定首选VB、Delphi,也就是“用合适的语言做合适的事情”; 但是对于在校生来说则是“用最熟悉的语言做所有事情”。初学编程的人最容易在语言的表层陷入 太长时间,如果要学数据库开发了就要去学Delphi、PB,又要学Web开发了就又去学Java、.net,又要学底层开发了就又去学C/C++, 可是每门语言都没深入,最后真正要学的数据库开发、Web开发、底层 开发等等没怎么学会,倒是把大量的时间浪费在学这些基础语法上,浪费了宝贵的时间, 这也是我痛 恨目前很多大学课程安排的个原因。因此我的倡导就是对于在校生来说则是“用最熟悉的语言做所 有事情”,我甚至建议大学只学门C语言就够了,然后就教大家用C语言做所有的方面。
1. C 语言中的指针和内存泄漏 ............................................................................................................. 5 2. C语言难点分析整理 .......................................................................................................................... 9 3. C语言难点 ........................................................................................................................................ 16 4. C/C++实现冒泡排序算法 ................................................................................................................. 29 5. C++中指针和引用的区别 ................................................................................................................. 31 6. const char*, char const*, char*const的区别 ..................................................................................... 32 7. C中可变参数函数实现 .................................................................................................................... 34 8. C程序内存中组成部分 .................................................................................................................... 37 9. C编程拾粹 ........................................................................................................................................ 38 10. C语言中实现数组的动态增长 .................................................................................................... 40 11. C语言中的位运算 ........................................................................................................................ 41 12. 浮点数的存储格式: .................................................................................................................... 45 13. 位域 ................................................................................................................................................ 52 14. C语言函数二维数组传递方法 .................................................................................................... 58 15. C语言复杂表达式的执行步骤 .................................................................................................... 60 16. C语言字符串函数大全 ................................................................................................................ 62 17. C语言宏定义技巧 ........................................................................................................................ 80 18. C语言实现动态数组 .................................................................................................................... 89 19. C语言笔试-运算符和表达式 ....................................................................................................... 93 20. C语言编程准则之稳定篇 ............................................................................................................ 96 21. C语言编程常见问题分析 ............................................................................................................ 97 22. C语言编程易犯毛病集合 .......................................................................................................... 101 23. C语言缺陷与陷阱(笔记) ............................................................................................................ 107 24. C语言防止缓冲区溢出方法 .......................................................................................................113 25. C语言高效编程秘籍 ...................................................................................................................115 26. C运算符优先级口诀 ...................................................................................................................119 27. do/while(0)的妙用 ....................................................................................................................... 120 28. exit()和return()的区别 ................................................................................................................ 125 29. exit子程序终止函数与return的差别 ........................................................................................ 126 30. extern与static存储空间矛盾 ..................................................................................................... 130 31. PC-Lint与C\C++代码质量 ........................................................................................................ 132 32. spirntf函数使用大全................................................................................................................... 142 33. 二叉树的数据结构 ...................................................................................................................... 150 34. 位运算应用口诀和实例 .............................................................................................................. 153 35. 内存对齐与ANSI C中struct内存布局 .................................................................................... 156 36. 冒泡和选择排序实现 .................................................................................................................. 162 37. 函数指针数组与返回数组指针的函数 ...................................................................................... 168 38. 右左法则- 复杂指针解析 ........................................................................................................... 170 39. 回车和换行的区别 ...................................................................................................................... 173 40. 堆和堆栈的区别 .......................................................................................................................... 175 41. 堆和堆栈的区别 .......................................................................................................................... 178 42. 如何写出专业的C头文件 ......................................................................................................... 181 43. 打造最快的Hash表 .................................................................................................................... 185 44. 指针与数组学习笔记 .................................................................................................................. 199 45. 数组不是指针 .............................................................................................................................. 201 46. 标准C中字符串分割的方法 ..................................................................................................... 205 47. 汉诺塔源码 .................................................................................................................................. 208 48. 洗牌算法 .......................................................................................................................................211 49. 深入理解C语言指针的奥秘 ..................................................................................................... 213 50. 游戏外挂的编写原理 .................................................................................................................. 229 51. 程序实例分析-为什么会陷入死循环 ......................................................................................... 232 52. 空指针究竟指向了内存的哪个地方 .......................................................................................... 234 53. 算术表达式的计算 ...................................................................................................................... 238 54. 结构体对齐的具体含义 .............................................................................................................. 242 55. 连连看AI算法 ............................................................................................................................ 246 56. 连连看寻路算法的思路 .............................................................................................................. 254 57. 重新认识:指向函数的指针 ......................................................................................................... 258 58. 链表的源码 .................................................................................................................................. 261 59. 高质量的子程序 .......................................................................................................................... 264 60. 高级C语言程序员测试必过的十六道最佳题目+答案详解.................................................... 266 61. C语言常见错误 .......................................................................................................................... 286 62. 超强的指针学习笔记 .................................................................................................................. 291 63. 程序员之路──关于代码风格 .................................................................................................. 306 64. 指针、结构体、联合体的安全规范 .......................................................................................... 309 65. C指针讲解 .................................................................................................................................. 314 66. 关于指向指针的指针 .................................................................................................................. 327 67. C/C++ 误区:void main() ...................................................................................................... 331 68. C/C++ 误区二:fflush(stdin) ..................................................................................................... 334 69. C/C++ 误区三:强制转换 malloc() 的返回值 ........................................................................ 338 70. C/C++ 误区四:char c = getchar(); ............................................................................................ 339 71. C/C++ 误区五:检查 new 的返回值....................................................................................... 341 72. C 是 C++ 的子集吗? .............................................................................................................. 342 73. C和C++的区别是什么? .......................................................................................................... 345 74. 无条件循环 .................................................................................................................................. 346 75. 产生随机数的方法 ...................................................................................................................... 347 76. 顺序表及其操作 .......................................................................................................................... 348 77. 单链表的实现及其操作 .............................................................................................................. 349 78. 双向链表 ...................................................................................................................................... 353 79. 程序员数据结构笔记 .................................................................................................................. 357 80. Hashtable和HashMap的区别.................................................................................................... 364 81. hash 表学习笔记 ......................................................................................................................... 366 82. C程序设计常用算法源代码 ...................................................................................................... 368 83. C语言有头结点链表的经典实现 .............................................................................................. 375 84. C语言惠通面试题 ...................................................................................................................... 383 85. C语言常用宏定义 ...................................................................................................................... 402
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值