![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言的小知识点
ALfirewell
本人的目标是当一名嵌入式研发工程师,会把自己学习的历程以及自己的发现和心得记录下来,但愿最后能如愿以偿。
展开
-
static inline对函数的作用
在阅读代码的时候我们经常会看到这样的函数原型:static inline char sdsReqType(size_t string_size) { if (string_size < 32) return SDS_TYPE_5; if (string_size < 0xff) return SDS_TYPE_8; if (string_size < 0xffff) return SDS_TYPE_16; i原创 2020-11-03 00:53:41 · 7578 阅读 · 2 评论 -
栈的原理与实现
栈是一种数据结构,它包括入栈和出栈,先入的放在最底下最后才会出栈。其实栈是非常简单和容易理解的,下面是我写的一个C语言小用例:#include <stdio.h>#include <stdlib.h>#include <assert.h>#define ALLOC_SIZE 512typedef int KEY_TYPE;typedef struct _stack{ KEY_TYPE *base; int top; int stack_size;}原创 2020-09-20 22:44:52 · 102 阅读 · 0 评论 -
关于无符号整数的加法
请看下面这段代码:#include<stdio.h>int main(){ int a=-2; unsigned int b=1; if(a+b>=0) printf("1 "); else printf("0 "); printf("%d ",a+b); printf("%u",a+b);...原创 2018-03-28 16:23:22 · 3424 阅读 · 0 评论 -
Linux中的文件参数的由来
在讲解Linux文件权限设置前,我们首先来讲解一下怎么查看Linux文件的属性。因为只有知道了文件的属性我们才能去修改它的权限(这样才是有意义的)。 你可以在终端中使用ls -al这个命令查看文件的属性。[root@localhost 0415]# ls -al总计 92drwxr-xr-x 5 root root 4096 04-15 20:41 .drwxr-xr-x 10 ...原创 2018-04-18 00:19:40 · 405 阅读 · 0 评论 -
Linux中pts/0的讲解
当我们在vm终端输入who命令时,会出现pts/0那么它是什么意思呢? 首先要知道who命令是用来干嘛的。 who:查看目前有谁在线 pts是所谓的伪终端或虚拟终端,具体表现就是你打开一个终端,这个终端就叫pts/0,如果你再打开一个终端,这个新的终端就叫pts /1。...原创 2018-04-18 15:58:48 · 21867 阅读 · 0 评论 -
Linux修改文件权限以及属性的方法
上次讲到怎么查看文件的权限以及文件的属性,那么在一些场合你要修改文件的属性和权限怎么办呢? 我们可以使用下面3个命令来修改文件的属性和权限: chgrp(change group):改变文件所属用户组 chown(change owner):改变文件所有者 chmod(change mode):改变文件的权限 那么到底是怎么实现的呢? 例如: [root@localhost 文件]#...原创 2018-04-18 16:27:12 · 719 阅读 · 1 评论 -
静态与局部的区别与选择
静态全局变量和普通全局变量的区别: 相同点: 静态全局变量和普通全局变量都存放在全局数据区,如果不初始化的话默认值都为0。 不同点: 作用域不同: 普通全局变量的作用域是整个工程,也就是整个工程中的不同文件可以共享全局变量,而静态全局变量的作用域只包含它自己的源文件,在其他源文件中是不能访问它的。静态局部变量和普通局部变量的区别: 1.存储位置不同: 静态局部变量存储在全局数据区...原创 2018-04-20 23:43:06 · 288 阅读 · 0 评论 -
使用write函数遇到的问题
write有两种用法。一种是:ssize_t write(int fd, const void *buf, size_t nbyte); fd:文件描述符; buf:指定的缓冲区,即指针,指向一段内存单元; nbyte:要写入文件指定的字节数; 返回值:写入文档的字节数(成功);-1(出错) write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错...原创 2018-04-26 20:25:46 · 3952 阅读 · 0 评论 -
C/C++引用必须为左值的问题详解
我们常常会遇到这样的问题: const int&amp; a = 101;//对 int&amp; b = 101;//错例子: int a; int &amp;b = a; a = 10; printf(“b = %d\n”,b); 此时b = 10,b是a的引用,就是说b和a的地址相同,对a做改变b也跟着变化。 那么这是为什么呢? 下面我们...原创 2018-08-10 09:27:47 · 2635 阅读 · 0 评论 -
陷阱之有符号无符号字符型数组
请看下面这段代码:#include <stdio.h>#include <string.h>int main(){ char a[1000]; int i; for(i=0;i<1000;i++) { a[i]=-10-i; } printf("%d\n",strlen(a)); print...原创 2018-08-10 09:54:27 · 2359 阅读 · 2 评论 -
系统的大端模式与小端模式
大端模式:高字节存放高地址 小端模式:高字节存放低地址 下面举个例子: 有int型数据0x12345678存放在地址0x00开始处,则大小端存放方法见下图 那么怎么验证系统是大端还是小端模式呢? 下面推荐两种方法: 1.用联合体来验证:include <stdio.h>int checknum(){ union check { ...原创 2018-08-10 10:45:25 · 316 阅读 · 0 评论 -
字符数组和字符指针的区别
我们经常会碰到这样的问题: char *p = “xyz”; char *q = “xyz”; char pa[] = “xyz”; char qa[] = “xyz”; 以下说法正确的是: A、p和q指向同一块地址 B、p和q的内容可以修改 C、pa内容修改后qa的内容也被修改 D、pa和qa指向同一块地址正确答案:D分析: p和q是指针,指向同一块字符串常量区,内容...原创 2018-08-10 11:11:37 · 225 阅读 · 0 评论 -
指针数组 数组指针详解
关于指针数组和数组指针,是很多刚开始学C语言的人都很头疼的问题,我也不例外,最近我专门把这块做了一个总结,来和大家一起分享,有什么问题或者疑惑也可以在下方评论或者私信我。我主要是通过代码来使大家加深这块的印象,在这之前,先来了解一下这两个的概念。数组指针:本质上还是一个指针,它是一个指向数组的指针。 指针数组:本质上是一个数组,数组中的每个元素都是指针类型。#include<s...原创 2018-08-11 21:29:16 · 444 阅读 · 0 评论 -
用e为底来表示的浮点常量的写法与要求
书写浮点常量有多种选择,,基本形式:包含小数点的一个带符号的数字序列,接着是字母e或E,然后是一个代表10的指数的有符号值,且必须为整数。 例如: -1.56E+12; 2.87e-3; -8e1.0;错 可以省略正号,可以没有小数点或指数部分。 例如: 2E5; 19.28; 但是不能同时没有二者。 例如: -080;错 可以省略小数或者整数部分,但不能同时省略。 注...原创 2018-08-12 14:30:17 · 21910 阅读 · 3 评论 -
Linux C采用makefile进行多文件编译时对全局变量的用法
我们刚开始学习makefile进行多文件编译时常常会遇到这样的问题:你想在多文件中定义一个全局变量来实现在不同的文件中,只要该变量的值在其中一个文件改变,其他相应的文件中该变量的值也变成那个值。 但是刚开始常常会遇到问题,主要的问题就是你的全局变量声明和定义的地方不对。 首先要理解这些概念 1.定义需要分配存储空间 2.初始化是定义变量时候赋给变量的值; 3.赋值是以后用到该变量,赋给该...原创 2018-08-08 19:50:25 · 874 阅读 · 0 评论 -
字符串对比判断
题目说起来很简单,你会读到两个字符串,每个字符串占据一行,每个字符串的长度均小于10000字符,而且第一个字符串的长度小于第二个字符串的。你的程序要找出第一个字符串在第二个字符串中出现的位置,输出这些位置,如果找不到,则输出-1。 注意,第一个字符的位置是0。 注意,第一个字符串在第二个字符串中的位置可能不止一处。 注意,字符串中可能含有空格。 注意,两个字符串的长度一定大于0。 ...原创 2018-03-27 19:02:52 · 425 阅读 · 1 评论 -
关于指针与数组下标加1的问题
我们在学习C语言的时候经常会碰到指针或者数组下标加1,这也是个令大家非常头疼的问题,那就是它加1以后实际上是加了多少,指针或者数组的下标移动到了哪里。 下面我就通过举几个例子来告诉大家答案。 例1:#include <stdio.h>int main(int argc, char **argv){ int a[3]={ 0 }; ...原创 2018-04-09 22:22:08 · 1973 阅读 · 0 评论 -
open的返回值
open函数是我们开发中经常会遇到的,这个函数是对文件设备的打开操作,这个函数会返回一个句柄fd,我们通过这个句柄fd对设备文件读写操作。 我们在对这个fd作判断的时候,经常会用到: fd = open(filename, O_RDONLY); If (fd Printf(“open %s error!\n”, fil转载 2018-01-31 19:45:46 · 16381 阅读 · 0 评论 -
标准的链表以及各种相关的操作
注意加上头文件 typedef int Status; typedef struct Node { int data; struct Node *next; }Node,*LinkList; Status visit(int c) { printf(“%d “,c); return OK; } Status InitList(LinkList原创 2018-02-01 16:05:13 · 282 阅读 · 0 评论 -
数组和指针的区别
首先对于编译器而言,一个数组是一个地址,一个指针是一个地址的地址。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。例如:void main(void) { int a[10]; a ++;//error, a is left value,but can’t be chang...转载 2018-03-06 18:25:18 · 208 阅读 · 0 评论 -
什么是预编译?何时需要预编译?
什么是预编译:预编译又称为预处理 , 是做些代码文本的替换工作。 处理以# 开头的指令 , 比如拷贝 #include 包含的文件代码,#define 宏定义的替换 , 条件编译等,就是为编译做的预备工作的阶段。主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。C 编译系统在对程序进行通常的编译之前,首先进行预处理。 c ...转载 2018-03-06 18:31:44 · 530 阅读 · 0 评论 -
class 和 struct 的区别
首先在C语言中没有class,class是面向对象的,是C++中特有的用来定义类的关键字。 而struct在C和C++中都可以用,是用来定义结构体的关键字。 那么struct在C和C++中有什么区别呢? 1.C语言中:struct是用户自定义数据类型(UDT);C++中struct是抽象数据类型(ADT),支持成员函数的定义,(C++中的struct能继承,能实现多态)。 2.C中stru...原创 2018-03-17 19:55:24 · 343 阅读 · 0 评论 -
const 与 #define 的区别
这个区别用从几个角度来说:角度1: 就定义常量说的话: const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。角度2: 就起作用的阶段而言: define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。角度3: 就起作用的方式而言: define只是简单的字符串替换,没有类型检查。而const有对应的数据类型...转载 2018-03-19 14:44:45 · 474 阅读 · 0 评论 -
Linux中的GDB调试器
在编译时如果我们仅仅依靠gcc发出的警告或错误信息来进行修改,调试的效率非常低,也不容易发现错误的所在。为此,GNU开发了GDB调试器。 下面我们就来简单认识一下GDB调试器: [root@promote 1118]# gcc -g 14.c -o 14 [root@promote 1118]# gdb 14 GNU gdb Red Hat Linux (6.5-25.el5rh) ...原创 2018-03-23 13:05:37 · 262 阅读 · 0 评论 -
const与#define相比,有何优点
const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。 2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。...原创 2018-03-06 18:12:25 · 793 阅读 · 0 评论 -
const的含义 作用及应用
const关键字 const是constant的简写,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改。const的几种用法: (1) 说明值常量 (2) 说明指针 (3) 说明函数参数及其返回值 (4) 说明类的常量和成员函数 (1)最简单 const int x = 10; x在程序运行过程中,永远等于10.其他的你是看看我给的链接 参考资...原创 2018-03-06 18:21:08 · 651 阅读 · 0 评论 -
C语言中无符号整数和带符号的整数相加的结果
在C语言中,我们最常见的是整型与整型的相加,这里所说的整型都是带有符号的整数。 比如: 2+2 = 4; -1+5 = 4; 他们的类型都是int,即signed int,只不过我们在写代码时为了人为的方便而把signed给省略掉了。 我们通常在C语言中都是用%d进行输出的,那么大家有没有试过用%u来输出呢? 它的结果和用%d来输出是一样的吗? 我们都知道不论是int型还是float...原创 2018-03-21 17:16:59 · 5027 阅读 · 1 评论 -
C语言回车符的小trick
在C语言中,有一个符号叫回车符,可能大家在用的时候看不见它,但它却是最常用的符号之一。 下面我来为大家介绍一下回车符以及它的一些小trick。 首先我来介绍回车符的3种表示方法: char a; //定义一个字符 a=CR; //回车符的ASCII码 a=13; //回车符的ASCII码值 a=’\r’; //回车符的转义字符 我们来看这样一段程序代码: int main() {原创 2017-11-30 15:15:24 · 516 阅读 · 0 评论