|
|
|
|
|
|
逗号运算符
摘要:C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如: 3+5,6+8称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为 表达式1,表达式2逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。又如,逗号表达式 a=3*5,a*4对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。另一种认为:“a=3*5”是一个...
阅读全文
const用法
摘要:const主要是为了程序的健壮型,减少程序出错.最基本的用法:const int a=100; b的内容不变,b只能是100也就是声明一个int类型的常量(#define b =100)int const b=100; //和上面作用一样const指针和引用一般用在函数的参数中int* m = &a; //出错,常量只能用常指针int c= 1;const int*pc = &c;//常指针可指向常量const int* pa = &a; //指针指向的内容为常量(就是b的值不变)int const *a = &b; //指针指向的内容为常量(就是b的值不变)*
阅读全文
C语言的 &数组名 和 数组名的区别
摘要:1.如果相同,那么将&数组名赋值或者传递给数组参数的时候,会提示:&数组名类型是 int (*)[],而数组类型是int [],他们不能赋值。2.如果不同,那么为什么,sizeof(&数组名)==sizeof(数组名)??3.同样,&函数名和函数名的区别请尽量详尽地回答,最好提供相关资料的连接谢谢原来是这样的,&数组名和数组名是不同的,根据其数据类型就知道了。问题的关键在于为什么sizeof(数组名)==sizeof(&数组名)呢,原因如下:1,数组名本质上是个地址,但不能说是指针,它能给指针赋值,是因为,指针本身的数据结构和数组名(地址)是一样
阅读全文
C语言运算中的数据类型自动转换原则
摘要:问题1:unsigned int a=20;signed int b=-130;a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?问题2:signed int b=-130;std::couta问题2:int b与常数30进行运算的结果,30默认为int,即int+int=int,结果仍为int问题3:uint i与常数-1运算,结果转化为uint。另外,又做了测试:unsigned short b = 3;cout -1)<<endl;该情况下,unsigned short与int运算,b被转为为int,因此输出为1.问
阅读全文
链表反转
摘要:单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:struct linka { int data; linka* next;};void reverse(linka*& head){ if(head ==NULL) return; linka*pre, *cur,
阅读全文
常见的排序方法
摘要://交换数组中的两个数 public static void Swap(int i,int j,int arr[]) { if(i>=0&&i=0&&jarr[j+1])//交换位置,小的在前面 { temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } //选择排序法 public static void SeclectSort(int arr[]) { int min=0; int flag=0; for(int i=0;iarr[j]) { min=arr[j]; flag=j; } } //接下来交
阅读全文
malloc用法
摘要:malloc用法需要包含头文件:#include 'stdlib.h'函数声明(函数原型):void *malloc(int size);说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:int *p;p = new int; /返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);或:
阅读全文
指针的指针的作用(传说中的二级指针)
摘要:二级指针的作用用处特别大!!!首先主要在数据结构之中当改变指针的时候就需要通过改变指针的指针的值来改变!在数据结构中用处很广.最普遍的比如说链表,通过调用函数改变了链表中的元素,那么整个链表就发生了变化,这种情况下就会用到二级指针,因为链表的起始是通过指向头结点的指针来执行的,所以必须要改变这个指针,怎么样使一个指针改变?在形参传递时,必须传递指针的地址,也就是指向指针的指针.指向指针的指针的作用 :当要修改实参指针的指向的时候,形参必须使用指向指针的指针。当修改的是实参指针指向的内容时,则形参只需是指针即可以下是经典程序(载自林锐的从c\c++高质量编程),讲解的部分是我个人理解void G
阅读全文
关于链表的基本操作包括内容
摘要:链表的主要操作有链表的建立,释放和插入及反转和比较和求中心链表的指针所指向的值等等!!!
阅读全文
基于数组或链表的堆栈实现
摘要:本文使用C语言,给出了堆栈的两种实现:基于数组和基于链表的实现方式。堆栈是一种常用的数据结构,具有“后进先出(Last In First Out)”的特性,常用来进行函数调用时候的参数传递,解决递归函数书的非递归实现,表达式中的括号匹配等问题。堆栈的常用操作如下:createStack(st):建立一个空栈push(st, x):将元素x压入栈st当中,使之成为栈顶元素pop(st,x):当栈非空时,将栈顶元素弹出,并赋值给xtop(st):当栈非空时,返回栈顶元素的值isEmpty(st):判断栈st是否为空#include<stdio.h>#include<assert.
阅读全文
堆与栈有什么区别?
摘要:一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放4、文字常量区 —常量字符串就是放在这里的。
阅读全文
数组仿真堆栈与链表仿真堆栈(内含数组与链表的差别)
摘要:数组和链表其实都能很好的完成这项任务,唯一不同就是,仿真入栈操作时,数组必须提前给出栈的大小,而链表可以使栈的大小实现动态变化,节省内存...其实也就是数组和链表本身的区别了:数组: 优点:查找速度快缺点:大小固定,不适合动态存储,不方便动态添加。链表:与数组相反。优缺点互换。再详细点可以从下面两个方面说:1、从逻辑结构来看 数组必须事先定义元素个数,不能适应数据动态地增减的情况,当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项,而数组比较麻烦的... 2、 从内存存储来看...
阅读全文
计算机内部如何存储数据,关于源码、补码的问题!
摘要:1. 什么是源码,反码,补码?2. 计算机内部存储的是源码 还是 反码 还是 补码??3. 这样一个二进制数:00010010 这是表示正数还是负数?他的几??1.补码(1)正数的补码 与原码相同。 【例1】+9的补码是00001001。(备注:这个+9的补码说的是用8位的2进制来表示补码的,补码表示方式很多,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。)(2)负数的补码 符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 同一个数字在不同的补码表示形式里头,是不同的。比方说-15的补码,在8位2进制里头是11110001,然而在16位2进制补码表...
阅读全文
sprintf深究
摘要:printf 可能是许多程序员在开始学习C 语言时接触到的第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf 了解多吗?在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。所以本文着重介绍sprintf,有时也穿插着用用pritnf。sprintf 是个变参函数,定义如下:int sprintf( char *buffer,
阅读全文
sprintf用法解析
摘要:1:sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf在大多数场合可以替代itoa。 这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。sprintf(s, "%08X", 4567); //产生:"000011D7"上面以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式。这里要注意一个符号扩展的问题:比如,假如我们想打印短整数(short)-1的内存16 进制表示形式,在Win32 平台上,
阅读全文
各种排序算法的时间复杂度 比较
摘要:1.冒泡排序:n*n。俩个for循环决定其时间复杂度为n^2template<classT>voidSwap(TA[],inti,intj){Ttmp=A[i];A[i]=A[j];A[j]=tmp;}//冒泡法bubblesorttemplate<classT>voidBubSort(TA[],intn){for(inti=0;i<n;++i){for(intj=i+1;j<n;++j){if(A[i]<A[j])Swap(A,i,j);}}}2.选择排序:n*n。同样,俩个for循环决定其时间复杂度为n^2。template<classT&g
阅读全文
有符号数和无符号数间的比较.
摘要:cout<<(1>-2)<<endl; //1 正常,都是有符号数cout<<((unsigned int)1>-2)<<endl;// 0 -2被转换为无符号数.cout<<((unsigned int)1>-2.)<<endl;// 1 float不存在无符号数,所以,无符号数肯定大于float型的负数!///////////////////////////////http://www.52rd.com/Blog/Detail_RD.Blog_lentil_13982.html以下实验均在virual
阅读全文
无符号数和有符号数
摘要:无符号数和有符号数是不能进行比较运算的,否则可能会出现意想不到的错误,且极难检查出来! 首先肯几个例子(假设在32位的机器上): 1 1. 0 == 0U 2 2. -1 < 0U (注: 0是无符号的) 3 3. 2147483647U > -2147483647 - 1 4 4. 2147483647 > (int) 2147483648U 结果如下: 1 1. 1 2 2. 0 * 3 3. 0 * 4 4. 1 * 从结果中可以看出,2 3 4都不是我们想像中的结果。在C语言中,当一个无符号数和一个有符号数进行比较运算时,有符号数会被隐含的转换成无符号数,并假设...
阅读全文
关于C++ const 的全面总结
摘要:C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。一、Const作用如下表所示:No.作用说明参考代码1可以定义const常量 const int Max = 100;2便于进行类型检查const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误void f(const int .
阅读全文
指针参数是如何传递内存的
摘要:如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str,200)并没有使str获得期望的内存,str依旧是NULL,为什么?voidGetMemory(char*p,intnum){p=(char*)malloc(sizeof(char)*num);}voidTest(void){char*str=NULL;GetMemory(str,100);//str仍然为NULLstrcpy(str,"hello");//运行错误}示例7-4-1试图用指针参数申请动态内存毛病出在函数GetMemory中。编译器总是要为
阅读全文
|
|