●🧑个人主页:你帅你先说.
●📃如果文章有帮助,欢迎点赞👍关注💡收藏💖
●📖既选择了远方,便只顾风雨兼程。
●🤟欢迎大家有问题随时私信我!
●🧐版权:本文由[你帅你先说.]原创,CSDN首发,侵权必究。
目录
1.操作符
1.1算术操作符
1.2移位操作符
1.3位操作符
int a=3 b=5;
c=a&b;
a的二进制 00000000000000000000000000000011
b的二进制 00000000000000000000000000000101
结果为 00000000000000000000000000000001
即只要有0即为0
|(按位或)
a的二进制 00000000000000000000000000000011
b的二进制 00000000000000000000000000000101
结果为 00000000000000000000000000000111
即只要有1即为1
^(按位异或)
a的二进制 00000000000000000000000000000011
b的二进制 00000000000000000000000000000101
结果为 00000000000000000000000000000110
相同为0,相异为1
1.4赋值操作符
float a=0;
a=95.5;//直接写出来的浮点数默认是double类型
a=95.5f//指定为float类型
1.5单目操作符
以 3+5 为例
3和5是操作数,3是左操作数,5是右操作数,+是双目操作符。
故单目操作符就是只有一个操作数的操作符
!(逻辑反操作)
C语言是如何表示真假的?
0位假,非0为真,C语言规定真所对应的值为1。所以 0为假 !0 为真。
这边特别强调大家容易误解的,sizeof是操作符不是函数!
~(按位取反)
00000000000000000000000000001111
11111111111111111111111111111110000
即0和1互换
1.6关系操作符
1.7逻辑操作符
1.8条件操作符(三目操作符)
2.逗号表达式
int a=3,b=5,c=6;
int d=(a=a-2,b=a+c,c=a-b);//逗号表达式的结果即为c=a-b的结果
printf("%d",d);//输出结果为-6
3.常见关键字
![](https://i-blog.csdnimg.cn/blog_migrate/e224811292aa55265c20839e35aa5470.png)
在这边先简单介绍几个,后续的文章会详细介绍
auto-定义局部变量的,一般省略
break-跳出循环
case-在switch语句中会详细介绍
typedef-类型重命名
extern-声明外部变量
在这边提一下大家容易误解的地方,define不是关键字,像#include、#define这种的都属于预处理指令。
3.1关键字static
4.define定义常量和宏
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("%d",MAX);//打印结果是1000,在这个程序中所有的MAX都会替换成1000
printf("sum = %d\n", sum);//打印结果为5
return 0;
}
在宏里面是怎么实现这个算法的?
经过预编译后
int sum = ADD(2, 3)已经被替换成int sum=((a)+(b))
然后就进行计算了。
这边先简单介绍一点皮毛,后续会再进行更深入的介绍。
5.指针
要学习指针,首先要了解内存的概念。
以32位系统、int类型为4字节即32个比特位为例。
在计算机中:
32位-32根地址线
地址线-1/0 要么是0要么是1
那一共多少种可能?
00000000000000000000000000000000
00000000000000000000000000000001
............
111111111111111111111111111111111111
一共种可能
转换成10进制就是4294967296
除1024算出来是4,194,304Kb
除1024算出来是4096Mb
再除1024算出来是4GB,所以32位的电脑能做到4GB算是比较好的了。
以int类型变量为例
进行取地址操作时取出的是4个字节中第一个字节的地址,打印出的是完整地址。
5.1常见的格式符输出
%s-字符串
%c-字符
%d-有符号的整型
%f-单精度浮点数
%lf双精度浮点数
%p-地址的16进制表示形式
int a=10;
int * pa=&a;//变量名是pa,类型是int*
5.2*----解引用操作符(通过地址找到对象 )
int*中的*说明pa是个指针变量,int类型说明pa所指向的对象是int类型。
总而言之,指针变量是一种变量,这个变量是用来存放地址的。
5.3指针变量的大小
指针变量是用来存放地址的,地址的大小是4/8字节。
所以32位系统:指针大小是4个字节
64位系统:指针大小是8个字节
6.结构体
6.1结构体的定义和初始化
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 20};//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
6.2结构体的声明
struct Stu //结构体类型声明,struct是结构体关键字
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
}b1,b2;//b1、b2是全局变量
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
//这些都是结构体成员,可以是标量、数组、指针,甚至是其他结构体。
}Stu;
这种写法是类型重定义,struct Stu是一个新的类型,可以简写成Stu。
6.3结构体成员的访问
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
struct S
{
int a;
char c;
double d;
};
struct T
{
struct S s;
char name[20];
int num;
};
int main()
{
struct T t = { {100, 'w', 3.14}, "zhangsan", 200 };
printf("%d %c %f %s %d\n", t.s.a, t.s.c, t.s.d, t.name, t.num);
struct T* pt = &t;
printf("%d %c %f %s %d\n", pt->s.a, pt->s.c, pt->s.d, pt->name, pt->num);
return 0;
}
6.4结构体传参
struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
在这边传值调用和传址调用哪种更好呢?
答案是传址调用。
原因是:
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
本人水平有限,请大家批评指正!喜欢我就点个关注吧!