C/C++程序基础知识与概念
Cbird-coder
将这人工智障的时代拉回正轨
展开
-
C与C++混编所遇到的问题
今天团队成员做了一个PID算法原创 2014-07-30 23:49:31 · 4883 阅读 · 0 评论 -
C++模板类编写需要注意的一点
今天,写一个简单的队列实现的程序,利用模板。按照传统的思维,类的声明定义在.h文件中,模板类成员函数的实现在.cpp文件中。但是编译的时候没问题,但是链接的时候不能链接到模板函数而出错。这个问题的主要原因在于模板在主函数里实例化的时候,调用模板类函数,但是又找不到模板的原型,从而导致出错。这一点是模板区别于传统的编程方式。所以这个问题的解决方法就是把模板类函数的实现和类的声明放在同一个原创 2015-09-03 21:16:53 · 1058 阅读 · 0 评论 -
C++利用模板实现队列
本文的代码参考C++ primer上代码进行理解,代码如下:queue.h文件:#ifndef QUEUE_H#define QUEUE_H 1#include"questa.h"/**友元类与函数**/template class Queue;template ostream& operator&);/**队列元素类**/template class Queueite原创 2015-09-04 00:14:19 · 685 阅读 · 0 评论 -
程序结构与进程结构
学习编程,但是对其根源从未探索,总觉得心里空荡荡的,有时候对根源大的探索是进一步的学习。在程序写好后,我们进行编译,之后生成一个可执行文件,Linux下为ELF文件,window下会经常看到是一个后缀为.exe的文件,其实为PE文件。那这些文件中结构怎样,定义的变量还有语句是怎么在这个可执行文件中存储的?我们编译源文件的时候,经过预编译->编译->汇编->链接。最终完成一个可执行文件的生成原创 2015-07-19 18:00:31 · 712 阅读 · 0 评论 -
C++模板学习之栈的实现
昨天写写了C++ primer上队列的实现,今天在此基础上看看栈的实现。其中questa.h头文件的内容为:#ifndef _QUSTA_H#define _QUSTA_H 1#include#include#include#include#include/**顺序容器**/#include#include#include#include#include/*原创 2015-09-04 11:59:09 · 407 阅读 · 0 评论 -
C++模板学习之单链表的实现
本次实现一个单链表的类模板,可以实现链表的头插法、尾插法,从头删除链表类模版如下:#ifndef _LINK_H#define _LINK_H 1#include"questa.h"template class link;template ostream& operator&);template class linkitem{ type data; linkitem *n原创 2015-09-05 17:10:33 · 548 阅读 · 0 评论 -
有关数据类型的范围问题!!
在面试或者国内几个大厂的在线笔试中,编程总会设置一个数据范围。基本上都是10的9次方,也就是数量级是10亿!这里先不考虑内存的限制,那么定义一个数亿级的数组会不会有问题,有没有超出范围,怎么确定你的数组有没有越界啊?我们以32位系统为例,32位系统,虚拟内存的大小为4GB,也就是可管理的物理内存最大为4GB。如果是无符号的数(unsigned int),32位系统下其大小为2的32次方原创 2015-09-16 22:20:43 · 487 阅读 · 0 评论 -
C++之虚函数
C++三大特性:封装、继承、多态。封装呢?就是类的概念,把属于这个类的函数、变量与其他隔离起来。继承呢?派生类可以继承基类的方法。有三种方式继承:public、private、protected。多态呢?就是今天要说的虚函数的概念。先看一段代码:#include#includeusing namespace std;class Animal{public:原创 2017-09-14 23:11:08 · 374 阅读 · 0 评论 -
整数相加溢出判断问题
查阅参考这篇文章进行理解:http://phrack.org/issues/60/10.html整数相加溢出后一般不会报错。含符号整数,如果溢出则将符号位置位,两个正数相加的结果可能最后成了负数,这在有些场景中会引发一系列的bug。无符号整数相加,溢出的时候会利用最大数加1作为模值(MAXINT + 1)取模,同样会引起一系列的bug。比如下面无符号数溢出的情况:#include#inc原创 2015-07-24 16:00:18 · 14093 阅读 · 2 评论 -
内存分配、释放以及内存分配系统调用
在做C/C++编程的时候,最棘手处理的大概就是内存操作了。前一段时间查看资料得知内存管理的算法大致有两种:内存分配算法、内存页面置换算法,对这些算法虽然可能不需要实现,但是需要了解其中的概念原理,以备不时之需。内存分配的算法主要有5种:第一种是固定内存分配,也叫位图分配算法:固定内存分配,从其字面意思就可以看出来,分配的内存是固定的。比如1GB的内存可用于分配,每个分配的内存块的大原创 2015-07-22 22:23:45 · 5228 阅读 · 0 评论 -
指针数组的关系与区别、柔性数组
先看一段代码:void test_pointer(){ int a[5]={1,2,3,4,5}; int *ap; int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1); ap=a+2; printf("ptr1[-1]:%x\nptr1:%x\na:%x\nptr2:%x\n",ptr1[-1],pt原创 2014-10-20 18:30:20 · 818 阅读 · 0 评论 -
字符串数组的问题!
测试一个程序,将多个字符串数组依次遍历,找出待查找的字符串位于那个数组。定义字符串数组的时候如下定义:char *str1[]={"hello","world","china","Ich","Liebe"};char *str2[]={"hehe","haha"}这里在遍历查找字符串的时候,陷入了一个思维误区。认为每个字符串数组的终止值为NULL。然后利用下面的结构进行测试:int原创 2015-05-28 03:07:35 · 675 阅读 · 0 评论 -
一个最容易忽略的问题scanf的结束条件以及返回值
scanf的返回值是正确输入的参数个数。scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(1)遇空格、“回车”、“跳格”键;(2)遇宽度结束;(3)遇非法输入。以下这段代码:int test() { char str[80]; scanf("%s",str); printf("%s",str); return 0; } 编译后,输入hello w原创 2015-06-26 23:14:33 · 27869 阅读 · 0 评论 -
二级指针的理解
今天看到一段关于二级指针的使用,代码如下:原创 2014-06-20 16:47:22 · 780 阅读 · 1 评论 -
位运算的一些总结
C语言中有关位运算的操作符按照优先级排列一共有: ~:按位取反;>:左移与右移;&:按位与;^:按位异或;|:按位或;比如对两个数进行交换的时候可以采用swap进行操作,求平均值可以采用average函数操作:#include#include#includetypedef unsigned int type;void swap(type *a,type *b原创 2015-07-28 16:14:35 · 348 阅读 · 0 评论 -
C语言(回调函数与转移表)
在说回调函数与转移表之前,先看下什么叫做函数指针~首先看两个非法的函数声明:int fun()[];/***1***/int fun[]();/***2***/首先看第一个声明,函数的返回值是一个数组?这个本身就是不对的,函数只能返回标量。再看第二个声明,函数名的是一个数组,数组元素必须要有相同的长度,不同的函数必然具有不同的长度。再看看下面两个声明,这个是合法的:原创 2015-07-17 17:46:17 · 2725 阅读 · 0 评论 -
两个变量进行交换
一般思路:void(int &a,int &b){ int temp; temp=a; a=b; b=temp;} 位运算实现交换:void swapdata(unsigned &a,unsigned &b){ a=a^b; b=b^a; a=a^b;}接下来的一种,可以实现交换,但是第一眼看去存在溢出的问题,但是在v原创 2015-08-28 22:54:24 · 634 阅读 · 0 评论 -
数组参数传递时需要注意的事项
在进行C/C++编程的时候,常常会处理形参是数组的类型,如下的类型:void printdata(int arr[100]){ for(int i=0;i<100;i++) cout<<arr[i];}看这段程序,我们很容易知道,传递的时候,不管传递什么,编译器都将传递过来的参数转化为指针,这里的100只是个烟雾弹,编译器实际中只会检查是不是指针、元素类型原创 2015-08-29 21:35:16 · 677 阅读 · 0 评论 -
结构体中的内存对齐操作
再说这个之前,先看看下面一个结构体的大小是多少:struct data{ char a; int b; char c;}答案是12!按照一般逻辑思路各个成员的大小加起来不就是了么?但是实际的情况并不是这样的,结构体在实际的内存分配中需要进行内存的对齐操作。这里再说这个之前,先说说偏移量,结构体变量中的成员的地址和结构体变量地址的差值称为偏移量。编译器在编译源代原创 2015-07-21 10:06:35 · 478 阅读 · 0 评论