C基础
_int16 = short
_int32 = int = long
_int64 = long long
int j = 15;
int k = 0x0f; // 十六
// 三个值相等都是15
unsigned short twobyte; // 0 - 65535
unsigned fourbyte;
unsigned long fourbyte; // 因系统而变,long unsigned也可以,关键字顺序可以改变
int &t = x; // x,t共同对应一个内存,都可以修改内存中的数值
const int &f = x; // 常引用,只能读取8,不能修改8
&f // 脱离int,&不是引用意思,而是取地址了
优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
1初等运算符,除了()都是关于寻址的 |
[] |
数组下标 |
数组名[常量表达式] |
左到右 |
|
() |
圆括号 |
(表达式)/函数名(形参表) |
|||
. |
成员选择(对象) |
对象.成员名 |
|||
-> |
成员选择(指针) |
对象指针->成员名 |
|||
2单目运算符 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
(类型) |
强制类型转换 |
(数据类型)表达式 |
|||
++ |
自增运算符 |
++变量名/变量名++ |
单目运算符 |
||
-- |
自减运算符 |
--变量名/变量名-- |
单目运算符 |
||
* |
取值运算符 |
*指针变量 |
单目运算符 |
||
& |
取地址运算符 |
&变量名 |
单目运算符 |
||
! |
逻辑非运算符 |
!表达式 |
单目运算符 |
||
~ |
按位取反运算符 |
~表达式 |
单目运算符 |
||
sizeof |
长度运算符 |
sizeof(表达式) |
|||
3算术运算符 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
* |
乘 |
表达式*表达式 |
双目运算符 |
||
% |
余数(取模) |
整型表达式/整型表达式 |
双目运算符 |
||
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
- |
减 |
表达式-表达式 |
双目运算符 |
||
5 |
<< |
左移 |
变量<<表达式 |
左到右 |
双目运算符 |
>> |
右移 |
变量>>表达式 |
双目运算符 |
||
6关系运算符 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
>= |
大于等于 |
表达式>=表达式 |
双目运算符 |
||
< |
小于 |
表达式<表达式 |
双目运算符 |
||
<= |
小于等于 |
表达式<=表达式 |
双目运算符 |
||
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
!= |
不等于 |
表达式!= 表达式 |
双目运算符 |
||
8位运算符 |
& |
按位与 |
表达式&表达式 |
左到右 |
双目运算符 |
9 |
^ |
按位异或 |
表达式^表达式 |
左到右 |
双目运算符 |
10 |
| |
按位或 |
表达式|表达式 |
左到右 |
双目运算符 |
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 |
三目运算符 |
14赋值预算符 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
|
/= |
除后赋值 |
变量/=表达式 |
|||
*= |
乘后赋值 |
变量*=表达式 |
|||
%= |
取模后赋值 |
变量%=表达式 |
|||
+= |
加后赋值 |
变量+=表达式 |
|||
-= |
减后赋值 |
变量-=表达式 |
|||
<<= |
左移后赋值 |
变量<<=表达式 |
|||
>>= |
右移后赋值 |
变量>>=表达式 |
|||
&= |
按位与后赋值 |
变量&=表达式 |
|||
^= |
按位异或后赋值 |
变量^=表达式 |
|||
|= |
按位或后赋值 |
变量|=表达式 |
|||
15 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
从左向右顺序运算 |
{
case 1: // 1执行后,继续2,因为没有break;
case 2: break; // 执行后不会,有break;
default: // java还是会有。不需要break;
}
int a[5] ={1,5,5,6,4}; int i = 4;
a[4] = 4[a] = i[a];
// 一维数组
int a[] = {2,3}; // 可以不是先说明数组元素个数,但是一定要先初始化,a[2]可以不用。不说个数一定要先初始化。
cout << *a << endl;
// 二维数组
int b[][4] = {4,{3}}; // b是二维指针不能赋值给一维指针
int c[3][4] = {13}; // c[0]类似上面的a,是一个指针。c是一个二维指针,指向三个指针,指针又指向数组
sizeof(a); // 20 指针作为参数,会丢失size,这是数组和指针一模一样
int func(int *a)
{
sizeof(a); // 4;
}
类型
|
指针变量 Int *p; |
指向常量的指针 Const int *p; |
指针常量 Int *Const p; |
指向常量的指针常量 Const int *const p; |
是否可以指向变量 |
是 |
是 |
是(指针是常量,一指向无法修改) |
是 |
是否可以指向常量 |
否(p指针无法通过const 指针赋值) |
是 |
否(和左边第二格一样) |
是(由于多了个const) |
是否可以重新指向 |
是 |
是 |
否 |
否 |
是否可以改变指向的内存单元的值 |
是 |
否(*p)就是一个const int,不可改变值,因为指向的是const |
否 |
否 |
是否可以*p++;
|
是 |
是 |
否 |
否
|
是否可以P++;
|
是 |
是 |
否 |
否 |
++在前面也同样。 |
cout << *p; // 报错,一定要先赋值后使用
void *p1; // 可以指向任何类型,其他要指向相同类型
23.3二级指针,二级指针变量存储的是一级指针变量的地址
int *p = &x;
int **pp = &p; // 二级指针指向的只能是一级指针变量的地址,*p是p指向的值,而&p是p的地址,不是x的地址
23.4.0指针数组, int *a[5]; a[4] = &x;数组元素的值是地址
23.4.1指向数组的指针int (*a)[5]; a是二维指针,只能指向一维指针的地址
int b[5];
a = &b; // 指向数组的指针,只能指向数组元素为5的,其他不行。
// *a是b[0]的地址, **a是元素b[0]的值
23.4.2指向二维数组的指针,二维数组的数组名是一个二级指针
int (*a[2])[3]; a[0] 指向长度为3的int型数组的指针变量,就是上面那个的数组版。
int b[2][3] = {{1,2,3},{4,5,6}};
a[0] = b;
cout << **a[0]; // 等于b[0][0];
cout << **(a[0] + 1); // 等于*(a[0]+1)是a[1][0]的地址
23.5new和delete处理
int *b = new int(4);
delete a; // 释放单个
int *c = new int[4];
delete []c; // 释放数组
24-字符,字符串
sizeof() //求内存
strlen() //求到\0有多少个 \0不包括
char a[50] = {'a','b','c','d'}; // 末尾自动补零
char a[] = {'a','b','c','d'}; // 末尾不自动补零,要一起输入才没事
char *a = "abcd"; // 自动补零,可是不可改动,只能整个指针改变指向
‘0’字符
0 结束标志
‘\0’ 结束标志
char *p最好用于比较p代表第一个字符,可以通过加加来移动
函数参数用char a[];
25-结构类型, 变量通过.索引,指针通过->索引
using namespace std;
struct DATE
{
int year;
int month;
int day;
};
struct PERSON
{
int id;
char name[20];
DATE birthday;
};
int main()
{
PERSON person = {10001, "张", {1977, 12, 12}};
PERSON *p_person;
p_person = &person;
cout << person.id << endl;
cout << p_person->name << endl;
return 0;
}
26-枚举类型
enum 名字{标识符,标识符};
(1)枚举类型按常量处理,不能赋值
(2)枚举元素,没有赋值,重0开始,累加
(3)enum weekday{sun = 7, mon = 1, tue, wed, thu, fri, sat}; // tue重2开始
(4)常量可以强制转换为枚举类,就是常量,可以进行运行运算,enum 的对象可以赋值给整型,会自动转换,但整型不可以赋值给enum对象,要强制类型转换。
weekday day;
day = weekday(1);
27-union联合体
28-控制台输入输出
格式函数
|
非格式函数 | ||||
类型 | 输入 | 输出 | 类型 | 输入 | 输出 |
char |
scanf() //遇到空格结束,有两个一起
输入是不结束scanf("%d%d",&a,&b);
sscanf()格式输入
|
printf() | char |
getch()
getche()
getchar()
|
putch()
putchar()
|
int | int | ||||
float | float | ||||
string | string | gets() | puts() |
数据类型 | 格式控制符 | |
整型 |
有符号短整型
无符号短整型
有符号长整型
无符号长整型
无符号十六进制
无符号八进制
|
%d或%I
%u
%ld
%lu
%x
%o
|
实型 |
浮点型
double型
|
%f
%lf
|
字符 |
有符号字符
无符号字符
|
%c
%c
|
字符串 | %s |
控制符
|
说明 |
数字 | 指定字段宽度的位数 |
. | 区分字段宽度与精度的小数点 |
数字 | 指定精度的位数 |
-负号 | 表示在指定宽度内左对齐输出 |
- %-15.9lf // %在最前,整个输出占15个位置,9表示小数点输出9位
- sprintf(str, "%c %d",ch, i); //不用与屏幕输入输出
- gets从键盘接收到\n时就停止接收,并将\n换成\0
- getline等不是键盘或屏幕的操作
- 用lf于float类型会出现错误,
- 注意输出,如果双引号内的类型和外面的类型不同可能会出错.
- 输入的要记得加&,类型不对应也会出错,一直输入为0
29.1-要改变到参数的值,要么用指针,或者引用。要将两个值交换就得如此
29.2-原型声明可以多次,定义只能一次
29.3-默认形参,顺序必须是从右向左的
int add(int x = 1, int y = 5, int z); // 从左开始,错
int add(int x = 1, int y, int z = 6); // 不连续,错
29.4-函数可以返回指针,称为指针函数, int *f(); // 注意不要返回局部变量,因为函数结束,系统会销毁
29.5-函数返回引用 // 返回实际值,占用内存较大时,可以返回引用。返回的也不能是局部变量,
int &fun(int &x) // 传进来的参数,修改后在返回,才是正确的使用方法
{
return x;
}
29.6-内联函数,用于小巧函数,系统编译时,会将内联函数,用整个函数内容替换。
29.7-重载函数:c没有,重载是c++的概念
29.7.0-能够根据函数参数的个数和类型不同确定所要调用的函数
29.7.1-参数个数,或者参数类型,参数顺序不同算重载,而返回值不同,函数体不同都不算重载。
30-预处理命令
程序段
#endif
#ifdef/#ifndef 标识符
程序段1
#else
程序段2
#endif
char a[MAX] = "abcd";
#define sout(s) printf(#s"\n") //不用每次输出文字加双引号,这种
#define sout(s,x) printf(#s"\n",x) // 要加参数 sout(1,2); = printf("1\n", 2);