c语言
文章平均质量分 64
freshcoolman
先抓整体,快速的用起来,在用的过程中补充细节,加深理解。
迷失在细节中永远都学不完,大概率会放弃。
展开
-
单片机内存及内存映射(本地地址,逻辑地址,全局地址)
16位单片机,最大寻址能力即2的16次方,65535/1024=64k,当flash内存大于64k时,地址怎么索引呢,即有了分页窗口的说法。本地地址,就是0到64k,在寻址范围内的地址,16k一页,共四页0x0000-0x3FFF(包含寄存器空间,D-flash,RAM,EEPROM)0x4000-0x7FFF0x8000-0xBFFF(分页窗口)0xC000-0xFFFF逻辑地址,就是指分页窗口的地址,可以索引到超过寻址范围的地址拿MC9S12G128来讲,128k,一页16k,共8页,地.原创 2021-09-27 08:39:12 · 4777 阅读 · 0 评论 -
结构体综合应用
#include <stdio.h>#include <string.h>#include <stdlib.h>#define MAXTITL 40 #define MAXAUTL 40 #define MAXBKS 10 typedef struct book{ char title[MAXTITL]; char author[MAXAUTL]; float value;}Book;char* s_gets(char*原创 2021-08-31 08:39:32 · 156 阅读 · 0 评论 -
指针数组,数组指针综合应用
#include <stdio.h>#include <string.h>#include <stdlib.h>int mysort(char** myptr1,int num1,char (*myptr2)[5],int num2,char*** ptr3,int* num3){ int i = 0; int j = 0; int k = 0; int len = 0; char** p = NULL; p =原创 2021-08-20 08:36:13 · 177 阅读 · 1 评论 -
strtko_r和strsep函数源码分析
strtko_r和strsep函数都是Linux下面的字符串切割函数,但是使用时有许多地方需要注意,分析库里的函数实现源码可以帮助我们更好的使用该函数。1.strtko_r函数源码由于众多的版本。这里strtok_r函数源码来自于GNU C Library:#include <stdio.h>#include <string.h>#include <stdlib.h>/* Parse S into tokens separated by characters原创 2021-08-17 08:33:33 · 685 阅读 · 0 评论 -
C语言中三目运算符省略中间参数的用法
在看别人C代码时遇到三目运算符(条件运算符) ’ ?:'省略中间参数的情况:#include <stdio.h>int main(int argc, char *argv[]){ int a = 200; int b = 0; b = a?:100;//---------❶ printf("a = %d b = %d\n",a,b); b = a > b ?:b;//--------❷通过printf函数打印b的值可知,在❶语句中三原创 2021-08-15 17:48:18 · 2605 阅读 · 0 评论 -
数组类型,数组指针类型,数组指针类型变量
1.数组的基础知识复习1.1 数组的定义:从数组元素的角度:相同类型的变量的有序集合;从内存角度:一段连续的内存空间;1.2 数组的初始化:可以指定长度,也可以不指定长度;可以直接用赋值符号给初值,或者用memset函数重置内存块;int tmp0[] = {1,3};int tmp1[20] = {0};//在编译时就将数组元素置为0memset(tmp1,0,sizeof(tmp1));//显示的将数组代表的内存空间置为01.3 关于数组的易错点:数组首元素地址和数组地原创 2021-08-12 09:06:13 · 717 阅读 · 0 评论 -
字符串分割函数strtko,strtko_s,strtko_r
1.strtko1.1 函数原型char * strtok (char *str, const char * delimiters);参数:str,待分割的字符串(c-string);delimiters,分割符字符串。返回值:调用成功则返回指向被分割出片段的指针,失败返回NULL。功能:当在参数str的字符串中发现参数delimiters中包涵的分割字符时,则会将该字符改为\0 字符。1.2 使用说明delimiters是分割符字符串,不是字符,要用双引号;在第一次调用时,strt原创 2021-07-22 08:30:22 · 143 阅读 · 0 评论 -
字符串数组的三种形式
一、复习普通变量与指针变量的区别所有变量的基本属性:变量名称,值,地址(分配内存后获得)普通变量把 值 作为基本量,把地址作为通过‘&’运算符获得的派生量,而指针变量把 地址 作为基本量,把值作为通过‘*’运算符获得的派生量。——《C Primer Plus(第6版)中文版》P273二、字符串数组2.1 字符串在只读区,字符串地址在栈区字符串数组char* arry[]在栈上申请空间,存储字符串地址,字符串实际是存储在只读存储区,在排序时交换的是字符串地址。#include原创 2021-07-17 17:33:53 · 31671 阅读 · 2 评论 -
字符串和指针新领悟
”用双括号括起来的内容被视为指向该字符串存储位置的指针。“——《C Primer Plus(第六版)中文版》P322这句话怎么理解呢?只看主谓宾——用双括号括起来的内容视为指针。”用双括号括起来的内容“不就是字符串吗,所以有”字符串视为指针“。是这样吗?我们来看下面这个例子:#include<stdio.h>int main(){ char* pstr = "hello"; printf("pstr:%p\n",pstr); printf("pstr:%s\n",pstr.原创 2021-06-30 18:03:08 · 291 阅读 · 3 评论 -
翻转字符串
#include<stdio.h>#include<stdlib.h>void InverseStr1(char* mystr){ if (mystr == NULL) return; char* headptr = mystr; int len = strlen(mystr); char* tailptr = mystr + len - 1; //for (int i = 0, j = 0; i < len / 2; i++, j++)原创 2021-05-07 14:51:35 · 303 阅读 · 0 评论 -
计算机中shell是干什么的
参考文章Shell 是用来解决什么问题的?可以把 shell 理解为 命令解释器,用来解决用户如何与操作系统通信的问题(进行系统调用)。操作系统对外提供的接口是“系统调用”,也就是一堆编程用的接口。这些接口一般以C函数的形式暴露给使用者。通过这些接口,开发者可以命令操作系统“启动一个进程”,“查找某个目录下的所有文件”,“将某个文件的权限配置为744”等等。实际上我们平时编程用的是对系统调用的包装,比如libc里的那些库函数。但无论如何,你总是得写代码才能使用它们。为了不用使用电脑时每次都编写程原创 2021-04-28 14:39:57 · 1969 阅读 · 0 评论 -
C语言二级指针的应用
1.例1:void ChangeInteg(int* tmp){//int* tmp = &a//在子函数声明新的局部变量tmp,并让其指向a,即在指针tmp中保存a的地址,改变*tmp就相当于改变a *tmp = 20;}void ChangeStr(char** tmp){//二级指针(指针的地址)解引用得到一级指针(指针所指的对象)//指针本身是所指对象的地址,改变*tmp就相当于改变*b *tmp = "miss you,miss chen."}int main(){原创 2021-04-26 22:13:54 · 309 阅读 · 0 评论 -
C/C++语言中的0、’0’、’\0’、”0”及NULL、nullptr异同
参考文章:c语言中的各种“零”C风格字符串结束符用作逻辑判断c语言中的0、’0’、’\0’、”0”及NULL原创 2021-04-20 22:31:03 · 3665 阅读 · 0 评论 -
c语言实现去除字符串中空格
#include<stdio.h>#include<stdlib.h>//StrDec即是输入又是输出void CutSpace1(char* StrRes, char* StrDec){ int i = 0; for (; *StrRes != '\0'; StrRes++) { if (*StrRes != ' ') StrDec[i++] = *StrRes; } //使用数组的形式,而不是指针的形式,是为了方便得到数组首地址,方便显示赋值后的数组原创 2021-04-13 15:01:31 · 9034 阅读 · 0 评论 -
vs调试时不能单步调试,会跳过某些行
用VS2019在release模式下调试程序时,发现不能单步,会跳过某几行,最后发现是程序属性中优化设置的问题。这里只有选择“已禁用(/od)”时才会单步调试每条语句,debug模式下默认是“已禁用(/od)”。参考如何:调试优化的代码...原创 2021-04-06 01:48:53 · 3682 阅读 · 0 评论 -
C和C++中const变量内存分配问题详解
一、const变量的内存分配1.const全局变量,或者static,extern 关键字此时该常量是存放在.rodata段的—Read Only Data也就是常量区,是无法通过取地址方式去修改的,修改内容会报段错误(gcc++编译器:Segmentation fault(core dumped))。 例如extern const int i=10, static const int i=10。2.const局部变量在C语言中,const局部变量在栈分配内存,不能通过赋值,自原创 2021-04-06 01:25:13 · 6513 阅读 · 5 评论 -
从例子中认识内存模型
/*知识点:1,冒泡排序;2,数组作为函数参数时会退化成指针;3,数组a 和 &a 的含义,a+1, &a+1的大小;4,sizeof的用法:sizeof(对象);sizeof(类型);*/#include <cstdio>void PrintArrayElement(int* a, int num, const char* b){ //int num = sizeof(a) / sizeof(a[0]);在这里a只是指针,不是数组,数组做参数的原创 2021-03-29 08:16:13 · 88 阅读 · 0 评论 -
C/C++程序运行时内存模型
1.C++内存模型(堆栈全常代 ):堆 heap :保存程序中动态分配的内存,比如C的malloc申请的内存,或者C++中new申请的内存。堆向高地址方向增长。由new分配的内存块,其释放编译器不去管,由我们程序自己控制(一个new对应一个delete)。如果程序员没有释放掉,在程序结束时OS会自动回收。涉及的问题:“缓冲区溢出”、“内存泄露”栈 stack :是那些编译器在需要时分配,在不需要时自动清除的存储区。存放局部变量、函数参数。存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返原创 2021-03-26 19:20:45 · 919 阅读 · 0 评论 -
柔性数组及可变长结构体
参考:C语言柔性数组可变大小结构体如何定义详解先看下面这个结构体:struct s_test{ int a; double b; char c[];//或者char c[0];};如上结构体中最后一个元素允许是未知大小的数组,这个数组就是柔性数组,这样有柔性数组成员(flexible array member)的结构体也被称为可变长结构体或者动态结构体。在这个定义中要注...原创 2020-05-07 23:10:28 · 937 阅读 · 0 评论 -
缓冲区溢出详解
参见:https://www.cnblogs.com/clover-toeic/p/3737011.html转载 2020-05-05 23:02:49 · 606 阅读 · 0 评论 -
C语言中typeof的使用
转自:https://gaomf.cn/2017/10/07/C_typeof/原创 2020-05-05 22:48:04 · 675 阅读 · 0 评论 -
关于sizeof
#include <iostream>using namespace std;int main(){ int a, b, c, d; a = sizeof("123456789"); //a为10 此时"123456789"类型为char [10],字符串常量 b = sizeof("123456789" + 1); //b为4 此时"123456789"类型为ch...原创 2020-05-05 21:04:20 · 386 阅读 · 0 评论 -
关于extern "C" 和 一些常见预处理命令
在一些头文件中经常见到这些语句:#ifdef _cplusplusextern "C" {#endifint func(int);#ifdef _cplusplus}#endif我们知道这段代码是在c++调用c代码的时候使用的,作用是让c++代码和c代码兼容,防止编译报错——一般是链接错误,找不到某某函数。可以多问几个为什么,深究下。为什么不加这几行代码会报错,而且是...原创 2020-05-04 03:54:16 · 260 阅读 · 0 评论 -
C语言内存对齐
参考:谈谈关于内存对齐与补齐CSPP《深入理解计算机系统》3.9.3原创 2020-05-04 02:15:08 · 129 阅读 · 0 评论 -
gdb调试常用命令
参考:https://www.jianshu.com/p/cd04aabb94a0调试前注意:对于C程序来说,需要在编译时加上-g参数,保留调试信息,否则不能使用GDB进行调试,并会提示“no debugging symbols found”。1.启动:#gdb 调试文件:启动gdb注意:这里的调试文件是.out文件(可执行文件)如果名字和源文件名称不同,可以省略.out的后缀名。(g...原创 2020-04-15 16:58:08 · 452 阅读 · 0 评论 -
C/C++相关练习
1.不用临时变量进行变量a,b值互换:设a = 10,b = 20方法一:加减法a = a + bb = a - ba = a - b或者a = a - bb = a + ba = b -a…等等方法二:异或法a = a ^ bb = a ^ ba = a ^ b异或的性质:a ^ a = 0a ^ 0 = a2 ```c++#include<iost...原创 2020-03-10 15:03:41 · 98 阅读 · 0 评论 -
Linux中硬连接(hard link)与软连接(symbolic link)
参考文章:https://blog.csdn.net/gxzc936733992/article/details/49340429https://www.cnblogs.com/jackhub/p/3779917.htmlhttps://blog.csdn.net/bitboss/article/details/53940236在Linux系统(Ubuntu)的ext4文件系统中,根据数据...原创 2019-06-16 14:39:45 · 569 阅读 · 0 评论 -
在VS2010下编写C应注意的问题(和编写C++的区别)
用VS2010来编译C程序,在网上看到说在属性→C/C++→高级 对话框里面更改编译为:C代码(/TC)就可以进行C语言源码编译工作了,但是有时候不修改这个选项也不影响使用C来编译,那到底需不需要修改呢? 【C代码(/TC)和C++代码(/TP)有何区别?】MSDN: /Tc 选项指定 filename 为 C 源文件,即使它没有 .c 扩展名。/Tp 选项指定 filename 为 C++ 源转载 2015-08-05 20:41:15 · 1828 阅读 · 0 评论