C/C++
文章平均质量分 58
ljx_csdn
菜鸟成长记!!
展开
-
有趣的for循环
#include <stdio.h>int main(){ int i = 0; for(i = 0, printf(" First = %d", i);i<10, printf(" Second = %d", i);i++, printf(" Third = %d", i)) { printf(" Fourth = %d", i); }原创 2016-03-24 20:53:03 · 1371 阅读 · 0 评论 -
初识C++之剖析const与#define
1、 编译器处理方式不同 #define是一个宏定义命令,它是在预处理阶段就进行了替换; const修饰的是一个编译时常量,它是在编译阶段处理的。 2、 类型和安全检查不同 #define定义的标识符仅仅是产生文本替换,不管内容是否正确; const修饰的符号是一个具有类型的符号,编译器在编译时会对其做严格的检查。 3、书写方式不同 #define是一个预处理命令,原创 2016-03-26 17:44:36 · 477 阅读 · 0 评论 -
初识C++之指针与引用
1、What a. 指针: 指针可以看做是一个特殊的变量,它是用来存放变量的地址值的。 b. 引用 引用的话,可以看做是给变量起的一个别名,而不是定义一个新变量,它与那个变量的本质是相同的,内容与地址都是一样的。2、Distinction a. 引用使用时无需解引用(*),指针需要解引用; b. 引用没有 const,指针有 const; c. 指针是一个实体,而引用仅是个别名; d原创 2016-03-26 16:56:31 · 668 阅读 · 2 评论 -
初识C++之函数重载、重写、重定义的区别
在C++的学习中,慢慢接触了一些很容易混淆的名词,今天就来剖析几个容易混淆的名词。 1、函数重载 重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。想要构成重载函数必须要满原创 2016-04-12 19:56:31 · 3902 阅读 · 0 评论 -
初识C++之函数重载
最近开始学习C++,了解到它在C语言没有的一个特性 – 函数重载,这一特性使得c++的函数数量得以减少,减小了对名字空间的污染,另外对程序的可读性也有很大帮助。那么c++的函数重载这一特性是怎么实现的,为什么不会发生命名冲突呢?别的函数在调用这些函数时编译器是怎么解析的呢?怎么知道它该调用哪一个函数呢?下面就这些问题来做一些简单解析。1、what and whywhat:C++允许在同原创 2016-03-25 16:44:42 · 1044 阅读 · 0 评论 -
初识C++之运算符重载
define原创 2016-03-28 15:01:46 · 574 阅读 · 0 评论 -
初识C++之虚函数
1、什么是虚函数 在基类中用virtual关键字修饰,并在一个或多个派生类中被重新定义的成员函数,用法格式为: virtual 函数返回类型 函数名(参数表) { 函数体 } 虚函数是实现多态性的关键,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。 看两个例子: ①没有定义基类的Fun函数为虚函数:#define _CRT_原创 2016-04-13 01:13:00 · 3720 阅读 · 2 评论 -
初识C++之封装
学习C++不得不说到C++的三大特性:封装、继承、多态,今天就先来剖析一下他的封装性。 1、什么是封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。下面把一个汽车抽象为一个类来举例: 2、封装的目的 封装的目的是增强安全性和简化编程,它们分别体现在: ①增强安全性:使用原创 2016-04-12 21:21:09 · 926 阅读 · 0 评论 -
初识C++之继承
1、何为继承 C++中所谓继承,就是在一个已存在类的基础上创建一个新的类,新类获得已存在类的部分特性(为什么是部分特性,后面会讲到)。已存在类被称为基类(Base Class)或父类(Father Class),新建类被称为派生类(Derived Class)或子类(Son Class)。 继承的声明形式: class 派生类名:[继承方式] 基类列表 { 派生类增加的特性; }原创 2016-04-11 17:30:51 · 2693 阅读 · 0 评论 -
const在C与C++中的区别
1、C语言中的const a. 修饰变量 使用const修饰变量,使该变量的值不能被修改 b. 修饰函数参数原创 2016-03-26 00:13:17 · 1066 阅读 · 0 评论 -
初识C++之多态
多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。 1、什么是多态 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。它是面向对象程序设计(OOP)的一个重要特征。如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的。C++中的多态性具体体现在运行和编译原创 2016-04-13 22:42:20 · 779 阅读 · 0 评论 -
复杂链表的复制
题目:请实现函数ComplexNode* Clone(ComplexNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:struct ComplexNode{int m_nValue;ComplexNode* m_pNext;ComplexNode* m_转载 2016-03-21 15:31:37 · 706 阅读 · 1 评论 -
对堆栈的认识
什么是堆和栈,它们在哪儿?问题描述编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角度上看)? 1、在通常情况下由操作系统(OS)和语言的运行时(runtime)控制吗? 2、它们的作用范围是什么? 3、它们的大转载 2016-03-29 01:51:38 · 2313 阅读 · 2 评论 -
乱入的'\0'
看这个题之前,先来回忆一下strlen函数的工作机制: strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,每碰到一个非’\0’的字符,计数器的值加1,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。#include <stdio.h>int main(){ char a[10原创 2016-03-26 01:32:13 · 505 阅读 · 0 评论 -
C语言交换两个变量数值的几种方法
因为经常见到这类题目,就自己总结了以下几种办法 1. 创建中间变量 这是最快也是最简单的办法,例如:#include<stdio.h>int main(){ int a=10; int b=20; int temp; printf("交换前a,b的值为:\n"); printf("a=%d\n",a); prin...原创 2015-11-25 21:11:29 · 89483 阅读 · 9 评论 -
线性表之顺序表与单链表的区别及优缺点
这里比较的是基于C语言实现的顺序表与单链表,与其他语言的实现可能会有差异,但我相信语言是相通的,它们的实现机制应该也差不多。 1、What 什么是顺序表和单链表 ①顺序表: 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤i≤原创 2016-03-23 23:43:04 · 33527 阅读 · 9 评论 -
二分查找(折半查找)
二分查找(折半查找): 从有序序列中找到给出的要查询的数字。 原理是:首先把一个有序序列中间位置的值与要查找的数比较,若相等则找到了有序序列中的此数;否则比较两者的大小,若前者大,则把有序序列的中间位置以前的元素都去掉,余下的元素组成一个新的有序数列继续上一步的操作,直到找到为止;若后者大,则把有序数列中间位置以后的元素都去掉,余下的元素组成一个新的有序数列,继续第一步的操作,直到找到为止。若所原创 2015-12-21 04:13:43 · 2349 阅读 · 3 评论 -
二级指针、数组指针、二维数组、指针数组作为函数形参时可传入的实参
1、传参规则:a.当二级指针作为函数形参时,能作为函数实参的是二级指针,指针数组,一级指针的地址 b.当数组指针作为函数形参时,能作为函数实参的是二维数组,数组指针 c.当二维数组作为函数形参时,能作为函数实参的是二维数组,数组指针 d.当指针数组作为函数形参时,能作为函数实参的是指针数组,二级指针,一级指针的地址2、实例验证:#include <stdio.h>#include <stdl原创 2016-08-10 00:53:57 · 10264 阅读 · 2 评论 -
C语言extern与static修饰变量
extern和static在C语言里面的作用这里就不做过多的阐述了,下面直接通过一个小程序来看一看他们修饰的变量的特性。#include <stdio.h>int count = 3;int main(){ int i = 0, count = 2, sum = 0; for (i = 0; i < count; i += 2, count++) { sta原创 2016-08-09 11:15:28 · 1166 阅读 · 0 评论 -
C语言注释与C++注释的相互转换
做此项目的经历主要的收获是熟悉了状态机这一方法的使用,还有就是对每实现一个功能就尽量封装一个函数这一概念把握的更为精到。状态机:关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是原创 2016-03-09 00:26:05 · 1912 阅读 · 0 评论 -
测试机器大小端的方法
首先,给出一些大小端相关概念。大小端的由来: 在乔纳森·斯威夫特的著名讽刺小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧。大小端概念: 小端模式: 小端模式(Little-endian),是指数据的高字节保存在原创 2016-03-10 09:29:06 · 3074 阅读 · 0 评论 -
C语言实现单链表面试题汇总
这篇博客只有针对单链表的不同面试题的不同函数,没有对单链表的具体实现方法的介绍。 单链表的具体实现方法(创建,初始化,前插,后插,删除,插入,销毁等),可以参考我的另一边博客: http://blog.csdn.net/ljx_5489464/article/details/50893430以下是单链表面试题的具体实现:1、从尾到头打印单链表void PrintListTailToHead(PS原创 2016-03-20 03:51:53 · 2926 阅读 · 0 评论 -
C语言实现动态顺序表
1、用于存放声明的头文件#pragma once //避免重复引入头文件,作用于预编译指令几乎相同#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <assert.h>#include <malloc.h>typedef int DataType;typedef struct SepList_d{ DataTy原创 2016-03-14 13:33:19 · 2300 阅读 · 0 评论 -
C语言实现单链表
1、用于存放声明的头文件#define _CRT_SECURE_NO_WARNINGS#pragma once#include <stdio.h>#include <assert.h>#include <malloc.h>typedef int DataType;typedef struct SListNode{ DataType data;原创 2016-03-15 04:07:19 · 2087 阅读 · 0 评论 -
重载函数编译后的新名字
我们都知道很多语言都支持函数重载,那么编译器是怎么处理编译后它们的命名冲突的呢?1、先给出几个正确的重载函数:#include <iostream>using namespace std;int Add(int a, int b){ return a + b;}double Add(double a, double b){ return a + b;}double Add原创 2016-03-25 16:31:08 · 1873 阅读 · 0 评论 -
分号不是个“随便的人”
分号是个很不起眼的东西,但在C语言编程里面,它的作用不可忽视,多写与漏写都会造成不可预料的错误,下面就列举一些常见的错误。1、多谢了分号 if或while语句块内如果只有一条语句,那么可以省略大括号的书写,然而,当他们的条件判断框后面不小心加了一个”;”时,会使本来想要在if或while条件成立时执行的语句替换成了一个空语句,把原来要执行的语句“挤到了”if或while语句块外面,使其不管if或w原创 2016-03-09 15:32:05 · 490 阅读 · 1 评论 -
运算符优先级与结合性
优先级的序号越小,优先级越高。原创 2016-03-09 14:18:05 · 775 阅读 · 0 评论 -
防止头文件重复包含之pragma once与#ifndef
在我们自己编写 C/C++的头文件时,可能会忽略一点:用一些处理机制来避免头文件的重复包含,因为头文件的内容在编译 #pragma once #ifndef #define #endif原创 2016-03-31 00:01:49 · 929 阅读 · 1 评论 -
多维数组元素的下标引用与指针访问
在这儿值介绍二维数组元素的访问方式,三维、四维……的与之类似。 先用一位数组的相关知识来抛砖#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>//1、一维数组元素的下标引用与指针访问int main(){ int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; printf("%d\n"原创 2016-03-06 19:46:50 · 1978 阅读 · 0 评论 -
printf函数的格式修饰符
本文介绍printf函数的一些特殊的格式控制修饰符1、域宽修饰符 –> 数字 对所有格式控制符都有效,即便是%%也不例外 宽度修饰符出现在%和格式控制符之间的数字,使数据在固定区域打印。如果待打印的数值不能填满位置,它的左侧会被天上空格以满足填满域宽区域,这些数值是右对齐的;如果超过了给定域宽,输出区域会调整域宽以恰好能容纳该数值,而不会把该数值截断。#include <stdio.h>int原创 2016-03-16 01:18:56 · 7118 阅读 · 0 评论 -
浅谈C语言字节对齐
首先,我们得知道为什么要进行内存对齐,它的意义何在?在这儿可以先看这样一张图。(手绘请见谅!!!) 我们知道,在32位CPU下,一个读取周期可以读取四个字节。一个字符变量在内存中占一个字节,而整型为在内存中占4个字节。 那么CPU一个读写周期刚好能读取一个整形,所以如上边左图,两个整型变量分别读写一次即可;而上面中间的图,第一个读写周期读取的四个字节为一个char变量原创 2015-11-24 01:51:40 · 1757 阅读 · 0 评论 -
数组的下标越界与内存溢出
很相似的两个概念,一不小心就会混淆首先,对两个名词做一个大概的解释:下标越界 在引用数组元素时,使用的下标超过了该数组下标的应有范围,但应注意的是: C/C++不对数组做边界检查。 可以重写数组的每一端,并写入一些其他变量的数组或者甚至是写入程序的代码。不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这原创 2015-12-15 14:04:02 · 17633 阅读 · 1 评论 -
C语言实现三子棋游戏
先直接上代码:#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> //2.实现三子棋游戏。#include<Windows.h> //Sleep() RAND_MAX 的头文件void menu() //打印菜单{ printf("******************原创 2015-12-17 15:18:41 · 4895 阅读 · 7 评论 -
C语言实现用星号在屏幕上打印菱形
很多人第一感觉肯定都是;很简单啊,不就是多写几个printf 语句嘛像这样:#define _CRT_SECURE_NO_WARNINGS 1#includeint main(){ printf(" *\n"); printf(" ***\n"); printf(" *****\n"); printf("*******\n"); pr原创 2015-12-21 12:46:29 · 23862 阅读 · 0 评论 -
函数声明
对C缺陷与陷阱里第二章第一节里面的函数声明的一些段落的理解原创 2016-03-09 15:59:14 · 273 阅读 · 0 评论 -
scanf()函数错误把输入缓存里的回车作为一次字符输入
有时我们会需要连续的从标准输入中多次读入数据时,那么就可能存在连续使用多次scanf()函数的情况。然而在连续使用scanf()函数时可能会出现一些难以预料,不易发现的坑#include <stdio.h>int main(){ char str[20] = { 0 }; char c = 0; scanf("%s", str); scanf("%c", &c);原创 2016-03-08 23:43:46 · 4844 阅读 · 0 评论 -
C语言实现通讯录
通过本次码代码的过程,对预处理机制以及一个工程的分块完成有了一定认识,主要需要对结构体变量的定义及使用方法和文件的操作方法能基本掌握,同时对函数的封装以及调用有了更深一步的理解1、用于声明的头文件#define _CRT_SECURE_NO_WARNINGS 1#include"contact.h"int main(){ Contact pcon = { 0 }; load_con原创 2016-03-09 00:52:34 · 970 阅读 · 0 评论 -
C语言实现静态顺序表
1、用于存放声明的头文件#ifndef __SEP__LIST__#define __SEP__LIST__#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <assert.h>#define MAX_SIZE 10 //使顺序表中可以插入的数据是可以很方便调整的typedef int DataTy原创 2016-03-14 13:28:07 · 854 阅读 · 0 评论 -
前置++与后置++之一道简单的题目引发的思考
引言昨晚一时兴起,我脑子就问自己下面的代码会输出什么,也不知道我脑子为什么有这个代码模型,只是模糊的有些印象:#include <stdio.h>#include <stdlib.h>int main(int argc,char** argv){ int i=3,j; j=(i++)+(i++)+(++i); printf("i = %d, j = %d\n",i,j);转载 2016-03-24 01:36:13 · 808 阅读 · 0 评论 -
运算符求值顺序
&&与||两个运算符的求值顺序是非常重要的,因为很多判断语句都是基于它们拥有一定的求值顺序才能正确进行的。eg: if((num1 != 0) && (num2 / num1 \ > num2 - num1)) 上面的if()判断语句合理的运用了&&运算符,使之不会出现0做除数的情况(num1 = 0时),因为&&运算符的求值顺序是从左到右的,且它有一个特性,就是当左边的值为假时,就不用再求右边原创 2016-03-10 13:26:34 · 858 阅读 · 0 评论