![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
退5不落5
这个作者很懒,什么都没留下…
展开
-
函数返回局部变量
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。下面以函数返回局部变量的指针举几个典型的例子来说明:#incl转载 2020-07-29 09:25:37 · 1940 阅读 · 0 评论 -
C语言中不同类型数据之间的赋值
整数与整数之间一、长度相等(在内存中存储的位数相等)的两个不同的类型的数据之间的赋值在计算机中的存储内容不变,只是数据按照不同的编码格式来解析。二、长 赋值给 短 (短 = 长)截取低位,然后按照短整数的数据类型解析。三、短 赋值给 长 (长 = 短)其中,短转长又分为三种情况:1. 两个数据都是无符号的数据,短整数直接高位补0。2. 两个数据都是有符号的数据,短整数进行符号位扩展。3. 两个数一个是有符号数,一个数是无符号数,那么先将短整数进行位数扩展,过程中保持数值不变,然后按照长转载 2020-07-18 22:08:39 · 5372 阅读 · 1 评论 -
函数返回局部变量
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意...转载 2020-04-12 10:24:52 · 346 阅读 · 0 评论 -
C语言总结导图
C语言学习思维导图1.C语言程序设计知识总体结构2.程序设计基础3.选择结构与循环结构4.数组5.指针6.函数7.结构体、链表与共用体8.编译预处理、文件1.C语言程序设计知识总体结构2.程序设计基础3.选择结构与循环结构4.数组5.指针6.函数7.结构体、链表与共用体8.编译预处理、文件...转载 2019-10-25 15:53:28 · 488 阅读 · 0 评论 -
C++
临时对象产生主要有以下三种情况, 以值的方式给函数传参 隐式类型转换 函数返回一个对象时原创 2019-10-24 08:55:53 · 110 阅读 · 0 评论 -
C中类型转换一
计算机硬件进行算术操作时,要求各操作数的类型具有相同的大小(存储位数)及存储方式。但是,实际由于 C 语言编程的灵活性,在一个表达式或一条语句中,允许不同类型的数据混合运算。此时就需要进行类型转换。类型转换包括强制类型转换和隐式类型转换。隐式类型转换原则:1.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型2.当函数调用时,所传实参与形参类型不一致时,也会把实参自动转...原创 2019-09-06 10:19:34 · 285 阅读 · 0 评论 -
变量在内存存储
对于一个完整的程序:内存分布有如下几个区、栈区、堆区、全局区、常量区、代码区。载自:https://baijiahao.baidu.com/s?id=1610294240775354689&wfr=spider&for=pc...原创 2019-09-06 11:29:04 · 107 阅读 · 0 评论 -
char *p = "hello world!"
很多人犯过这个错误,比如声明char *p = “hello world!”;却妄图用p指针改变字符串内容,所以就这个问题,我总结了一下。主要解析的问题:问题1:#include "stdio.h"char *get_string_1(){ char p[] = "hello world!"; return p;}char *get_string_2(){ ...转载 2019-09-06 18:07:56 · 5000 阅读 · 6 评论 -
函数返回值
在C语言中,局部变量的作用域只在函数内部,在函数返回后,局部变量的内存就会被释放。如果函数只是返回局部变量,那么这个局部变量会被复制一份传回被调用处。但是如果函数返回的是局部变量的地址,那么就会报错,因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放,这样指针指向的内容就是不可预料的内容,程序就会出错。准确的来说,函数不能通过返回指向栈内存的指针(返回指向堆内存的指针是可以的)。...原创 2019-09-13 22:27:47 · 228 阅读 · 0 评论 -
c语言总结二
1.register关键字 register修饰目的:申请将变量存放到寄存器中(早期的C编译程序不会把变量保存在寄存器中,当时register修饰符是一种很有价值的补充。现在基本上会忽略register修饰符) register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。 只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量,局部静态变量...原创 2019-09-16 16:17:00 · 104 阅读 · 0 评论 -
c语言总结
1.浮点数理解float能表示的具体数字的个数与int相同float可表示的数字之间不是连续的,存在间隙float只是一种近似的表示法,不能作为精确数使用2.变量类型转换强制类型转换目标类型能够容纳目标值:结果不变目标类型不能容纳目标值:结果将产生截断注意:不是所有的强制类型转换都能成功,当不能进行强制类型转换时,编译器将产生错误信息。隐式类型转换低类型向高类型的转换是安全的...原创 2019-07-15 17:40:33 · 110 阅读 · 0 评论 -
__attribute__ ((packed)) 和 __attribute__ ((aligned(4)))的用法
1、 attribute ((packed))的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。2、 attribute ((aligned(n)))的作用就是告诉编译器在编译过程中按照n字节对齐。常常用来在结构体后面进行修饰。#include <stdio.h>/*编译器默认是4字节对齐*/struct test{ ...转载 2019-05-15 00:03:54 · 5814 阅读 · 0 评论 -
内联函数
内联函数在C++中我们通常定义以下函数来求两个整数的最大值:复制代码 代码如下:int max(int a, int b){return a > b ? a : b;}为这么一个小的操作定义一个函数的好处有:① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多③ 使...转载 2019-04-17 23:52:01 · 87 阅读 · 0 评论 -
校验和计算
在数据传输过程中,经常用到的校验方式包括校验和,CRC校验,奇偶校验,LRC校验,格雷码校验,异或校验等。如下代码可实现校验和,输入N个数字,以16进制的888结尾,得到校验和。#include <stdio.h>int main(void){ int n=0, sum=0; scanf("%x", &n); while(n != 0x888) { su...原创 2019-02-25 10:05:36 · 1221 阅读 · 0 评论 -
嵌入式面试题
[转载自]https://blog.csdn.net/linuxweiyh/article/details/83658451感觉这些面试题都是我面试笔试题,转回来存着,以后回头多看几遍 1. 用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。#define SECOND...转载 2019-03-04 23:50:24 · 114 阅读 · 0 评论 -
strftime函数
C 库函数size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)根据format中定义的格式化规则,格式化结构timeptr表示的时间,并把它存储在str中。声明下面是 strftime() 函数的声明。size_t strftime(char *...原创 2019-03-05 15:17:12 · 3465 阅读 · 0 评论 -
标准格式与时间戳互转
在嵌入式开发中,经常需要进行时间格式转换1.时间戳 1345302987 转换成标准格式的时间 “2012/08/18 23:16:27”#include <stdio.h> #include <time.h> int main (){ time_t rawtime; struct tm * timeinfo; char buf...原创 2019-03-05 15:28:15 · 308 阅读 · 0 评论 -
integer operation result is out of range
程序中,有如下定义:#define UART1_EN (1<<31)编译后编译器报错:integer operation result is out of range经查资料是由于溢出所致,宏定义默认常量是有符号型,当左移31位时,常数就变成负数,编译器就会给出如上的警告信息解决办法是强制类型转换成无符号类型:#define UART1_EN ...原创 2019-03-08 14:43:32 · 7059 阅读 · 0 评论 -
静态局部变量初始化
mask一下一直以来的一个误区#include &amp;lt;stdio.h&amp;gt;void key(void){ static unsigned char key_up =1; printf(&quot;key_up = %d \n&quot;, key_up); key_up = 0; printf(&quot;key_up = %d \n&quot;, key_up);}in原创 2019-03-07 11:17:06 · 2251 阅读 · 0 评论 -
结构体内存分配及多文件调用
1.基本数据类型只能满足一些基本的要求,只能表示具有单一特性的简单事物。但是对于一些有很多特性的复杂事物,每一个特性就是一个基本类型。这个复杂的事物是由很多基本类型组合在一起而生成的一个比较复杂的类型。这时就需要运用结构体。结构体类型的一般形式为(不叫定义,原因在后面):struct结构体名{ 成员列表};struct结构体名{ int a; char b[1...原创 2019-03-18 15:22:08 · 553 阅读 · 0 评论 -
C语言的头文件和宏定义详解
头文件头文件,顾名思义就是定义在C语言文件头部的那一坨东西#include <stdio.h>这就是一个标准输入输出的头文件声明,头文件声明写在定义文件(后缀名.c的文件)的头部,并在定义文件中具体实现#include <stdlib.h>#include "mylib.h"这是两种声明头文件的方法,其中尖括号表示“到环境指定的...转载 2019-03-23 10:25:23 · 5108 阅读 · 4 评论 -
sizeof数组名
sizeof(数组名)与sizeof(*数组名)举例#include<stdio.h>int main(){int a[5]={1,2,3,4,5};int *p = a;printf("sizeof数组名=%d\n",sizeof(a)); printf("sizeof *数组名=%d\n",sizeof(p));}运行结果sizeof数组名=20si...原创 2019-04-15 23:49:17 · 1634 阅读 · 1 评论 -
memcpy与直接赋值
memcpy内存拷贝和=直接赋值有什么区别 memcpy会执行数据复制,而赋值语句只是简单将一个指针的值传...转载 2019-02-28 14:56:49 · 3490 阅读 · 0 评论