初识C语言(一)


初识C语言(一)

注:这是更新版,旧版会随着新版的更新而删除,新版更细一点
计算机语言就是人和计算交互的语言,而C语言是一门计算机语言。
计算机语言的发展

机器语言(二进制语言) → 汇编语言 → 高级语言(例如:C/C++/JAVA/python等)

第一个C语言程序

输出hello world

1
2
3
4
5
6
7
#include <stdio.h>//包含一个叫stdio.h的文件
int main()//主程序-程序入口-main函数有且只有一个
{
//printf是打印函数,printf("要打印输出的内容")。
printf("hello world\n");//打印hello world,\n为换行
return 0;//程序正常退出
}

数据类型

char 字符数据类型
short 短整型
int 整型
long 长整型
long long (c99)更长整型
float 单精度浮点数(小数就是浮点数)
double 双精度浮点数

常用的打印类型

%d 打印十进制整型
%c 打印字符
%p 打印地址
%f 打印单精度浮点数
%lf 打印单精度浮点数
%x 打印16进制数字
%s 打印字符串

常量 变量

不变的值,C语言中用常量表示。
变的值,C语言中用变量表示。

变量分类

分为局部变量全局变量
局部变量:定义在代码块{}内部
全局变量:定义在代码块{}之外,全局变量不初始化,默认是0
例:

1
2
3
4
5
6
7
#include <stdio.h>
int n1=1;//全局变量
int main()
{
int n2=2;//局部变量
return 0;
}

  1. C语言语法规定,变量要定义在当前代码块的最前面
  2. 局部变量和全局变量名字尽量不相同
  3. 当局部变量和全局变量的名字相同时,局部变量优先

变量的作用域

作用域就是变量可以使用的范围

局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个工程

变量的生命周期

生命周期就是变量创建到变量销毁的之间的时间段

局部变量:进入作用域生命周期开始,出作用域生命周期结束
全局变量:整个程序的生命周期

常量分类

字面常量,例:
3;
const修饰的常变量,(注:被const修饰的变量虽然有一些常量的属性,但本质还是变量)例:
const int num = 1;
#define 定义的标识符常量,例:
#define MAX 2
枚举常量,例:

1
2
3
4
5
6
enum color
{
RED,//0
YELLOW,//1
BLUE//2
};

字符串

由双引号引起的一串字符称为字符串,例:

1
2
"asdsdfg"
""//空字符串

注:字符串结束标识是一个\0的转义字符,在计算字符串长度时\0是结束标志,不算做字符串内容

1
2
3
4
5
6
7
8
9
10
11
12
13
//strlen计算字符串长度,调用strlen需要包含<string.h>
//strlen计算字符串长度时遇'\0'结束,且'\0'不计入长度
#include <stdio.h>
#include <string.h>
int main()
{
char ljs1[]="abc";
//字符串后自动补'\0'
//"abc" -- 'a' 'b' 'c' '\0'
char ljs2[]={'a','b','c'};
printf("%d\n",strlen(ljs1));//打印结果为3
printf("%d\n",strlen(ljs2));//打印结果为随机值
}

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <string.h>
int main()
{
char liu1[]="abc";
char liu2[]={'a','b','c','\0'};
printf("%d\n",strlen(liu1));//打印结果为3
printf("%d\n",strlen(liu2));//打印结果为3
}

转义字符

这里只列举了常用的

\n 换行
\‘ 单引号字符
\“ 双引号字符
\\ 反斜杠
\b 退格
\t 水平制表
\ddd 三位八进制
\xdd 二位十六进制

注释

  1. 不需要的代码可以删除,也可以选择注释掉
  2. 比较难懂的代码,可以加上注释,方便自己和他人理解代码
1
2
3
4
单行注释:
//
多行注释:
/* 内容 */

注意:C语言不能嵌套注释

数组

一组相同类型元素的集合就是数组
数组定义

1
int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义一个整型数组,最多放10个元素

操作符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
算术运算符
加(+) 减(-) 乘(*) 除(/) 求余或称模运算(%) 自增(++) 自减(--)

关系运算符
大于(>) 小于(<) 等于(==) 大于等于(>=) 小于等于(<=) 不等于(!=)

逻辑运算符
与(&&) 或(||) 非(!)

位操作运算符
位与(&) 位或(|) 位非(~) 位异或(^) 左移(<<) 右移(>>)

赋值运算符
简单赋值(=) 复合算术赋值(+=,-=,*=,/=,%=) 复合位运算赋值(&=,|=,^=,>>=,<<=)

指针运算符
取内容(*) 取地址(&)

求字节数运算符
sizeof

原码 反码 补码

只要是整数,内存中存储的都是二进制的补码
正数
原码 反码 补码相同
负数
原码(直接列出该数的二进制) -> 反码(符号位不变,其他位按位取反) -> 补码(反码+1)

关键字typedef

typedef就是给类型重命名,例:

1
2
typedef unsigned int uint;//将unsigned int重命名为uint
uint a=10;//等同于unsigned int a=10

关键字static

static修饰局部变量
局部变量声明周期变长
static修饰全局变量
改变变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用,出了源文件就无法再使用
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int test()
{
static int a=0;
a++;
printf("%d\n",a);
}
int main()
{
int i=0;
while(i<5)
{
test();
i++;
}
return 0;
}
/*
1
1
1
1
1
*/

int a前加上static后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int test()
{
static int a=0;
a++;
printf("%d\n",a);
}
int main()
{
int i=0;
while(i<5)
{
test();
i++;
}
return 0;
}
/*
1
2
3
4
5
*/

#define定义常量和宏

1
2
3
4
5
6
7
//定义标识符的一般形式为:#define 标识符 常量
#define MAX 1000
//宏定义
//1.定义没有参数的宏一般形式:#define 宏名称 替换文本
#define BUFFER_SIZE (4 * 512)
//2.#define 宏名称( [形参列表] ) 替换文本
#define ADD(x,y) ((x)+(y))

指针

内存:内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
用来存放地址的变量-指针变量

1
2
3
4
5
6
7
8
9
10
11
12
//例:
#include <stdio.h>
int main()
{
int a = 5;
int* p =&a;//&取地址,取a在内存中的地址
printf("%p\n",&a);
printf("%p\n",p);//取a的地址,打印出来结果一样
*p=20;//*解引用操作符
printf("%d\n",a);//打印出a为20
return 0;
}

结构体

结构体:我们自己创造出的类型,里面可以包括整型,字符等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
结构体一般形式为:
struct 结构名
{成员列表};
*/
//例:
#include <stdio.h>
//创建结构体类型
struct student
{
char name[20];
int age;
};
int main()
{
struct student stu1={"张三",19};//利用创建好的结构体类型创建结构体变量并初始化
printf("名字:%s,年龄:%d\n",stu1.name,stu1.age);//打印成员
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//利用指针变量打印成员
#include <stdio.h>
struct student
{
char name[20];
int age;
};
int main()
{
struct student stu1={"张三",19};
struct student* s=&stu1;
//利用s打印学生姓名和年龄
//结构体变量.成员
//结构体指针->成员
printf("名字:%s,年龄:%d\n",(*s).name,(*s).age);
printf("名字:%s,年龄:%d\n",s->name,s->age);
return 0;
}

Author: ljs
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source ljs !
评论
  TOC