[C]C语言速成

第一个c语言程序

标准的C语言程序格式:
include 引用头文件
printf是stdio中的一个库函数,使用时需要包含头文件来使用(
std - 标准 、i-input、o-output)

为什么是return 0?
一个约定,默认程序成功运行为0;程序异常终止返回非零。

什么是main?
约定main是一个程序的入口 ,一个程序只能有一个main函数

#include "stdio.h"

int main(){
    printf("hello world\n");
    return 0;
}

数据类型

类型用来创建变量,创建变量的本质是向内存申请空间

char //字符数据类型  sizeof(char) 1
short //短整型 2
int //整型 4
long //长整型 4
long long //更长的整型 8
float //单精度浮点数 4
double //双精度浮点数 8

计算机中的单位:
bit - 比特位 (存储二进制中一个0或者1的位置叫比特位)
byte - 字节 (8bit = 1 byte)
kb (1024 byte = 1 kb)
mb
gb
tb

变量和常量

变量:变的值
常量:不变的值

变量1.局部变量 2.全局变量
局部变量:{}内部定义的变量
全局变量:{}外部定义的变量

变量不能重复定义,全局变量和局部变量名字冲突时局部变量优先
以输入输出计算两数之和为例:

#include "stdio.h"
int num1 = 3;
int main(){
    int num1 = 0;
    int num2 = 0;//初始化
    scanf("%d %d",&num1,&num2);
    int sum = num1 + num2;
    printf("%d\n",sum);
}

作用域和生命周期:
作用域:
1.局部变量:{}内 局部变量优先
2.全局变量:所有地方
生命周期:进入作用域生命周期开始,出作用域生命周期结束(全局变量生命周期一直存在直到程序运行结束)

常量
1.字面常量

#include "stdio.h"

int main(){
    30;//字面常量
}

2.const修饰的常变量
既不可修改,又有变量的属性(例如如下将n给与一个数组,程序会报错,因为数组的大小不能为一个变量)

#include "stdio.h"

int main(){
    const int n = 30;//常变量
    int arr[n] = {0};
    return 0;
}

在这里插入图片描述
3.#define定义的标识符常量

#include "stdio.h"
#define N 10
int main(){
    int n = 0;//常变量
    n = N;
    printf("%d\n",n);
    int arr[N] = {10};
    return 0;
}

4.枚举常量

#include "stdio.h"
enum Color{
    Red,
    Green,
    Blue
};
int main(){
    enum Color c = Red;
    return 0;
}

字符串
c语言中只有字符类型char没有字符串类型,要实现字符串需要用一个字符串数组将字符串存到数组中

'h'//字符
"hello bit \n"//字符串

我们可以看到abcdef字符串,我们调试一下发现字符串后边加了一个 ‘\0’,它是一个字符串结束的标志

#include "stdio.h"
#include "string.h"
int main(){
    char arr1[] = "abcdef";
    char arr2[] = {'a','b','c','d'};
    int len = strlen(arr1);
    printf("%d\n",len);
    printf("%s\n",arr1);
    printf("%s\n",arr2);
    return 0;
}

在这里插入图片描述
可以看到\0不算在字符串内,字符串长度仍然为6
在这里插入图片描述
转义字符
一般形式为 ’ \ '+系统规定的字符,将原本没有意义的n字符转变为具有一定功能的字符。
常见的转义字符
选择语句

#include "stdio.h"

int main(){
    int input = 1;
    printf("join bit \n");
    printf("good study?");
    scanf("%d",&input);
    if (input == 1){
        printf("offer !");
    } else{
        printf(" 卖红薯\n");
    }
    return 0;
}

循环
1.while循环
2.for
3.do…while

#include "stdio.h"

int main(){
    int line = 0;
    while (line <= 20000){
        printf("写代码: %d\n",line);
        line++;
    }
    if(line >= 20000){
        printf("offer !");
    }
    return 0;
}

函数

#include "stdio.h"

int Add(int a,int b){
    int z = 0;
    z = a + b;
    return z;
}
int main(){
    int num1 = 0;
    int num2 = 0;
    scanf("%d %d",&num1,&num2);
    int sum = Add(num1,num2);
    printf("%d\n",sum);
    return 0;
}

数组

#include "stdio.h"

int main(){
    int arr[10] = {1,2,34,5,6,8,0,9,10};//下标从0开始
    printf("%d\n",arr[2]);
    int i = 0;
    while ( i < 10){
        printf("%d\t",arr[i]);
        i++;
    }
    return 0;
}

运算符

+    -    *    /    %(取模:取模操作符的两端只能是整数,不能是其他数字)
>> << 移位操作符
& ^ | 位操作符
= += *= -= /= &= ^= |= >>=  <<+赋值操作符 

单目操作符

! 逻辑反
- 负值
+ 正值
& 取地址
sizeof 操作数类型的长度
~ 按位取反
-- 自减(后:先使用 后减减   前:先减减,再使用)
++ 自增
* 解引用操作符
(int) 强制类型转换

关系操作符

>
>=
<=
!=
==

逻辑操作符

&& 并且
|| 或者

条件操作符(三目操作符)

exp1? exp2 : exp3

逗号表达式
逗号表达式就是逗号隔开的的一串表达式
逗号表达式的特点是:从左向右依次计算,整个表达式的结果是最后一个表达式的结果

#include "stdio.h"

int main(){
    int a = 10;
    int b = 2;
    int c = 3;
    int d = (c = a-2,a = b + c, c-3);
    printf("%d\n",d);
    return 0;
}

下标引用操作符

[]

函数调用操作符

()

常见关键字

auto  break   case  char  const   continue  default  do   double else  enum   
extern float  for   goto  if   int   long  register    return   short  signed 
sizeof static struct  switch  typedef union  unsigned   void  volatile  while

变量命名
1.有意义 2. 必须为字母、数字、下划线组成;不能为数字开头 3.变量名不能是关键字

Typedef和Struct关键字
typedef 类型重命名关键字 以下代码中将unsigned int 定义为 int ,所以num 和 num2是 同一数据类型。 可以把复杂类型简化,struct Node = node

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef unsigned int unit;

typedef struct Node
{
	int data;
	struct Node* next;
}node;
int mian() {
	unsigned int num = 0;
	unit num2 = 0;
	struct Node n;
	node n2;
	return 0;
}

static关键字
可以用来修饰局部变量 全局变量 函数
1.修饰局部变量
a变量未加static时,test函数每次在循环时候都会重新创建a,并且执行结束后销毁,加了static后a不会被销毁。修饰局部变量时候局部变量出了作用域不销毁。本质上static修饰局部变量时候改变了变量的存储位置,存储位置分为栈区(存储局部变量 -出作用域后销毁)、堆区()、静态区(静态变量 -出作用域后不销毁)。影响了变量的生命周期,使变量的生命周期边长

#include "stdio.h"

void test(){
    int a = 1;
    a++;
    printf("%d\n",a);
}
int main(){
    int i = 0;
    while (i < 10){
        test();
        i++;
    }
    return 0;

}

在这里插入图片描述
2.修饰全局变量
全局变量具有外部链接属性,static修饰全局变量的时候,全局变量的外部链接属性就变成了内部链接属性,其他源文件.c就不能再使用这个全局变量了。
3.修饰函数
函数具有外部链接属性,被static修饰后无法使用其他.c文件中的函数。
register关键字

#include "stdio.h"

int main(){
    register int num = 3;
    
    return 0;
}

在这里插入图片描述
#define定义常量和宏
ADD宏名,xy为宏餐宿,参数无类型

#include "stdio.h"
#define num 10  //定义常量

#define ADD(x,y) ((x)+(y)) //定义宏

int main(){
    int a = 10;
    int b = 20;
    int c = ADD(a,b);
    printf("%d\n",c);
    return 0;
}

指针
1.内存:内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的
内存会划分为一个个的内存单元(一个内存单元的大小:1byte),每个内存单元都有一个编号。
内存单元:编号–>地址–>地址也被称为指针,存放地址的变量就是指针变量
在这里插入图片描述
指针变量本质指向内存地址

#include "stdio.h"

int main()
{
    int a = 10;
    &a;
    int *p = &a;
    a = 20;
    *p = 114514;
    printf("p的地址:%p\n",&p);
    printf("%d\n",p);
    printf("%d\n",a);
    printf("a的地址:%p\n",&a);
    return 0;
}

在这里插入图片描述
指针变量的大小:指针变量的大小取决于一个地址存放的时候需要多大的空间
32位机器上的地址:32bit位 - 4byte,指针变量的大小为4字节
64位机器上的地址:64bit位 - 8byte,指针变量的大小为8字节

#include "stdio.h"

int main(){
    printf("%d\n",sizeof (char*));
    printf("%d\n",sizeof (short*));
    printf("%d\n",sizeof (int*));
    printf("%d\n",sizeof (float*));
    printf("%d\n",sizeof (double*));
    return 0;
}

结构体

#include "stdio.h"
struct Stu{
    char name[20];
    int age;
    char sex[10];
    char tele[12];
};
void print(struct Stu* ps){
    printf("学生:");
    printf("%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).tele);//*ps相对于结构体本身
    printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->tele);
}
int main(){
    struct Stu s = {"tom",20,"nan","1234567890123"};//初始化
    printf("%s %d %s %s\n",s.name,s.age,s.sex,s.tele);//结构体对象.成员名
    print(&s);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值