![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 74
silentsharer
Less is More
展开
-
C语言程序内存结构
一个32位的运行在保护模式下应用程序,无论是Linux 还是Windows 都给它分配一个4GB的平坦的内存空间一个运行着的c程序所占用的内存空间分为: 代码区 初始化数据区 未初始化数据区 堆区 和 栈区 在地址上从高位到地位为(高位) 栈区 堆区 未初始化数据区(即BBS) 数据区 代码区 (低位)栈区存放函数的参数值、局部变量的值 , 由编译器自动分配释放 比如实现函数的原创 2015-08-26 20:46:17 · 619 阅读 · 0 评论 -
C基础知识进阶(上)
C语言基础知识Chapter 1 概述 1、生成.exe文件的4步预处理 ——-> .i 文件编译———-> .s 文件汇编———-> .o文件link———–> .exe 文件2、C语言区分大小写: 关键字一般小写,宏定义一般要大写(不成文规定,尽管小写也可以) 其他大小写都可以,但是区分大小写3、调试(必须精通调试)按F10或按Fn+F10进入调试状态, sto原创 2015-09-07 19:06:26 · 697 阅读 · 0 评论 -
C语言基础知识进阶(中)
Chapter 1 顺序结构1、编译器编译是按文件为单位的,第一次编译所有的文件,之后改动哪个文件就编译哪个文件,木有改动过的文件则不再次编译,这样做可以提高效率2、C语言中尽量不要使用goto语句,除非万不得已不要使用3、if、for、while、do-while后面不加 {} 时,作用范围为第一条语句,即只作用一条语句,如果后面有多条语句,可以用 {} 括起来4、;只有分号的语句是空语句,什么也原创 2015-10-13 20:14:46 · 613 阅读 · 0 评论 -
C++程序员学习发展方向分析和指导(C++入门学习指导建议必看)
一路走来,磕磕碰碰,走到现在,历经了千辛万苦,可是路才刚刚开始走,未来还很长,我将会不断的思考和探索。 我想,如果是打算走进C++编程的同志们,请好好看完这篇文章,或许,对你的发展有所启发。但是,不要企图在这里找到你自己发展的规划和指定好的发展航向和行程。看了这篇文章,能够收到启发,受到鼓舞,也就是本文的一个成功的地方了。如果能够切实的给你指导发展方向,那更是荣幸备至。但是,每个人的兴趣都不一原创 2015-10-13 21:09:14 · 1444 阅读 · 0 评论 -
C++内存的理解
内存可以说是C和C++语言学习的关键点。 这里说一点我的理解,一家之言,欢迎拍砖哈。 内存要想理解透彻,首先要理解内存编址。即不同的内存条,内存模块,插到机器上,具体对应的内存地址是多少。 最开始的PC机,IBM PC XT,只有640k内存。IBM是这么规划的,最低的128k,是BIOS的地址,毕竟BIOS也是汇编语言,它也需要合法地址,才能被CPU正确运行。 512k~640k,被定义为端口原创 2016-02-26 16:52:43 · 966 阅读 · 0 评论 -
C++函数调用约定
函数调用方式FAR PASCAL,__cdecl,_stdcall,__pascal. 解释一: 1、通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。 _stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上原创 2016-02-26 16:58:14 · 724 阅读 · 0 评论 -
C++虚函数表解析
虚函数表: C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。关于虚函数的使用方法,我在这里不原创 2016-05-15 20:40:51 · 391 阅读 · 0 评论 -
C内存操作函数
(1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量. <2>在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. <3>从堆上分配,原创 2015-08-26 21:50:59 · 421 阅读 · 0 评论 -
数组指针和指针数组
指针数组与数组指针的区别: 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。下面到底哪个是数组指针,哪个是指针数组呢: A) int *p1[10]; B) int (*p2)[1原创 2015-08-26 21:43:01 · 340 阅读 · 0 评论 -
malloc/free函数的简单实现及思考
malloc/free函数的简单实现及思考 用于内存管理的malloc/free这对函数,对于使用C语言的程序员应该很熟悉。前段时间听说有的IT公司以“实现一个简单功能的malloc”作为面试题,正好最近在复习K&R,上面有所介绍,因此花了些时间仔细研究了一下。毕竟把题目做出来是次要的,了解实现思想、提升技术才是主要的。本文主要是对malloc/free实现思路的介绍,蓝色部分文字是在个人思考中觉原创 2015-08-26 22:06:58 · 953 阅读 · 0 评论 -
printf函数参数压栈顺序
printf函数的参数的压栈顺序和求值顺序(VC++6.0编译器) 有以下程序段: 设int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)+=123; printf("%d,%d",ptr,(++ptr)); 答案为什么是:8,8 这是一道华为面试题。 这个题考的关键就是printf的运算顺序。这个是比较绕的一个问题,主要考验的是i++ 和++原创 2015-08-26 20:51:43 · 1895 阅读 · 1 评论 -
内存缓冲区fflush(stdin)
内存缓冲区 1. 为什么 fflush(stdin) 是错的? 首先请看以下程序#include <stdio.h>int main( void ){ int i; for (;;) { fputs("Please input an integer: ", stdout); scanf("%d", &i); printf("%d\n"转载 2015-08-26 20:57:22 · 653 阅读 · 0 评论 -
字符串及其操作函数
字符数组和字符串 &字符数组和字符串的概念 &字符数组的初始化&字符串的输入输出 &综合举例字符数组和字符串的概念 字符数组是元素类型为字符的数组 ,它既具有普通数组的一般性质 ,又具有某些特殊性质。 字符串常量是用双引号包围的字符序列。存储字符串常量时,系统会在字符序列后自动加上 ‘/0’,标志字符串的结束。字符串的长度定义为字符串中的有效字符数,不包括结束标志 ‘/转载 2015-08-26 21:10:56 · 470 阅读 · 0 评论 -
C内存对齐
一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它原创 2015-08-26 21:39:11 · 951 阅读 · 1 评论 -
scanf函数加空白符
scanf加空白符之后的效果:空白符 : 空格(space)、TAB、回车(\r)、换页(\f)、换行(\n)while((c = getchar()) == ’ ’ || (c = getchar()) == ‘\t’ || (c = getchar()) == ‘\n’);//跳过空白符、注意while语句后面是分号while((c = getchar()) == ’ ’ || (c = get原创 2015-08-25 23:05:29 · 1395 阅读 · 0 评论 -
scanf函数详解
函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,…]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。 其调用格式为: scanf(“<格式化字符串>”,<地址表>); scanf()函数返回成功赋值转载 2015-08-26 18:35:30 · 849 阅读 · 0 评论 -
二维数组和指针
数组名的本质是代表数组对象的变量名,是一个左值,是一个不能被改变的左值。但是由于在程序中不保存数组的大小,所以通过数组名只能访问数组的左值,不能访问数组的右值。由于这个原因,数组名在作为右值使用的时候被赋予另外一个新的意义——指向数组第一个元素的指针,这就是 array-to-pointer 转换规则。 数组名在程序中作为左值使用的情况屈指可数——在大部分情况下数组名都是作为右值使用的,原创 2015-08-26 21:47:30 · 718 阅读 · 0 评论 -
指针和地址的区别
/* 作者:丫丫 功能:测试传递指针和传递地址不一样(以二叉树的建立分析) 结论:传递指针指针所指的不容不会被改变,而传递地址则该地址的内容会被改变 日期:2014年12月3日 */#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define STACK_SIZE 50//定义二叉节点typedef struct原创 2015-08-26 21:13:14 · 1931 阅读 · 0 评论 -
C++内存分布 虚表 虚指针(非常重要)
C++内存分布 虚表 虚指针: class Base { public: int m_base; }; class DerivedA: public Base { public: int m_derivedA; }; class DerivedB: public Base { public: int m_derivedB; }; class D原创 2016-05-15 21:03:47 · 12472 阅读 · 1 评论