C专家编程
马•晓
职位:机器视觉工程师 CV Engineer
主要研究方向:机器视觉 工业数据分析
主要编程语言:C++ Python Matlab
主要技能:机器视觉 机器学习 统计分析 OpenCV Halcon PaddlePaddle OpenVINO Scikit-learn
展开
-
第11章 你懂得C,所以C++不在话下
从实用的角度讲,C++是ANSI C的一个超集,它基本上兼容ANSI C。类的名字以大写字母开头是一个好的习惯。C++类允许用户定义类型:(1)把用户定义类型和施加在它们上面的操作组合在一起。(2)具有和内置类型一样的特权和外观。(3)可以用更基本的类型创建更复杂的类型。一般的原则是不要把类的数据做成public,因为让数据保持私有才符合面向对象编程的理论。类中有2个关键字:friend和virtual,这2个关键字后面不跟冒号。(1)属于friend的函数不属于类的成员函数,但可以像成员函原创 2020-08-29 13:10:26 · 263 阅读 · 0 评论 -
第10章 再论指针
用于实现多维数组的指针数组,必须用指向为字符串而分配的内存的指针进行初始化,即一次性用malloc分配整个x*y个数据的数组:malloc(row_size * col_size * sizeof(char));然后使用一个循环,用指针指向这块内存的各个区域。整个数组保证能够存储在连续的内存中,即按C用于分配静态数组的次序。...原创 2020-08-29 10:50:56 · 128 阅读 · 0 评论 -
第9章 再论数组
什么时候数组与指针相同在实际使用中,数组和指针可以互换使用的情形要比两者不可互换的情形更为常见。所有作为函数参数的数组名总是可以通过编译器转换为指针。在声明中,数组就是数组,指针就是指针,但在使用数组时,数组总是可以写成指针的形式,两者可以互换。而对编译器而言,一个数组就是一个地址,一个指针就是一个地址的地址。什么时候数组和指针是相同的?(1)表达式中的数组名(与声明不同)被编译器当作一个指向该数组第一个元素的指针。(2)下标总是与指针的偏移量相同。(3)在函数参数的声明中,数组名被编译器当原创 2020-08-29 10:44:31 · 117 阅读 · 0 评论 -
第8章 为什么程序员无法分清万圣节和圣诞节
类型转换在表达式中,每个char和short都被转换为int,所有位于表达式中的float都被转换为double,任何数组被提升为相应类型的指针。由于函数参数也是一个表达式,所以当参数传递给函数时也会发生类型转换。这个特性被称为类型提升。这就是为什么printf()中的字符串%d能适用于short,int,char等几种不同类型。另一个会发生隐式类型转换的地方就是参数传递。在实际编程中,我们通过把函数原型放置在头文件中,而函数的定义则放置在另一个包含了该头文件的源文件中,这样编译器能同时它们,如有不匹原创 2020-08-29 10:23:13 · 172 阅读 · 0 评论 -
第7章 对内存的思考
今天,计算机系统结构的真正挑战不在于内存的容量,而是内存的速度。在巨型地址空间的机器中,主存访问时间的重要性将进一步凸现。当访问海量数据时,它所耗费的内存访问时间将左右软件的性能。我们只能寄望Cache以及相关技术。从理论上说,内存的每个位置都可以用寄存器来代替,但在实际上,这样做的成本将是不切实际的昂贵,所以必须牺牲一些访问速度来大幅降低存储系统的实现成本。虚拟内存只是对多层存储进行扩充,使用磁盘而不是主存来保存运行进程的映像,所以说它们实际上是同一种策略。对于编写应用程序的程序员而言,Cache和虚原创 2020-08-28 21:44:18 · 147 阅读 · 0 评论 -
第6章 运动的诗章:运行时数据结构
我们之所以要学习运行时系统,主要有3个理由:(1)它有助于优化代码,获得最佳的效率(2)它有助于理解更高级的材料(3)当陷入麻烦时,它可以使分析问题更加容易从本质上说,段在正在执行的程序中是一块内存区域,每个区域都有特定的目的。(1)文本段包含程序的指令。链接器把指令直接从文件拷贝到内存中,以后便再也不用管它。(2)数据段包含经过初始化的全局和静态变量以及它们的值。(3)BSS段是汇编程序的一个伪指令,只保存没有值的变量,所以事实上它并不需要保存这些变量的映像。当这个内存区进入程序的地址空间后原创 2020-08-27 23:18:40 · 145 阅读 · 0 评论 -
第5章 对链接的思考
绝大多数编译器并不是单一的庞大程序。它们通常由多达6到7个稍小的程序所组成,这些程序由一个叫做“编译器驱动器(compiler driver)”的控制程序来调用。这些可以方便地从编译器中分离出来的单独程序包括:(1)预处理器preprocessor(2)语法和语义检查器syntactic and semantic checker(3)代码生成器code generator(4)汇编程序assembler(5)优化器optimizer(6)链接器linker(7)调用所有这些程序并向各个程序传递原创 2020-08-27 22:14:28 · 112 阅读 · 0 评论 -
第4章 令人震惊的事实:数组和指针并不相同
C语言中的对象必须有且只有一个定义,但它可以有多个extern声明。(1)定义,只能出现在一个地方,确定对象的类型并分配内存,用于创建新的对象。例如int my_array[100];(2)声明,可以多次出现,描述对象的类型,用于指代其他地方定义的对象(例如在其他文件里)。extern int my_array[];extern对象声明告诉编译器对象的类型和名字,对象的内存分配则在别处进行。由于并未在声明中为数组分配内存,所以并不需要提供关于数组长度的信息。对于多维数组,需要提供除最左边一维之原创 2020-08-27 21:28:53 · 185 阅读 · 0 评论 -
第3章 分析C语言的声明
C语言的声明存在的最大问题是你无法以一种人们所习惯的自然方式从左向右阅读一个声明,在ANSI C引入const和volatile关键字后,情况就更糟糕了。由于这些关键字只能出现在声明中(而不是使用中),这使得现今声明形式和使用形式能完全对得上号的例子越来越少。例如:const int *grape;int const *grape;// 上述二者是等价的都表示指向常整型的指针int * const grape_jelly; // 其表示指针是只读的基于阅读方便,不要将结构的声明和结构类型变量的定原创 2020-08-25 22:56:59 · 86 阅读 · 0 评论 -
第2章 这不是Bug,而是语言特性
无论在任何时候,如果遇到malloc(strlen(str))几乎可以断定它是错误的,而malloc(strlen(str)+1)才是正确的,因为字符串处理库函数都包含一个额外空间,用于容纳字符串结尾的’\0’字符。多做之过,就是语言中存在某些不应该存在的特性。这些特性包括容易出错的switch语句、相邻字符串常量的自动连接、缺省全局作用域。在C语言中,const关键字并不真正表示常量,如:const int two = 2;switch(i){ case 1: printf("case 1\原创 2020-08-23 17:13:22 · 234 阅读 · 0 评论 -
第1章 C:穿越时空的迷雾
C预处理器所实现的3个主要功能是:(1)字符串替换,通常用于为常量提供一个符号名。(2)头文件包含:一般性的声明可以被分离到头文件中,并且可以被许多源文件使用。(3)通用代码模板的扩展:与函数不同,宏在连续几个调用中所接收的参数的类型可以不同(宏的实际参数只是按照原样输出)。在宏的扩展中,空格会对扩展的结果造成很大影响。ANSI C标准的每个主题都附有一个约束小节,列出了所有的约束条件。现在又出现了一个更为有趣的情况:标准规定编译器只有在违反语法规则和约束条件的情况下才能产生错误信息。这意味着所有不原创 2020-08-22 09:17:52 · 130 阅读 · 0 评论