自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

孙堂吉de博客

https://www.suntangji.me

  • 博客(40)
  • 收藏
  • 关注

原创 了解C++中typename的双重意义

typename的最多用法就是模板声明中,以下两种声明没有任何区别。template <class T>class Test;template <typename T>class Test;typename的另一个作用就是使用嵌套依赖类型(nested depended name)。#include <iostream>#incl...

2018-06-02 17:46:14 553

原创 C++对象模型之内存布局

探讨单继承、多继承、虚拟继承、以及多态下的内存模型。 本文将分别讨论无继承下的内存布局单继承下的内存布局多继承下的内存布局菱形继承下的内存布局虚拟继承下的内存布局多态下的内存布局无继承下的内存布局class A { public: A():a(10) {} void A1() {} int a;};内存布局如图1,所有内存模型低地址在下,高地...

2018-06-02 00:32:56 223

原创 linux进程状态

进程执行时,它会根据具体情况改变状态。进程状态是调度和对换的依据。 进程状态Linux 中的进程主要有如下状态#define TASK_RUNNING 0#define TASK_INTERRUPTIBLE 1#define TASK_UNINTERRUPTIBLE 2#define TASK_STOPPED 4#define TASK_TRACED

2017-12-29 11:18:52 366

原创 linux的进程控制块task_struct

Linux 中的每个进程由一个task_struct 数据结构来描述,在Linux 中,任务(Task)和进程(Process)是两个相同的术语,task_struct 其实就是通常所说的“进程控制块”即PCB。task_struct 容纳了一个进程的所有信息,是系统对进程进行控制的唯一手段,也是最有效的手段。 按功能可做如下划分进程状态(State)进程调度信息(Scheduling Inf

2017-12-19 12:23:03 926

原创 UNIX v6的进程控制块proc结构体和user结构体

进程的状态信息和控制信息等由 proc 结构体和 user 结构体管理。每个进程各自会被分配1 组上述结构体的实例。 proc 结构体常驻内存,而 user 结构体有可能被移至交换空间。 proc 结构体由 proc 结构体构成的数组 proc[]中的每个元素分别对应一个进程。proc 结构体管理着在进程状态、执行优先级等与进程相关的信息中需要经常被内核访问的那部分信息。举例来说,内核在(进程切换

2017-12-19 12:22:01 3040

原创 c++继承

什么是继承继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。继承的语法在代码中和原来一样给出该类的名字,但在类的左括号前面,加上一个冒号和基类的名字(多重继承基类名用逗号分开)继承的关系 继承方式 基类的public成员 基类的protect成员 基类的private成员 public 仍为

2017-12-13 18:13:45 151

原创 cpp学习总结

c++学习总结思维导图 链接地址

2017-12-09 19:59:04 294

原创 vim配置及常用插件安装

前言作为一个程序员,一个常用的工具就是编辑器,常用的编辑器有Sublime Text、Emacs、Vim、Source Insight、Atom、TextMate.引用知乎大佬刘尚奇的言论 中国范围,08年以前Vim和Emacs认知度较低,两基友相爱相杀,流行度不相上下;此后Vim一跃领先,在11年后以压倒性优势成为最流行的editor;Emacs份额也稳中有升,并在12年后迎来更广

2017-11-20 13:17:43 4828

原创 c/c++中static关键字和extern关键字

在c语言中的static关键字 static修饰局部变量 改变该变量的生命周期。该变量只会被初始化一次。对于局部变量是存放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在数据区,其生命周期一直持续到整个程序执行结束。static修饰全局变量 改变该变量的链接属性,也就是只能在本文件中使用该变量。static修饰函数 改变该函

2017-10-31 19:50:24 283

原创 掀开c++中this指针的神秘面纱

我们都知道类的不同实例都可以调用成员函数,那么成员函数如何知道哪个实例要被操作呢,原因在于每个对象都拥有一个指针:this指针,通过this指针来访问自己的地址。#include <iostream>using namespace std;class Date{public: void SetDate(int year,int month,int day) {

2017-10-24 20:25:38 270

原创 c语言三子棋游戏

game.h#pragma once#ifndef __GAME_H__#define __GAME_H__#define ROW 3#define COL 3#include<stdio.h>#include<stdlib.h>#include<time.h>void menu();void game(char board[ROW][COL]);void display(char

2017-09-22 18:06:05 192

原创 c语言扫雷游戏

mine.h#ifndef __MINE_H__#define __MINE_H__#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>#define ROW 9 #define COL 9#define ROWS 7#define COLS 7#define MINECOUNT 8extern

2017-09-22 18:01:16 247

原创 c语言实现动态顺序表

seqlist.h#ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h>#include <stdlib.h>//#include //#include #define DEFAULT_SZ 3 #define DEFAULT_INC 2 typedef int DataType;typedef struct SeqL

2017-09-22 17:54:08 353

原创 把c语言注释转换为cpp注释

主要知识点:有限状态机、文件读写comment.h#ifndef _COMMENT_H__#define _COMMENT_H__#include <stdio.h>#include<stdlib.h>enum Status{ NONE_STATUS, //无状态 C_STATUS, //c状态 CPP_STATUS, //cpp状态 END_STATU

2017-09-22 17:23:12 450

原创 c语言实现文件拷贝命令

主要知识:main函数参数、文件读写#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>int main(int argc, char* argv[]){ FILE *fpread = NULL; FILE *fpwrite = NULL; int c

2017-09-22 17:09:10 5351

原创 通讯录c语言实现(动态内存开辟&文件存储)

contact.h#ifndef __CONTACT_H_#define __CONTACT_H_#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#define ADD 2 //每次增加的容量typedef struct peoinfo{ char name[20]; i

2017-09-22 16:56:46 451

原创 c语言动态内存开辟

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。   我们在定义数组时,需要知道数组的大小,当我们不确定数组大小时需要定义足够大的数组来存放数据,这样造成了空间的浪费,一旦空间

2017-09-02 21:18:10 467

原创 c语言中的整形提升

整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型,然后执行表达式的运算。 #include<stdio.h>int main(){ char a = -1; unsigned char b = -1; char c = a + b; printf("sizeof(

2017-09-02 12:05:49 737 1

原创 c语言可变参数列表

在计算机程序设计,一个可变参数函数是指一个函数拥有不定引数,即是它接受一个可变数目的参数。 在C语言中,C标准函式库的stdarg.h标头档定义了提供可变参数函数使用的宏。要创建一个可变参数函数,必须把省略号(…)放到参数列表后面。函数内部必须定义一个va_list变数。然后使用宏va_start、va_arg和va_end来读取。例如: 以下代码运行在vs2015开发环境下,可能和标准c

2017-08-29 17:49:45 391

原创 判断一个字符串是否是另一个字符串翻转后的结果

字符串abcdef向左翻转一位的结果为fabcde,向右翻转翻转一位的结果为bcdefa.向左翻转两位的结果为efabcd,向右翻转两位的结果为cdefab。 要判断一个字符串是否是另一个字符串翻转后的结果,必须遍历向左翻转和向右翻转0-len(arr)-1位的所有情况。我定义了一个翻转函数reverse,返回值为空,参数为两个指针,第一个是翻转的起始地址,第二个是翻转的结束地址。要想实现向左

2017-08-13 14:08:47 585

原创 谋杀案问题

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。 A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说。 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。   已知3个人说了真话,1个人说的是假话。只需要把他们说的话转换为逻辑表达式,如果相加为3,则说明找到了凶手。 代码如下#incl

2017-08-09 15:48:41 279

原创 模拟实现库函数strcpy

自己动手实现库函数strcpy的功能 定义两个指针,指针dest指向需要进行拷贝的字符串,指针src指向被拷贝的字符串。如果指针src指向的内容不是’\0’,把src所指的内容赋给dest所指的内容。然后把src和dest都加1。函数名为my_strcpy,返回值为char* ,两个参数,分别为字符指针dest,常量字符指针src。该函数没有返回值也可以实现字符串的拷贝,但为了函数的链式访问,

2017-08-09 15:48:26 174

原创 交换2个数

交换两个数,分别用创建第三个变量,和不创建第三个变量的方法,以及用位运算实现. 交换俩个数,用第三个变量.#include <stdio.h>#include <stdlib.h>int main(){ int a = 10; int b = 20; int temp = 0; printf("a=%d b=%d\n", a, b); temp =

2017-08-09 15:48:00 291

原创 将一个整形数组奇数排列在前偶数排列在后

一个整形数组,把奇数排列在前,偶数排列在后,例如 arr[]={1,2,3,4,5,6},排列后arr={1,3,5,2,4,6}. 方法一,定义两个指针p1,p2.p1指向数组的首地址,p2指向数组的最后一位数字的地址。如果p1指向的内容不是偶数,把p1加一,如果p2指向的内容不是奇数,把p2加一 ,如果p1指向了偶数并且p2指向了奇数,把p1和p2所指向的内容交换,直到P1大于p2. 代

2017-08-09 15:47:46 2262

原创 二分查找算法

一个有序的数列,使用折半查找效率更高。   先把要查找的值和数列的中间值进行比较,如果二者相等,我们找到了要查找的值。如果要查找的值小于中间值,说明要查找的值在数列的左侧。此时,令数列的右边界为中间值减去1,重新计算中间值。直到找到要寻找的值。如果数列的左边界大于右边界,说明要找的值不在次数列中。如果要查找的值大于中间值,说明要查找的值在数列的右侧。此时,令数列的左边界为中间值减去1,重新计算

2017-08-09 15:47:28 181

原创 大小写字母转换

输入一个字母,如果是大写,就转换为小写;如果是小写,就转换为大写。 解题思路:由于大小写字母的ascii码值相差32,把小写字母减去32就得到了大写字母,把大写字母加上32就得到了小写字母。 实现代码#include<stdio.h>#include<stdlib.h>#include <string.h>int main(){ char key[10] = {0};

2017-08-09 15:47:07 739

原创 c语言static关键字

c语言static关键字的用法 下面这段程序的输出结果为10个2#include<stdio.h>#include<stdlib.h>int main(){ int i = 0; for (i = 0; i < 10; i++) { int n = 1; n++; printf("%d ", n);//2 }

2017-08-09 15:46:43 339

原创 c语言sizeof关键字

The sizeof keyword gives the amount of storage, in bytes,associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. 简言只,其作用就是返回一个对象或者类型所占的内存字节数。例如

2017-08-09 15:46:29 398

原创 99乘法表

分别使用双层循环,单层循环,goto语句输出99乘法表 使用双层循环输出99乘法表#include<stdio.h>#include<stdlib.h>int main(){ int i, j; for (i = 1; i <= 9; i++) for (j = 1; j <= i; j++) { printf("%

2017-08-09 15:46:08 374

原创 求一个数2进制中1的个数

1.先求出一个数的二进制,然后在计算1的个数 2.用移位操作实现 方法1:一个数除以2的余数就是2进制的最高位,把这个数除以2的结果继续循环,直到除以2的结果为0.循环结束后数组中1的个数,就是结果。 实现代码#include <stdio.h>#include <stdlib.h>int count_one_bits(unsigned int value){ // 返回 1

2017-08-09 15:42:00 263

原创 求一个数的二进制从左到右翻转后的值

在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000   首先要求一个数的二进制,然后把它存入数组中,n&1就是这个数最低位的二进制,然后把n右移一位可以求出倒数第二位的二进制,不断进行循环,直到求出n的最高位的二进制。次时数组中存的就是

2017-08-08 13:07:36 720

原创 三字母词

在ANSIC标准中,定义了9个三字母词(trigraph),三字母词就是几个字符的序列,合起来表示另一个字符。   三字母词使C语言环境可以在缺少一些必需字符的字符集(比如,一些非常老式的键盘上没有[]{}#\^~|)上实现.下图列出了9个三字母词以及它们所代表的的字符。

2017-08-08 13:07:10 250

原创 输出100~200之间的素数

所谓素数是指除了1和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被2~16的任一整数整除。因此判断一个整数m是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数. #include<stdio.h>#include<math.h>#include<stdlib.h>int main(){ int i, n; for

2017-08-08 13:05:25 912 1

原创 输出菱形

第一种方法输出若干个空格形成菱形,第二种方法半径为r的圆的四条互相垂直的切线形成的图形是菱形。 方法一,每一行输出r-i个空格以及2i-1个*,菱形的上半部分和下半部分需要分别输出. 代码如下#include <stdio.h>#include <stdlib.h>int main(){ int i = 0, j = 0,k = 0; for (i = 1; i <= 7

2017-08-08 13:04:32 478

原创 跳水比赛名次问题

5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 A选手说:B第二,我第三。 B选手说:我第二,E第四。 C选手说:我第一,D第二。 D选手说:C最后,我第三。 E选手说:我第四,A第一。 比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。   已知每位选手都说对了一半,那么每位选手说的话转换为逻辑表达式后逻辑或的结果为1.遍历五位选手,他们说的话逻辑表达式结果相加为

2017-08-08 13:04:08 375

原创 用位运算实现加法和减法

用位运算实现加法和减法 位运算异或可以实现没有进位的加法,比如3+4.他们的二进制分别为 00000000 00000000 00000000 00000011 00000000 00000000 00000000 000001003^4的结果为 00000000 00000000 00000000 00000111转换为2进制为7.但是,要想实现有进位的加法就需实现进位。例

2017-08-08 12:59:38 1445

原创 在杨氏矩阵中判断一个数是否存在

杨氏矩阵是一个二位数组,这个数组无论横向纵向都是递增的。 比如数组 1 4 7 2 5 8 3 6 9要想时间复杂度小于o(n)就不能遍历整个数组,其实只需判断这个i行j列的数组的arr[i-1][j-1]是否等于要找的数,如果大于要找的数,说明要找的数一定在该数的左下方。如果小于要找的数,说明要找的数一定在该数的下方。 实现代码如下 c /#include<

2017-08-08 12:59:03 218

原创 字符串翻转

有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student”.   首先把字符串整体翻转,得到的字符串为“i ma a tneduts”,然后对每个单词进行翻转。定义一个翻转字符串的函数str_reverse,这个函数有两个参数,翻转的起始地址char* begin,翻转的结束地址char* end.此函数并不需要参数数组,因为begin

2017-08-08 12:57:27 327

原创 字符数组初始化需要注意的问题

字符数组用不同的方式初始化,结果可能不同 下面这段程序,把字符数组用不同的方式去初始化#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ char arr[] = "abc"; printf("%d\n", strlen(arr));//3 printf("%d\n", size

2017-08-08 12:57:05 561

原创 栈帧

每次调用一个函数,都要为该次调用的函数实例分配栈空间。为单个函数分配的那部分栈空间就叫做栈帧(Stack Frame)。 用一个简单函数Add来理解栈帧,它的功能是求两个数的和。 以下代码运行在Microsoft Visual Studio 2015 X86平台下。#include<stdio.h>#include<stdlib.h>int Add(int i, int j){

2017-08-08 12:49:11 484

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除