函数初识
Add(int x, int y)
{
int sum = 0;
sum = x + y;
return sum;
}
int main()
{
int a = 0;
int b = 0;
int s = 0;
scanf("%d,%d", &a, &b);
s = Add(a, b);
printf("%d", s);
return 0;
}
数组
int arr[5] = { 1,2,3,4,5 };
int arr1[10] = { 1,2,3,4,5 };//不完全初始化,其他元素默认为0
创建数组时不能为变量
数组的调用
下标访问
int main()
{
int arr[5] = { 1,2,3,4,5 };
int arr1[10] = { 1,2,3,4,5 };//不完全初始化,其他元素默认为0
int b = 0;
while (b <= 9)
{
printf("%d\n", arr1[b]);
b++;
}
return 0;
}/*字符串数组
int main()
{
int arr[5] = { 1,2,3,4,5 };
int arr1[10] = { 1,2,3,4,5 };//不完全初始化,其他元素默认为0
char strs[4][6] = { "hello", "world", "c", "java" };
int b = 0;while (b <= 3)
{
printf("%s\n", strs[b]);
b++;
}
return 0;}
*/
操作符
算数操作符
+ - *
/ (除数 被除数都是整数 结果会是整数 有一个是小数结果才会是小数)
%(取余)两端必须是整数
移位操作符
<<左移操作符(移动的是二进制位)
>>
int main()
{
int a = 2;
int b = a << 2;
printf("%d", b);//8
return 0;
}//00000000000000000000000000000010
//00000000000000000000000000001000
位操作符
&按位与
|按位或
^按位异或
赋值操作符
=:赋值
+=:a += 3 ----a=a+3 -=:a -= 3 ----a=a-3 以下同理
*= /= &= ^= \= %= >>= <<=
单目操作符-只有一个操作数
双目操作符(例如+: a+b有两个操作数)
! //逻辑反操作 0表示假,非零表示真 if(!a)如果a为假
- //负值
+ //正值
& //取地址
sizeof //求操作数的类型长度(以字节为单位)
int main()
{
int a = 9;
printf("%d", sizeof a);//4 不报错说明size of 不用加括号 不是函数
return 0;
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
printf("%d\n", sizeof(arr));//数组的大小是数组内元素的总和 4*5=20
printf("%d", sizeof(arr) / sizeof(arr[0]));//c语言计算数组元素个数方式 5
return 0;}
~ //对一个数的二进制按位取反----把所有二进制位数字1变成0,0变成1 符号位也变
-- //前置、后置减减
++ //前置、后置加加
前置++ 先++ 再使用 b=++a 先++即a=a+1 ,再赋值给b 得a=11,b=11 --同理
后置++ 先使用 再++ b=a++ 先把a的值赋给b,即b=a ,然后再++即a=a+1 得b=10 a=11
* //间接访问操作符(解引用操作 符)
(强制类型转换) //强制类型转换
关系操作符
> >== < != ==
!=操作符用于测试“不相等”,而==操作符用于测试“相等”
逻辑操作符
&&(逻辑与)
||(逻辑或)
条件操作符(三目操作符)
表达式1?表达式2:表达式3
1成立 整个表达式的结果是2
1不成立 整个表达式的结果是3
逗号表达式
逗号隔开的一串表达式
从左到右依次计算
整个表达式的结果是最后一个表达式的结果
int main()
{
int a = (1 + 5, 69 + 4, 8 + 2);
printf("%d", a); 为10
return 0;
}
下标引用、函数调用:[ ],( )
变量的命名必须是数字、字母、下划线组成
不能有特殊字符、同时不能有数字开头
常见关键字
1.c语言提供的,不能自己创建关键字
2.不能做变量名字
auto 是自动的 每一个局部变量都是auto修饰的
int a = 0;//等价于auto int a,auto一般省略了
signed有符号的 unsign无符号的
void 无/空 不需要任何返回
difine include不是关键字 是预处理指令
typedef 类型重定义
typedef unsigned int u_int; //把 unsigned int 重命名位 u_int
int main()
{
unsigned int a = 0;
u_int b = 0; //两个的创建方式是一样的
return 0;
}
static 静态的
1.static修饰局部变量
出局部范围不销毁,并不会重新创建,如下例子a不会重新创建等于0,而保持a++后的值
本质上改变变量的存储类型
void test()//void的意思就是无,它修饰的函数没有返回值
{
static int w = 0;//static修饰的局部变量出范围不会被销毁
w++;
printf("%d", w);
}
int main()
{
int n = 0;
while (n < 5)
{
test();
n++;
}
return 0;
}
----内存组成
2.static修饰全局变量
全局变量在整个工程中都可以使用
static修饰全局变量,使得这个全局变量只能在自己所在的源文件中使用
全局变量,在其他源文件中可以使用,是因为全局变量有外部链接属性
但是被static修饰之后,就变成了内部链接属性
3.static修饰函数
static修饰函数,使得函数只能在自己所在的源文件内部,不能在其他源文件中使用
本质:将函数外部链接属性变为内部链接属性
register寄存器关键字
计算器数据存储到哪里
寄存器(集成到cpu上) 速度快 存储量小
高速缓存 速度中 中
硬盘 速度慢 大
register int b = 0;//建议b的值存储在寄存器中
cpu计算 从内存中拿
cpu越来越快 内存传输跟不上
cpu先去寄存器,再高速缓存,再硬盘
大量使用的数据,推荐放到寄存器中
define常量和宏
define定义常量
#define shi 5
#define 常量名 常量值
define定义宏-有参数
#define Add(x,y) ((x)+(y))
int main()
{
printf("%d", 3 * Add(5, 4));
return 0;
}
指针(初识)
内存
内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行
每个内存单元是1字节
32位机器 32根地址线 通电 1/0 2的32次方种序列 都可以作为内存的编号
当这个二进制序列成为内存编号时,我们把其成为内存单元地址
例:int a = 0;
a占4个字节 四个内存空间
转化为16进制00 00 00 0a ,两个数是一个字节
int main()
{
int a = 0;
printf("%p\n", &a);//百分号p专门用来打印地址
int * p = &a;//p是用来存放地址的,c语言中叫做指针变量 *说明p是指针变量 int说明p执行的对象是int类型
*p = 20; //解引用操作,通过p里的地址找到所指的对象 ,*p就是p指向的对象,改变地址里的对象
printf("%d\n", a);
return 0;
}
char ch = 'w';
char * pc =&ch;char说明pc执行的对象是char类型
地址也被称为指针,存放指针的变化称为指针变量
指针变量大小:指针需要多大空间,取决于地址的存储需要多大空间
32位平台 32bit 4字节
64位平台 64bit 8字节
初识结构体
结构体可以让c语言创建新的类型出来
结构体创建,初始化和调用
struct Book//结构体
{
char name[10];//字符数组
float price; //成员变量
int page;
};void print(struct Book* bk)
{
printf("%s %lf %d\n", (*bk).name, (*bk).price, (*bk).page);//解引用printf("%s %lf %d\n", bk->name, bk->price, bk->page);//指针
}int main()
{
struct Book book = { "c语言",56.23,56565 };//结构体创建与初始化printf("%s %lf %d\n", book.name, book.price, book.page);//结构体.成员变量 成员变量的调用
print(&book); //函数
return 0;
}
->箭头操作符
结构体指针->成员变量名