C语言
博弈Dream
code and code
展开
-
C语言 内存操作函数
根据定义,字符串由一个NUL字节结尾,所以字符串内部不能包含任何NUL字符。但是,非字符串数据内部包含零值的情况情况并不罕见。你无法使用字符串函数来处理这种类型的数据,因为当遇到第一个NUL字节时将停止工作。下面介绍一组相关的函数,它们的操作与字符串函数类似,但这些函数能够处理任意的字节序列。下面是函数的原型。void *memcpy(void *dest,void const *src,原创 2017-12-08 16:10:36 · 958 阅读 · 0 评论 -
几种从stdin读入字符串的方式
gets函数原型:char * gets ( char * str );功能:gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取,所以应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。返回值:读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feo原创 2017-09-23 21:03:05 · 7228 阅读 · 0 评论 -
C程序编译过程
C语言一般用gcc进行编译,下面一个程序helloword.c:#include#define BUF_SIZE 30int main(){ char s[BUFSIZE]="hello,world!"; printf("%s\n",s);}用gcc来生成可执行程序,命令为gcc helloword.c -o helloword,helloworld是可执行文件。其中过程一般包原创 2018-01-18 19:04:40 · 351 阅读 · 0 评论 -
C语言 struct、union和enum
结构体 结构就是一种把一些数据项组合在一起的数据结构。进行组合的通常方法就是把需要组合的东西放在花括号里面:{内容...}。关键字struct放在左花括号前面,以便编译器能够从程序块中认出它:struct { 内容... } 结构的内容可以是任何其他数据的声明:单个数据项、数组、其他结构、指针等。然后可以在结构的定义后面跟一些变量名,表示这些变量的类型是这个结构。例...原创 2016-11-25 19:17:17 · 971 阅读 · 0 评论 -
关于C预处理器宏定义
预处理器是编译过程中单独执行的第一个步骤。最常用的预处理器是:#include指令(用于在编译期间把指定文件的内容包含进当前文件中)和#define指令(用任意字符序列替代一个标记)。1. 文件包含 文件包含指令(即#include指令)使得处理大量的#define指令以及声明更加方便。在源文件中,任何形如:#include“文件名” #inclu...原创 2018-03-07 09:54:27 · 487 阅读 · 0 评论 -
内存对齐
内存对齐的原因1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。对齐规则1、对于结构体的各个成员,第一个成员的偏移量是0,排列在后面的成员其当前偏移量必...原创 2018-03-09 11:20:11 · 279 阅读 · 0 评论 -
最大公约数与最小公倍数
位操作由三个操作符&、|、^,分别对它们的操作数的各个位执行AND、OR和XOR(异或)等逻辑操作。当两个位进行AND 操作时,如果两个位都是1,结果为1,否则结果为0。当两个位进行OR操作时,如果两个位都是0,结果为0,否则结果为1。当两个位进行XOR操作时,如果两个位不同,结果为1,如果两个位相同,结果为0。 位操作符要求操作数为整数类型,它们对操作数对应的位进行指定的操作,每次对左右...原创 2018-05-09 10:31:45 · 401 阅读 · 0 评论 -
空悬指针与野指针
当delete一个指针后,指针值 就变为无效了。虽然指针已经无效,但在很多机器上仍然保存着(已经释放了的)动态内存的地址。在delete之后,指针就变成了人们所说的空悬指针,即指向一块曾经保存数据对象但现在已经无效的内存的指针。 野指针即未初始化指针,在指针即将要离开其作用域之前释放掉它所关联的内存可以避免空悬指针问题。在指针关联的内存被释放掉以后,就没有机会继续使用指针...原创 2017-11-30 10:56:50 · 544 阅读 · 0 评论 -
C/C++ typedef关键字
typedef与函数指针typedef 为一种类型引入新的名字,而不是为变量分配空间。在某些方面,typedef 类似于宏文本替换——它并没有引入新的类型,而是为现有类型取个新名字,但和文本替换之间有着关键性区别。一般情况下,typedef用于简洁地表示指向其他东西的指针。典型的例子是signal()原型的声明。signal()是一种系统调用,用于通知运行时系统...原创 2018-04-27 14:51:03 · 399 阅读 · 0 评论 -
C语言 求两个矩阵相乘
矩阵相乘肯定都不陌生,那么如何用C语言实现矩阵相乘呢?先看下面两个矩阵相乘:矩阵A和B都是两行两列,矩阵相乘时,A的行元素乘以B的列元素,然后相加。即20*2+5*1=45作为C11(矩阵C的第一行第一列)20*1+5*4=40作为C12(矩阵C的第一行第二列)15*2+10*1=40作为C21(矩阵C的第二行第一列)15*1+10*4=55作为C22(矩阵C的第二行第二列) 因此...原创 2017-10-08 11:13:48 · 29450 阅读 · 14 评论 -
关于原码、反码与补码
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。在计算机内存中一般用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。原码原码是一种计算机中对数字的二进制表示方法。原...原创 2017-11-06 09:14:36 · 635 阅读 · 0 评论 -
关于int *p[n]和int (*p)[n]的超详细讲解
在编程中,会遇到这样的情况:int *p[n];int (*p)[n];还有一种情况是声明函数:int *p();int (*p)();这些分别表示什么意思呢?表面上看这些问题,好像是指针,但是,如何来正确判断这几个定义,需要我们首先有运算符优先级的概念。在c语言中,[]和()的优先级比星号(星号的名字叫做“指针运算符”)要高,所以,在这几个声明中,先看[]转载 2017-03-20 18:51:28 · 1257 阅读 · 1 评论 -
gcc与g++比较
一:gcc与g++比较编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而 c++代码用g++,或者说编译用gcc,链接用g++,一时也不知哪个说法正确,如果再遇上个extern "C",分歧就更多了,这里我想作个了结,毕竟知识的目的是令人更清醒,而不是更糊涂。 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意转载 2017-05-05 19:23:03 · 943 阅读 · 0 评论 -
C/C++中extern关键字
extern关键字可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。在介绍外部变量之前,先来看一下什么是局部变量。下面是一个例子。#include<stdio.h>#define MAXLINE 1000int getline(char line[],int maxline);...原创 2017-06-06 19:32:41 · 451 阅读 · 0 评论 -
fgets、fgetc、fputs与fputc函数
fgets函数函数原型:char *fgets(char *buf, int bufsize, FILE *stream);参数:*buf: 字符型指针,指向用来存储所得数据的地址。 bufsize: 整型数据,指明存储数据的大小。 *stream: 文件结构体指针,将要读取的文件流。返回值:成功,则返回第一个参数buf;在读字符时遇到eof,则eof指示器原创 2017-08-04 18:17:26 · 2257 阅读 · 0 评论 -
memmove函数用法
memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。 函数简介 原型:void *memmove( void* dest, const void* src, size_t co...原创 2017-05-22 09:39:49 · 3874 阅读 · 1 评论 -
C语言 流操作函数
Shell 函数Shell 函数可以看做是位于脚本中的“微脚本”,Shell 函数有两种语法形式:function name { commands return}andname () { commands return}这里的name 是函数名,commands 是一系列包含在函数原创 2017-04-17 18:49:11 · 755 阅读 · 0 评论 -
C 动态内存分配函数
程序使用动态内存分配的最重要的原因是经常直到程序实际运行时,才知道某些数据结构的大小。例如,假设要求我们编写一个C程序,它读取一个n个ASCII码整数的链表,每一行一个整数,从stdin到一个C数组。输入是由整数n和接下来要读和存储到数组中的n个整数组成的。最简单的方法就是静态定义这个数组,它最大数组大小是硬编码的:#include "stdio.h"#define MAXN 15213原创 2017-10-02 09:10:46 · 998 阅读 · 0 评论 -
空字符与空格字符、NULL、空字符串
在前面的学习中,我们开发了菜单驱动程序,来产生各种各样的系统信息。虽然程序能够运行,但它仍然存在重大的可用问题。它只能执行单一的选择,然后终止。更糟糕地是,如果做了一个无效的选择,程序会以错误终止,而没有给用户提供再试一次的机会。如果我们能构建程序,以致于程序能够重复显示菜单,而且能一次由一次的选择,直到用户选择退出程序,这样的程序会更好一些。在这一章中,我们将看一个叫做循环的程序概念,其可用原创 2017-04-18 08:51:03 · 3407 阅读 · 0 评论 -
位操作
移位操作只是简单地把一个值的位向左或向右移动。移位操作符右移位操作符 >>左移位操作符 左移位在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。下面是一个左移位例子。对于一个数n,左移4位,n当n=7时,二进制表示 0000 0111向左移动4位,空位补0 0111 0000 (十进制为112)当n=-7时,二进制表示 1原创 2017-11-10 07:47:26 · 2476 阅读 · 0 评论 -
C/C++ static关键字
某些变量,比如文件stack.c中定义的变量sp与val以及文件getch.c中定义的变量buf与bufp,它们仅供其所在的源文件中的函数使用,其他函数不能访问。用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译文件的剩余部分。通过static限定外部对象,可以达到隐藏外部对象的目的,比如,getch-ungetch复合结构需要共享buf与bufp两个变...原创 2018-06-11 16:07:56 · 519 阅读 · 0 评论