这一节还继续进行C语言的大致认识,接着上节博客复习了转义字符、函数、

sizeof的运用,新知识:

(我想告诉你... 本篇博客为不想躺平博主用来帮助自己理解C的知识,适用于基础小白,不是全部的代码,大部分是伪代码,希望对你有帮助......)

1.~操作符

2.前置操作++a符和后置操作符a++

3.关系操作符

4.逻辑操作符

5.(条件)三目操作符

6.下标引用操作符

7.关键字,重点讲了static修饰局部变量和全局变量

8.define进行宏定义变量

9.指针的逻辑解释及小小例子


//继续操作符的认识

#include<stdio.h>

//1----转义字符

int main()

{

// 字符串的结束标志:'\0'

// "abcdef";

// '\0'-转义字符-0 遇到\0才表示读取完成,\0不算一个字符

// 0-->数字0

// '0'-->ASCII 48;

// 'a''b''c''0''1''2'

//EOF--end of file

return 0;

}


//2----函数问题(接昨天学习的函数进行讲解,这里给出了一个例子)

//用函数表示两个数的大小

 int Max(int x,int y)//Max的类型是int类型

{

 if(x>y)

  printf("max=%d\n",x);

 else

  printf("max=%d\n",y);

}

int main()

{

int num1=10;

int num2=20;

int max=0;

max = Max(num1,num2);

//printf("max=%d\n",max);

// if(num1>num2)

 // printf("较大值是:%d\n,num1");

// else

 // printf("较大值是:%d\n,num2");

return 0;

}



//3----sizeof计算数组大小

int main()

{

int a= 10;

int arr[]={1,2,3,4,5,6};//6*4=24个字节的空间

printf("%d\n",sizeof(a));//4 bytes

printf("%d\n",sizeof(int));//4 bytes

//a的括号可以去掉,但是int的括号不可以去掉,说明sizeof不是一个字符

printf("%d\n",sizeof a);//4 bytes

printf("%d\n",sizeof (arr));//计算数组大小,单位是字节//24

printf("%d\n",sizeof(arr)/sizeof(arr[0]));//6

return 0;

}



//4---- ~操作符的解释

int main()

{

int a= 0; //32bits

int b=~a;//b是有符号的整形

//~-->按(2进制)位取反

//0000000000000000000000000000000

//1111111111111111111111111111111

//原码 反码 补码

//负数在内存中存储的是二进制的补码

printf("%d\n",b);//-1//使用的,打印的是这个数的原码

//1111111111111111111111111111111

//1111111111111111111111111111110

//1000000000000000000000000000001 //-1

return 0;

}


//5---- 前置++,后置++,前置--,后置--

int main()

{

int a=10;

int b=a++; //后置++ 先把a的值赋给b,a再++ --> b=10,a=11

printf("a=%d b=%d\n",a,b);//a=11,b=10

return 0;

}


int main()

{

int a=10;

int b=++a; //前置++ 先a++,再赋给b --> a=11,b=11

printf("a=%d b=%d\n",a,b);//a=11,b=11

return 0;

}


int main()

{

int a=10;

int b=a--; //后置-- 先把a的值赋给b,a再-- --> b=10,a=9

printf("a=%d b=%d\n",a,b);//a=9,b=10

return 0;

}


int main()

{

int a=10;

int b=--a; //前置-- 先a--,再赋给b --> b=9,a=9

printf("a=%d b=%d\n",a,b);//a=9,b=9

return 0;

}


//6----(类型)--->强制转换类型

//不建议转换


int main()

{

int a=(int)3.14;//double-->int

return 0;

}


//7----其他操作符

//关系操作符

//> >= < <= != ==

//逻辑操作符

//&&

int main()

{

//真假  

//1  0

//&&--逻辑与

//||--逻辑或

int a = 3;

int b = 5;

//int c = a&&b;

int c = a||b;

printf("c=%d\n",c);

return 0;

}


//条件操作符

//exp1?exp2:exp3;

//三目操作符

int Max(int x,int y)

{

 if(x>y)

  printf("max=%d",x);

 else

  printf("max=%d",y);

}

int main()

{

int a = 10;

int b = 20;

int max = 0;

max(a>b?a:b);

// if(a>b)

 // max=a;

// else

 // max=b;

int max = Max(x,y);

printf("max=%d\n",max);

return 0;

}

//8----下标引用操作符 函数调用操作符

//& * . ->

int Add(int x,int y)

{

int =0;

z=x+y;

return z;

}


int main()

{

int arr[10] = {0};

arr[4]; //[]下标引用操作符

int a = 10;

int b = 20;

int sum = Add(a,b);//()函数调用操作符

return 0;

}


//9----常见关键字

//auto break case char const continue default do double extern

//float else enum for goto if long register return short signed

//sizeof static struct switch typedf union unsigned void volatile while


int main()

{

auto int a = 10;//局部变量 自动变量 auto一般省略

register int a = 10;//建议把a定义成寄存器变量,我们的寄存器是有限的

int a = 10;

a = -2;//int 定义的变量是有符号的

//signed int ;

unsigned int num = 0;

struct //--结构体关键字

//union 联合体

return 0;

}


//typedef//类型定义//类型重定义

int main()

{

typedef unsigned int u-int;//u-int 就是unsigned int的别名

unsigned int num = 20;

u-int num2 = 20;

return 0;

}


//static修饰局部变量

//局部变量的生命周期变长

//static修饰全局变量

//全局变量的作用域变化

void test()

{

static int a=1;//静态局部变量,a不销毁了,输出来的就是2 3 4 5 6

//如果是int a =1;则输出的结果是2 2 2 2 2

a++;

printf("a=%d\n",a);//2 3 4 5 6

}

int main()

{

int i=0;

while(i<5)

{

 test();

 i++;

return 0;

}


int main()

{

// static int g_val=2020 static修饰全局变量,改变了变量的作用域,

//让静态的全局变量只能在原文件内部使用,出了源文件就无法使用了

//extern --声明外部函数符号


extern int g_val;

printf("g_val=%d\n",g_val);


return 0;

}


//static修饰函数

//声明外部函数

//static修饰函数改变了函数的连接属性

static int Add(int a,int b)//修饰过之后就找不到了

{

 int z=x-y;

 return z;

}//外部


extern int Add(int a,int b)

int main()

{


int a =10;

int b =20;

int sum =Add(a,b);

printf("sum=%d\n",sum);

return 0;

}


//10----define定义常量和宏


#define<stdio.h>

//#define定义标识符常量

#define MAX 100 //MAX值是100

//#define 可以定义宏/带参数


//1.函数

int Max(int x,int y)

{

if(x>y)

 return x;

else

 return y;

}


//2.宏的定义

#define MAX(X,Y) (X>Y?X:Y)

int main()

{

int a = MAX

int a=10;

int b=20;

//1.函数方式

int max=Max(a,b)

printf("max=%d\n",max);

//2.宏的方式(看起来比函数更简洁一点)

max=MAX(a,b);

printf("max=%d\n",max);

return 0;

}


//11----指针

/*

生活中我们通过地址-->找到空间(房间)602编号的房间

1.如何产生地址,如何来编址?

2.一个内存为多大的单元?

解释:

32位的电脑-->32根地址线/数据线(通电之后有正电1和负电0之分)

产生电信号:(2^32种可能性)可以作为内存编号,就可以产生2^32个编号

00000000000000000000000000000000

00000000000000000000000000000001

...

11111111111111111111111111111111

这些编号就叫做内存块的地址


计算机的单位:

bit

byte

kb

mb

gb  

tb  

pb

...


2^32bits=0.5GB(不够用!!!)

--> 一个内存上放1个字节,即1byte

*/


int main()

{

int a = 10;//向内存申请4个字节空间

//&a 取出a的地址

int* p = &a;

//有一种变量是用来存放地址的-->p 即指针变量

//int*是p的地址

//p里头存了a的地址,以后方便直接找到a的地址

printf("%p\n",&a);//打印地址,用%p

printf("%p\n",p);//&a与p的地址相同

//*p;  //*解引用操作符 对p进行操作,找到它所指的对象a

*p=20;//把a内存里面的值改成了20

printf("a=%d\n",a);//a=20

return 0;

}


int main()

{

char ch = 'w';

char* pc = &ch;

*pc = 'a';

printf("%c\n",ch);

return 0;

}


//指针在32位是4个字节,在64位电脑上是8个字节


int main()

{

char ch = 'w';

char* pc = &ch;//指针名字叫pc,类型是char,char*的地址

printf("%d\n",sizeof(pc));

return 0;

}