![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c语言基础篇
文章平均质量分 54
nuist_david
影像系统软件工程师
展开
-
求一个素数的c程序
#include#includeint main(){ int num,i,a,stutas=0; scanf("%d",&num); a = sqrt(num); if(num printf("the num is a sushu\n"); else { for(i=原创 2018-01-22 19:54:58 · 224 阅读 · 0 评论 -
C语言内存管理
1、栈区 保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。2、堆区 由malloc系列函数或new操作符分配的内存。其生命周期有free或delete决定。在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。3、数据区 ①bss区:(Block...原创 2019-08-07 15:54:29 · 159 阅读 · 0 评论 -
全局变量可不可以定义在可被多个.c文件包含的头文件中?
可以,在头文件或不同的c文件中用static来修饰同名全局变量。另外一点,可以在不同的c文件中声明同名的全局变量,前提是其中只能有一个c文件中对此变量赋值,此时链接不会出错。extern和static不能同时修饰同一变量。链接规范,每个c/c++的定义都有链接规范(linkage)的属性。外部链接(external linkage)的定义可被定义处以外的翻译单元看见并引用。 ...原创 2019-08-26 17:30:32 · 8427 阅读 · 0 评论 -
关键字volatile以及相关问题
一个定义为volatile的变量,编译器(优化器)每次用到这个变量时必须从该变量的地址处读取该值,而不是保存在寄存器里的备份。比如: ①多线程应用中被几个任务共享的变量。 ②并行设备的硬件寄存器(如状态寄存器)。 ③一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)。Q1:一个参数既可以是const还可以是volatil...原创 2019-08-26 19:23:08 · 115 阅读 · 0 评论 -
简述数组和指针的区别
数组要么在静态区被创建(如全局数组),要么在栈上被创建。指针可以随时指向任意类型的内存块。 (1)修改内容上的差别char a[] = "hello";a[0] = 'x';char *p = "world"; //注意p指向常量字符串p[0] = 'x'; //编译器不能发现该错误,运行时错误 (2)用运算符si...原创 2019-08-26 19:44:16 · 495 阅读 · 1 评论 -
位操作(Bit manipulation)
嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。在以上两个操作中,要保持其他位不变。用#define和bit mask操作,这是一个有极高可移植性的方法。#define BIT3 (0x01 << 3)static int a;void set_bit3(void){ ...原创 2019-08-26 20:02:47 · 456 阅读 · 0 评论 -
分别写出BOOL,int , float,指针类型的变量a与“零”的比较语句
BOOL: if(a) or if(!a);int: if(0 == a);float: const float EXP = 0.000001; if(a<EXP && a>-EXP);pointer: if(a != NULL) or if(a == NULL);原创 2019-08-28 14:56:51 · 944 阅读 · 0 评论 -
嵌入式系统中固定内存位置的访问,中断的使用以及动态内存分配
一、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa66;a more obscure approach is: *(int *const)(0x67a9) = 0xaa66;...原创 2019-08-28 15:21:14 · 1000 阅读 · 0 评论 -
C语言贪心法
C语言有这样一个规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不可能组成一个有意义的符号。 这个处理的策略被称为“贪心法”。 需要注...原创 2019-08-28 15:43:09 · 278 阅读 · 0 评论 -
使用位域的结构体内存分布
首先来看两个结构体:struct s1{ int i : 8; int j : 4; int a : 3; double b;}struct s2{ int i : 8; int j : 4; double b; int a : 3;}printf("%d %d\n",sizeof(s1),sizeof(s2)...原创 2019-08-28 19:25:34 · 546 阅读 · 3 评论 -
编译器优化问题
首先来分析一段代码:char *a = "hello";char *b = "hello";if(a == b) printf("YES");else printf("NO");"hello"是一个常量字符串,位于静态存储区,它在程序生命期内恒定不变。如果编译器优化的话,会有可能a和b同时指向同一个hello的,这时地址相同;如果编译器没有优化,那么就是两个不同的地...原创 2019-08-29 16:15:49 · 593 阅读 · 0 评论 -
递归的一些经典算法
1、斐波那契数列 0, 当n=0;F(n) = {1, 当n=1; F(n-1) + F(n-2), 当n>1;int Fbi(int i){ if(i < 2) return ((i == 0) ? 0 : 1); return Fbi(i-1) + Fbi(i-2);}...原创 2019-08-29 16:58:31 · 677 阅读 · 0 评论 -
C语言的预处理命令的问题
预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件。预处理命令扩展了C语言。一、宏替换命令不用多讲,大家都懂。#define 标识符 字符串下面总结一些比较特殊的宏:1、交换两个参数值//一定要注意小括号的使用#define SWAP(a,b) {(a)=(a)+(b); (b)=(a)-(b); (a)=(a)-(a);}2、输入两个参数...原创 2019-09-03 19:40:48 · 2300 阅读 · 2 评论 -
C语言静态变量与自动变量以及众多类型变量辨析
谈起变量的类型,映入眼帘的首先可能是静态变量、自动变量;也可能是外部变量、内部变量;或许还会有全局变量、局部变量、寄存器变量...总之,不免让人感到头大。那么今天我就借助《C程序设计语言》与《C和指针》这两本书来尽可能区分一下他们。首先我们要了解变量的三种属性:作用域,链接属性,存储类型。作用域:变量可以被使用的区域。链接属性:决定如何处理不同位置出现的变量。存储类型:三个地方...原创 2019-03-01 18:17:58 · 1581 阅读 · 0 评论 -
C语言算术运算符与位运算符
1.算术操作符:+,-,*,%,/前两个不用多说,* 即是乘号,%是求余(取模)运算,注意:%两侧操作数需均为整数;若除数与被除数符号不同,则结果符号与被除数保持一致。如-14/3=-2;14/-3=2;/是求商运算,注意:若/的除数与被除数均为整数将执行舍位(即舍去小数中任何部分)如14/3=4;若除数与被除数符号不同,则结果符号与被除数保持一致。如-14/3=-4;14/-3=4;若运算中...原创 2019-03-04 22:21:50 · 4031 阅读 · 0 评论 -
C语言字符常量与字符串常量
字符常量:一个用单引号括起来的单个字符(或字符转义序列或三字母词)实质(含义):是一个整形值。属于四大基本数据类型(分别是整型,浮点型,指针,聚合类型)中的整型(integers)。 如‘a', '\n', '??!', '\24'针对上面四个例子逐一讲解: 1. 第一个’a'似乎没什么好说的,严格满足定义。(有一点想说一下,'abc'到底算不算...原创 2019-02-28 09:51:03 · 34066 阅读 · 2 评论 -
为什么c语言中字符数组可以越界
//为什么数组里可以出现 a[5],a[6]?#include #include int main(){ char a[5]; char b[5]; scanf("%s",a); a[6] = '\0'; strcpy(b,a); printf("输出a数组:%s\n",a); printf("%c\n",a[5]); p原创 2018-01-27 15:01:21 · 909 阅读 · 1 评论 -
用指针表示数组的地址与值
/*int a[10]; int *p = a; p表示a这个数组的首地址,p == &a[0]; p+i,a+i都表示这个数组的第i+1个值的地址,==&a[i]; *p表示a[0]的值,*p = a[0]; 指针法: *(p+i),*(a+i)都表示这个数组第i+1个值,==a[i]; ...原创 2018-01-26 22:50:13 · 3640 阅读 · 0 评论 -
啊哈算法之快速排序
快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因此总得比较和交换次数就少了。速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行交换,此时快速排序的最差时间复杂度和冒泡排...转载 2018-08-18 17:50:00 · 396 阅读 · 0 评论 -
啊哈算法之深度优先搜索(Depth First Search,DFS)
理解深度优先搜索的关键在于解决“当下该如何做”。至于“下一步如何做”则与“当下该如何做”是一样的。比如我们这里写的dfs(step)函数的主要功能就是解决当你在第step个盒子的时候该怎么办。通常的方法就是把每一种可能都去尝试一遍(一般使用for循环来遍历)。当前这一步解决后便进入下一步dfs(step+1).下面代码就是深度优先搜索的基本模型:void dfs(int step){...原创 2018-08-22 11:26:14 · 1272 阅读 · 0 评论 -
深度优先搜索之深度体验
迷宫有n行m列的单元格组成(n和m都小于等于50),每个单元格内要么是空地,要么是障碍物。找到一条从迷宫的起点通往迷宫内任意一点的最短路径。注意:障碍物是不能走的,也不能走到迷宫之外。#include <stdio.h>#include <iostream>int n, m, p, q,len, min = 99999999;int a[51][51]...原创 2018-08-22 16:23:01 · 142 阅读 · 0 评论 -
啊哈算法之模拟链表
链表中的每一个节点只有两个部分。一个存放数据,一个存放下一个节点的地址。定义两个数组。data[]用来存放数据,每次增加节点,直接在数组data的末尾增加一个值存放新加节点的数据值。len++;scanf("%d",&data[len]); right[]用来存放下一个节点的地址,从头开始遍历比较新的节点的数据值的大小。当下一个节点的...原创 2018-08-20 21:33:28 · 302 阅读 · 0 评论 -
啊哈算法之暴力枚举
枚举算法又叫做穷举算法。□□□+□□□=□□□,将数字1-9分别填入9个□中,每个数字只能使用一次使得等式成立。 暴力穷举法:#include <stdio.h>#include <iostream>int main(){ int a, b, c, d, e, f, g, h, i, total = 0; for (a = 1; ...原创 2018-08-21 15:44:43 · 408 阅读 · 0 评论 -
啊哈算法之火柴棍等式
现在小哼有N根火柴棍,希望拼出形如A+B = C的等式。等式中的A,B,C均是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。例如现在小哼手上有14根火柴棍,则可以拼出两个不同的等式0+1=1和1+0=1.在例如小哼手上有18根火柴棍,则可以拼出9个不同的等式,分别0+4=4,0+11=11,1+10=11,2+2=4,2+7=9,4+0=4,7+2=9,10+1=11,11+0=11...原创 2018-08-21 21:26:36 · 883 阅读 · 0 评论 -
变量的存储方式和生存期
在C语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。从变量的作用域(即空间)的角度来观察,变量可以分为全局变量和局部变量。从变量值存在的时间(即生存期)来观察,变量的存储方式分为静态存储方式和动态存储方式。C的存储类别包括4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。根据变量的存储类别,可以知道变量的作用域和生存...原创 2018-09-04 23:04:25 · 1373 阅读 · 0 评论 -
指针的几个概念性问题
1、指针:是一个地址。 指针变量:是一个变量,是基本数据类型派生出来的类型。存放的内容是另一个变量的地址。2、一个指针变量只能指向同一个类型的变量,不能忽而指向一个整型变量,忽而指向一个实型变量。3、指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。如:*pointer_1 = 100; //pointer_1是指针变量,100是...原创 2018-09-05 16:27:17 · 679 阅读 · 0 评论 -
如何求一个数组长度?
length = sizeof(data)/sizeof(data[0]).注意:通过传递数组名参数到子函数中,以获得数组长度是不可行的。比如:int getLength(int a[]) { int length; length = sizeof(a)/sizeof(a[0]); //...原创 2018-09-03 21:34:17 · 2573 阅读 · 0 评论 -
内存动态分布
1、什么是内存的动态分配?一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放。数据存放的区域称为堆区。由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。2、怎样建立内存的动态分布?①malloc函数void *malloc(unsigned int size);其作用是在...原创 2018-10-23 17:38:26 · 1742 阅读 · 0 评论 -
switch与if else的效率问题
switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。 具体地说,switch...case会生...转载 2019-09-08 16:20:44 · 371 阅读 · 0 评论