操作符
C语言提供丰富的操作符,使用起来比较灵活.
C语言中,0表示假,非0表示真
sizeof是一个单目操作符,不是一个函数 !!!!
算数操作符: + - * / %(取模) ;
除号的两端都是整数时,进行的时整数除法.当有一端是浮点数是进行浮点数除法.
取模运算符两端必须是整数.
移位操作符, 涉及二进制的运算,后面补充.: >> << ( 左移\右移 )
位操作符: & ^ |
赋值操作符: = += -= *= /= ^= &= |= >>= <<=
(本质上是=与其他操作符的结合)
单目操作符:
只有一个操作数的操作符 !(逻辑取反) -(负号) +(正号) &(取地址)
sizeof(是个操作符,计算字节数,单位是字节)
int arr[10];
printf("%d\n", sizeof(arr)); //结果4
printf("%d\n", sizeof(arr[0])); //结果40
printf("%d\n", sizeof(arr)/sizeof(arr[0]));//计算数组的元素个数
~(二进制取反)
--(自减) / ++(自加) :
int a=10;
int b=a++; //b=10,a=11 后置++,先使用,后++;
int c=++a; //c=12,a=12 前置++,先++后使用.
*(见解访问操作符,或者解引用操作符)
(类型):强制转换符
int a = (int)3.14;
关系操作符: < > == <= >=
C语言里的赋值是 =
C语言里的相等是 ==
逻辑操作符: &&(逻辑与,且) ||(逻辑或,或)
条件操作符: exp1 ? exp2 : exp3 (C语言里唯一的三目操作符).
解释:若exp1为真,则exp运算;否则exp2运算.三目运算符是可以嵌套的.
逗号表达式:逗号隔开的一串表达式.
逗号表达式的特点:从左向右计算,整个表达式的结果是最后一个表达式的结果.
下标引用操作符: [ ].
arr[n]=20;//[]是下标引用操作符,n和arr是它的两个操作数
函数调用操作符: ( )
sum=Add(2,3);//()是函数调用操作符,Add 2 3是()的操作数
关键字
C语言提供了丰富的关键字,这些关键字都是语言设置的,用户不能添加或改变.
详情见:C语言中的关键字及常用语句_c语言的常用关键字-CSDN博客
变量的命名:
1.有意义
2.名字必须是字母 数字 下划线组成,不能有特殊字符,同时不能以数字开头.
3.变量名不能是关键字
typedef :类型重命名
typedef unsigned int uint;
typedef struct Node
{
int data;
struct Node* next;
}Node;//typedef重新定义struct Node,此时Node等价于struct Node
为复杂的类型名定义一个简单易用的名称.
static:静态声明
1.static修饰局部变量---->静态变量
局部变量出了作用域,不销毁
本质上,static修饰局部变量的时候,改变了变量的存储位置.(栈区----->静态区)
存储位置的改变影响变量的生命周期,静态变量和程序的生命周期一样长.
2.static修饰全局变量--->仍然存放在静态区
- 全局变量具有外部链接属性
其他源文件(.c)就可以使用
- static修饰的全局变量时,这个全局变量的外部链接属性就变为内部链接属性.
其他源文件(.c)就不能使用
3.static修饰函数
- 函数具有外部链接属性的,在源文件(.c)中使用extern声明就可以使用
- static修饰的函数,本来的外部链接属性变为内部连接属性;既是被extern声明也无法被其他文件使用
register 寄存器关键字
define:定义常量和宏
define不是关键字!!!!
define是预处理指令!!!
1.define定义标识符常量
#define NUM 100
2.define定义宏
宏:宏是有参数的
#define ADD(x,y) ((x)+(y))
// 宏名 宏的参数 宏体
宏含有三部分:宏名 宏的参数 宏体,宏的参数是无类型的.
栈区----->局部变量
堆区----->动态内存管理:malloc/free calloc realloc
静态区-->存放静态变量 全局变量
.h 头文件(函数声明、类型声明、头文件的包含)
.c 源文件(函数实现)
浮点数的四舍五入,不能用肉眼看的数值来计算!!!
以为浮点数在内存中有可能不能精确保存
指针
内存会划分为一个个的内存单元,每个内存单元都有一个编号.
一个内存单元是一个字节(1Byte=8bit)
32位电脑--->32根地址线(4GB的内存大小)
int main()
{
int a = 10;//向内存申请4个字节,存储10
//&a; //取地址操作
printf("%p\n",&a);//000000F2041EFA04
int* p = &a;//p存放a的地址
//p就是指针变量
return 0;
}
内存单元有编号--->即地址--->地址也被称为指针
存放指针(地址)的变量称为指针变量.
区分:指针和指针变量
int * p = &a;
int 说明p指向的对象是int类型的
* 说明p是指针变量
&a 才是指针(地址)
只要是存放在指针变量中的数据就可认为是指针(地址)
*p 解引用操作符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象
&a 取地址取的是存放变量的第一个地址(若a是int型{4个字节}的,那么取a的地址就是取a的第一个字节)
指针变量的大小
- 不管是什么类型的指针,都是在创建指针变量。
- 指针变量是用来存放地址(指针)的。
- 指针变量的大小取决于一个地址存放时需要多大的空间。
- 32位机器的上的地址:32bit位 - 4byte,所以指针变量的大小是4个字节。
- 64位机器的上的地址:64bit位 - 64byte,所以指针变量的大小是8个字节。
书写习惯:一*只能定义一个指针变量;最好是把它们写一块
int *p1, *p2 , p3; //p1,p2是指针变量;p3是int型变量
结构体
C语言提供了一些自定义的类型,结构体是其中一种。
结构体是把一些单一类型组合在一起的做法。
人为定义的类型定义的叫对象(含有多种变量)。
结构体定义的是类型,没有开辟空间;只有在创建对象,才能开辟空间占用内存。
结构体成员的两种使用方式:
- 结构体对象.成员名
- 结构体指针->成员名