C语言学习
剑决浮云气
事了拂衣去,深藏功与名
展开
-
如何在win32控制台下输出wchar_t数组中的中文
1.关键 locale loc("chs"); // 定义“区域设置”为中文方式 wcout.imbue(loc); // 载入中文字符输入方式2.一个例子int __cdecl main(void){ locale loc("chs"); // 定义“区域设置”为中文方式 wcout.imbue(loc); // 载入中文字符输入方式 WSADATA wsaData; if (0 != WSAStartup(MAKEWORD(2, 2), &w原创 2021-11-17 14:29:47 · 466 阅读 · 0 评论 -
在头文件中定义或声明变量
1.在头文件中定义const类型的非static变量,在link时不会报错,这是因为const型的变量在complie时已经转换为常量,每个obj模块里有一个相同内容的常量,并不会有变量名冲突发生。2.在头文件定义非const类型时,link时报错,这是因为这样相当于在每个包含该头文件的cc文件的全局域定义了一个名字相同的全局变量,虽然在complie时由于分开编译,不会产生错误,但是在link时,将会发生变量名冲突。3.在头文件中使用extern 声明一个全局变量时可以的,而且是全局变量使用的推荐做法原创 2021-07-07 21:15:45 · 5098 阅读 · 1 评论 -
关于32位int中 右移和左移的问题
在32位的系统中,无论是char int short他们在左移或者右移的时候,都是 要移动的位数 对 32取余例子 int nNum = 0x1fffffff;//32位 cout<<(nNum>>60)<<endl;用60 对 32取余 得到 28 所以 nNum右移28位cout的结果是1代码#include <iostream>using namespace std;int main(int argc, char* arg原创 2021-04-22 16:59:42 · 2942 阅读 · 0 评论 -
可变参数
用法1.提供一个使用省略号的参数原型2.在函数定义中创建一个va_list类型的变量3.用宏把该变量初始化为一个参数列表4.用宏访问参数列表5.用宏完成清理工作详细描述C 语言允许定义参数数量可变的函数,这称为可变参数函数(variadic function)。这种函数需要固定数量的强制参数(mandatory argument),后面是数量可变的可选参数(optional argument)。这种函数必须至少有一个强制参数。可选参数的类型可以变化。可选参数的数量由强制参数的值决定,或由用来原创 2021-02-25 10:47:25 · 137 阅读 · 0 评论 -
内联函数
一般来说,调用一个函数流程为:当前调用命令的地址被保存下来,程序流跳转到所调用的函数并执行该函数,最后跳转回之前所保存的命令地址。对于需要经常调用的小函数来说,这大大降低了程序运行效率。所以,C99 新增了内联函数(inline function)。关键字 inline 告诉编译器,任何地方只要调用内联函数,就直接把该函数的机器码插入到调用它的地方。这样程序执行更有效率,就好像将内联函数中的语句直接插入到了源代码文件中需要调用该函数的地方一样。要将一个函数定义为内联函数,需要在函数定义时加上 inli转载 2021-02-25 10:27:25 · 228 阅读 · 0 评论 -
C语言中的宏之#define
简单的宏替换#include <iostream>using namespace std;#define STRING "WOSHI\ JINDIE"#define TWO 2#define FOUR TWO*TWOint main(int argc, char* argv[]){ char szBuf[100] = STRING; puts(szBuf); cout<<FOUR<<endl; retur原创 2021-02-25 10:04:25 · 149 阅读 · 0 评论 -
位字段
引用别人的文章文章出处转载 2021-02-24 22:02:14 · 73 阅读 · 0 评论 -
enum
enum 枚举类型,声明符号名称来表示整形常量,占一个int类型的大小enum COLOR { RED, BLUE, PINK, BLACK,GREY};int main(int argc, char* argv[]){ enum COLOR a; cout <<sizeof(a)<<endl; cout<<RED<<endl; cout<<BLUE<<endl; cout<<PINK<<原创 2021-02-24 20:48:10 · 267 阅读 · 0 评论 -
Union
UNION 能在同一内存空间中存储不同的数据类型,但不是同时存储#include <iostream>using namespace std;union TYPE{ char chA; int nNum; double dNum;};int main(int argc, char* argv[]){ union TYPE a; cout<<sizeof(a)<<endl; a.chA = 'A'; cout<<sizeof(原创 2021-02-24 18:53:37 · 97 阅读 · 0 评论 -
静态变量
静态变量的作用域 是文件 ,只在这个文件中有效静态局部变量如果在某个块中,声明了某个静态变量,无论该块是否被访问,该静态变量都在内存中存在。只有访问该块时,才能使用,Static内部变量 保存了上一次使用后的值Static类型的内部变量是一种只能在某个特定函数中使用,但一 直占据存储空间的变量(可以通过指针 在该块的外部进行访问)静态局部变量 只会进行一次初始化 如果最后再次调用Fun1函数 静态局部变量不会再次初始化成10void Fun1(void);void Fun2(void);v原创 2021-02-20 09:17:26 · 3778 阅读 · 0 评论 -
字符串常量
字符串常量属于静态存储类别,该字符串只会被内存存储一次,在整个程序生命周期中可见int main(int argc, char* argv[]){ char *p = "abcdefg"; char *p1 = "abcdefg"; char *p2 = "abc"; printf("p = %p\n",p); printf("p1 = %p\n",p1); printf("p2 = %p\n",p2); printf("abcdefg = %p\n","abcdefg"); retu原创 2021-02-15 11:59:44 · 169 阅读 · 0 评论 -
多维数组
int Arr[4][5]; for(int i = 0; i < 4; i++) { for(int j = 0; j < 5; j++) { Arr[i][j] = i*5 + j; } } printf("*Arr[0] = %d \n",*Arr[0]); printf("*Arr = %d \n",*Arr); printf("&Arr[0][0] = %d \n",&Arr[0][0]); printf("&Arr[0] .原创 2021-02-15 11:35:50 · 60 阅读 · 0 评论 -
指针和引用的区别
引用引用必须初始化引用按标准来说 是不占用内存的引用不能改变自身原创 2021-02-15 11:09:36 · 54 阅读 · 0 评论 -
Const修饰符
指向常量的指针变量const 出现在*号左边 修饰目标 不能改变目标const 目标类型 *p指向变量的指针常量(常指针)出现在*号右边 修饰指针 指针指向不能改目标类型 * const p指向常量的指针常量const 目标类型 * const pint nNum = 10;int nNum1 = 20;int nNum2 = 30;int main(int argc, char* argv[]){ //nNum = 20;//修饰为常量 const int *p = &am原创 2021-02-15 11:07:42 · 120 阅读 · 0 评论 -
指针
指针 无符号长整型 unsigned long指针是什么指针 说全点 就是 指针变量,和其他变量一样,能存储数据,但是他里面存储的是内存中的一个地址。指针就是与内存中的一个地址相关联,来对这个地址中的数据进行相应的操作。拿宾馆来说,指针就是存储着门牌号,我可以根据这个门牌号到了门口,那么*指针(对指针进行解引用)是干嘛呢?就是打开这个门牌号所对应的门,对内部进行操作。指针与整数相加就是拿指针存储的地址的值+n*sizeof(目标类型)int nArr[20];int *p = nArr;原创 2021-02-09 12:12:47 · 113 阅读 · 0 评论 -
缓冲
缓冲分为两类:完全缓冲IO和行缓冲IO完全缓冲IO当缓冲区被填满时才刷新缓冲区(内容被发送到目的地),通常出现在文件输入中,缓冲区的大小取决于系统行缓冲IO当输入输出中出现换行符的时候 刷新缓冲区...原创 2021-02-01 19:36:26 · 78 阅读 · 0 评论 -
逗号表达式
c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值原创 2021-01-31 18:34:42 · 111 阅读 · 1 评论 -
scanf函数的读取
scanf的处理机制scanf()以删除的方式从缓冲区读取数据(输入设备的数据存储缓冲区,比如键盘);也就是说,scanf从缓冲区读入一个数据项,该数据项在缓冲区中就被清除掉了。而如果scanf需要读取一个数据项,返现缓冲区当前是空的,那么程序就会在scanf代码处阻塞,等待用户输入,scanf函数接收到相应的数据项之后,在缓冲区中将这一数据项清除,scanf函数返回,程序继续执行。格式化字符串(format string)格式化字符串规定了 scanf 等函数如何从输入缓冲 stdin 中读取数据原创 2021-01-31 17:02:39 · 3884 阅读 · 1 评论 -
函数调用详解
C语言中函数的传参是从右到左,依次压栈main也是一个函数,与其他函数调用一样1.push ebp将基址指针寄存器入栈,即主调函数的基质2.mov ebp esp 将当前栈顶的值 赋给ebp 成为被调函数的ebp(记录被调函数的基址)3.sub esp 48h留出48h大小的空间留给栈(局部变量 栈的缓冲空间 先给局部变量分配空间 都是全C)4.push ebx esi edi(将这三个寄存器的值压入栈中)5.lea edi [ebp-48h] (将ebp-48h的值转化成地址赋给edi)6原创 2021-01-25 22:45:04 · 411 阅读 · 0 评论 -
刷新输出
printf函数何时将输出发送到屏幕上?最初,printf函数把输出发送到一个叫做缓冲区的中间存储区域,然后缓冲区的内容在不断地发送到屏幕上C语言中明确规定:当缓冲区满,遇到换行字符或者需要输入的时候从缓冲区将数据发送到屏幕/文件 叫做刷新缓冲区...原创 2021-01-25 21:21:54 · 245 阅读 · 0 评论 -
sizeof运算符
sizeof不是一个函数,而是C语言的一个内置运算符,以字节为单位给出指定类型的大小#include "stdafx.h"int main(int argc, char* argv[]){ char *p = "Hello World!"; char Str[20] = "Hello World!"; printf("%d\n",sizeof(Str));//结果是20 printf("%d\n", sizeof(p));//结果是4 printf("%d\n", sizeof(uns原创 2021-01-25 21:15:57 · 98 阅读 · 0 评论 -
有符号char和无符号char
有些C编译器把char实现为有符号类型。有些实现为无符号类型在vc6.0中 经过测试 char是有符号的char,即signed char无符号char 数据范围 0 - 255有符号 char 数据范围 -128- 127#include "stdafx.h"int main(int argc, char* argv[]){ char chA = 128; printf("%d\n",chA); return 0;}结果是-128...原创 2021-01-25 21:03:43 · 1398 阅读 · 0 评论