C语言
文章平均质量分 54
HDong99
这个作者很懒,什么都没留下…
展开
-
C语言memcpy函数的效率问题
为了方便解释,我们首先查看memcpy的源码,版本:glibc-2.8 memcpy.c#include <string.h>#include <memcopy.h>#include <pagecopy.h>#undef memcpyvoid *memcpy (dstpp, srcpp, len) void *dstpp; ...原创 2018-09-27 15:52:42 · 4476 阅读 · 0 评论 -
C++和C语言的区别(二)——动态开辟内存的区别与new的使用
C++中和C语言中都有动态开辟内存的概念,C语言中使用的是库函数malloc和free,而C++中使用的则是关键字new与delete,它们的部分区别如下:现在我们同时使用两种方式动态开辟二维数组a[5][5]C语言:#include <malloc.h>#include <assert.h>int main(){ //动态开辟二维数组 int...原创 2019-01-07 22:25:30 · 406 阅读 · 0 评论 -
C++和C语言的区别(三)——const
(1).c文件与.cpp文件中const的区别我们先引用两个大致相同的代码段:c文件中: C++文件中:可以看到两段近似相同的代码竟然出现了不同的输出。 他们的主要区别如下,这就可以解释为什么C++文件中打印的值为10了。 (2)c++文件中const与指针的联合使用int main(){ int a = 10; int b = 20; const ...原创 2019-01-07 22:39:40 · 186 阅读 · 0 评论 -
C++和C语言的区别(四)——使用C++中特性替换宏定义
C语言的宏有一个重要特性那就是在预处理阶段就进行字符替换。用C++的特性替换C语言中的宏主要有三种方式:①typedef、②inline函数、③const修饰符而这三种方式都有和宏最大不同的区别就是,他们都是在编译期进行的。(1)typedef:C语言与C++两者所共有的,但是与宏仍有区别,区别如下:①typedef 创建的符号名只受限于类型,不能用于值。②typedef 由编...原创 2019-01-07 23:04:38 · 523 阅读 · 0 评论 -
C++和C语言的区别(五)——变量引用
引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。(1)引用的实现int main(){ int a = 10; int &b = a; int *p = &a;}对于这一段代码,我们通过编译器查看该代码的汇编码如下:可以看到引用操作和指针操作的汇编码完全相同,所以我们就可以知道,引用如何做到①引用的底层是一个const...原创 2019-01-07 23:40:56 · 408 阅读 · 0 评论 -
C++和C语言的区别(六)——命名空间
命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。所以使用标准标识符都有以下三种方式。(1)直接指定标识符(2) 使用using关键字(3)使用 using namespace std;当然命名空间不仅仅是这么使...原创 2019-01-07 23:55:35 · 665 阅读 · 0 评论 -
C&C++编译链接过程
本文讲解编译链接过程,因为才疏学浅可能有些不准确。使用c文件的编译链接过程,使用Linux系统用来查看文件信息。(1)从源文件main.c编译链接成main.exe,需要经历如下步骤: (2)其中符号和符号表是什么呢?段又是什么?段:在一个程序中,所有的代码最后都只后生成指令和数据。指令和数据分别存在不同的段中。符号:所有的数据都会生成符号来标记它自己,指令中只会有函...原创 2019-01-08 19:00:21 · 276 阅读 · 0 评论 -
C&C++函数调用过程
调用函数主要关注三个方面分别是函数名,返回值和参数列表,我接下来将会深入底层讲解调用函数的过程。调用函数的过程主要有四方面,①函数参数代入,②函数栈帧开辟,③函数返回值,④函数栈帧回退首先来看一段简单的c文件代码,和它的汇编码,只需简单浏览即可:源码:int fun1(int a, int b){ int c = a + b; return c;}int main()...原创 2019-01-08 23:52:39 · 14763 阅读 · 0 评论 -
C语言复习(1)
1.逻辑运算符的短路效应/*逻辑运算符的短路效应对于逻辑与(&&)来说,同为真时才为真,所以当条件1为假时不需要计算条件2对于逻辑或(||)来说,同为假时才为假,所以当条件1为真时不需要计算条件2下面的运算形式为,先计算(++a && ++b)的结果,++a为真,故再计算++b,结果也为真,所以表达式(++a && ++b)为真对...原创 2019-07-19 00:25:21 · 385 阅读 · 0 评论 -
C语言复习(2)——如何确定函数指针与函数指针的使用
1、明确当前是什么类型int main(){ int a; //变量 int *b; //指针 int c[10]; //数组 int d(); //函数声明 /* 指针数组分析过程: 因为下标运算符的优先级高于*运算符,所以e首先与[]结合成为e[],所以e是个数组 又因为是e的前面是int*,所以它是个保存指针的数组,简称为指针数组 */ int *e[10];...原创 2019-07-24 21:06:19 · 377 阅读 · 0 评论 -
隐式类型转换
C语言和C++有时候会出现一些隐式类型的转换,本文不讨论何种情况转换,讨论当转换的时候会怎么转换。用图来表示,画的特别粗略,很多类型都没表示出来,只是为了说明情况。当两种不同类型的数据进行运算的时候,两种数据转换到相同的类型进行计算。但是不能进行优先转换的降级。...原创 2018-12-31 00:22:59 · 214 阅读 · 0 评论 -
C语言指针的算术运算
一、指针的加法首先给一串关于指针加法的代码:#include <stdio.h>//指针算术运算int main(){ int arr[] = {1,2,3,4,5,6,7,8,9,10}; int *p = arr; *p = 10; p++; *p = 20; printf("%08x,%08x\n",arr[0]...原创 2018-04-07 23:06:07 · 1609 阅读 · 0 评论 -
C语言的宏定义#define与关键字typedef的区别详解
两者区别主要在于在三处不同(1)与#define不同,typedef创建的符号名只受限于类型,不能用与值#define N 10 //将10替换为N,ok#define M int //将int替换为M,oktypedef int byte_4; //将int重命名为byte_4,oktypedef 4 num; //将4重命...原创 2018-09-21 21:05:36 · 884 阅读 · 0 评论 -
C语言switch语句用法详解
switch语句的一般形式:switch(整形表达式){ case 常量表达式1: 语句1; case 常量表达式2: 语句2; … case 常量表达式n: 语句n; default: 语句n+1;}switch主要需要注意的方面有两个:1、从哪进:表达式的值与case后的值相同则进入,case顺序不影响结果2、从哪出:遇到...原创 2018-06-18 17:42:02 · 89769 阅读 · 14 评论 -
C语言中的动态内存分配
一、动态分配内存知识动态内存分配:程序在运行的时候用malloc等函数在堆上申请任意多少连续的内存,程序员自己负责在何时用free释放内存。动态内存分配的生存期由我们自己决定,使用非常灵活,但是问题相对也比较多;如果没有释放的话,很容易就会造成内存溢出,因为堆中的内存块是全局的,因此不会因为函数的调用而结束。二、动态分配内存的函数动态分配内存的主要使用的函数有malloc,ca...原创 2018-04-28 00:28:44 · 349 阅读 · 0 评论 -
C语言的字符数组,字符串,字符串常量
一、字符数组与字符串首先来看一段源代码:#include <stdio.h> int main() { char arr[10] = {'a','b','c'};//剩余部分为'\0' char brr[] = {'a','b','c'};//不是字符串,因为没有'\0' char crr[10] = {"abc"};//字符数组特有 char drr[10] ...原创 2018-04-17 13:45:41 · 1507 阅读 · 0 评论 -
C语言的二维数组
一、一维数组一维数组数组名在下面两种情况表示整个数组:1.在定义数组的同一个函数中,求sizeof2.在定义数组的同一个函数中,&arr+1其他情况下表示数组首地址二、二维数组那既然一维数组数组名在一般情况下表示数组首地址,那二位数组数组名是不是也代表数组首地址?二维数组本质上是以数组作为数组元素的数组,即“数组的数组”由下面的源代码可以看出#incl...原创 2018-04-17 13:18:25 · 533 阅读 · 0 评论 -
进制的计算
例题:在某系统中,等式15*4=112成立,则系统采用的进制为(A) A.6 B.7 C.8 D.9求解:运用权重的知识,每个数字i所占权重为进制的n-1次方,用十进制举例123=1*(10^2)+2*(10^1)+3*(100^0)即例题中最后一...原创 2018-04-13 00:28:27 · 399 阅读 · 0 评论 -
C语言数组与指针的关系
首先来看一段程序:#include <stdio.h>int main(){ int arr[10] = {1,2,3,4}; int *p = arr; printf("%d\n",arr[2]); printf("%d\n",*(arr + 2)); printf("%d\n",p[2]); printf("%d\n",*(p + 2)); retu...原创 2018-04-12 23:24:10 · 365 阅读 · 0 评论 -
C语言const的用法
const:定义常变量,不能写,只读。const还有下面三点需要注意的地方:一、数据类型对于const而言是透明的#include <stdio.h>int main(){ const int a = 10; int const b = 20; //a = 100;//error //b = 200;//error printf("%d...原创 2018-04-10 00:39:14 · 939 阅读 · 0 评论 -
指针的使用
一、关于指针的几个概念:1.指针就是地址2.获取任何变量的地址都是:&变量名(&是取地址运算符)3.*指针变量名,则间接访问到指针所指向的变量(*是间接访问符,又名解引用)4.指针类型相同才能赋值通过代码可以仔细了解:#include <stdio.h>int main(){ int a = 10; int b = 20; int...原创 2018-04-08 16:06:13 · 162 阅读 · 0 评论 -
对数字的处理
一、输出整数的位数运用“去尾法”获取整数n的位数。“去尾法”是将整数n/10后重新赋值给n,将n的小数部分去掉(利用整数除以整数)。每进行一次赋值,计数器+1,直到整数n被赋值为0后,计数器停止计数,此时计数器的数字为整数n的位数。考虑当整数为0时,运用do-while循环语句可以进入循环。源代码:int GetFigures(int n) { int count=0;...原创 2018-04-08 09:58:48 · 442 阅读 · 0 评论 -
C语言复习(3)——结构体共用体
结构体的主要问题在于,结构体的大小,因为结构体需要内存对齐共用体的主要问题在于,共用体 共用低地址,所以共用体的大小取决于最大的的元素字节数一、结构体大小的计算struct A{ char a; int b;};本来应该是1+4=5,对齐之后是char(1字节)+int(4字节)是需要补齐三字节,以保证struct的字节数可以整除最大元素的字节数,所以A的字节计算为(1...原创 2019-07-24 21:25:18 · 456 阅读 · 0 评论