个人博客网址:https://ljsblog.com
初识C语言(一)
计算机语言就是人和计算交互的语言,而C语言是一门计算机语言。
计算机语言的发展:
机器语言(二进制语言) → 汇编语言 → 高级语言(例如:C/C++/JAVA/python等)
第一个C语言程序
输出hello world
#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
例:
#include <stdio.h>
int n1=1;//全局变量
int main()
{
int n2=2;//局部变量
return 0;
}
注:
- C语言语法规定,变量要定义在当前代码块的最前面
- 局部变量和全局变量名字尽量不相同
- 当局部变量和全局变量的名字相同时,局部变量优先
变量的作用域
作用域就是变量可以使用的范围
局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个工程
变量的生命周期
生命周期就是变量创建到变量销毁的之间的时间段
局部变量:进入作用域生命周期开始,出作用域生命周期结束
全局变量:整个程序的生命周期
常量分类
字面常量,例:
3;
const修饰的常变量,(注:被const修饰的变量虽然有一些常量的属性,但本质还是变量)例:
const int num = 1;
#define 定义的标识符常量,例:
#define MAX 2
枚举常量,例:
enum color
{
RED,//0
YELLOW,//1
BLUE//2
};
字符串
由双引号引起的一串字符称为字符串,例:
"asdsdfg"
""//空字符串
注:字符串结束标识是一个\0的转义字符,在计算字符串长度时\0是结束标志,不算做字符串内容
//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));//打印结果为随机值
}
改
#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 二位十六进制
注释
- 不需要的代码可以删除,也可以选择注释掉
- 比较难懂的代码,可以加上注释,方便自己和他人理解代码
单行注释:
//
多行注释:
/* 内容 */
注意:C语言不能嵌套注释
数组
一组相同类型元素的集合就是数组
数组定义:
int arr[10]={1,2,3,4,5,6,7,8,9,10};//定义一个整型数组,最多放10个元素
操作符
算术运算符
加(+) 减(-) 乘(*) 除(/) 求余或称模运算(%) 自增(++) 自减(--)
关系运算符
大于(>) 小于(<) 等于(==) 大于等于(>=) 小于等于(<=) 不等于(!=)
逻辑运算符
与(&&) 或(||) 非(!)
位操作运算符
位与(&) 位或(|) 位非(~) 位异或(^) 左移(<<) 右移(>>)
赋值运算符
简单赋值(=) 复合算术赋值(+=,-=,*=,/=,%=) 复合位运算赋值(&=,|=,^=,>>=,<<=)
指针运算符
取内容(*) 取地址(&)
求字节数运算符
sizeof
原码 反码 补码
只要是整数,内存中存储的都是二进制的补码
正数:
原码 反码 补码相同
负数:
原码(直接列出该数的二进制) -> 反码(符号位不变,其他位按位取反) -> 补码(反码+1)
关键字typedef
typedef就是给类型重命名,例:
typedef unsigned int uint;//将unsigned int重命名为uint
uint a=10;//等同于unsigned int a=10
关键字static
static修饰局部变量:
局部变量声明周期变长
static修饰全局变量:
改变变量的作用域,让静态的全局变量只能在自己所在的源文件内部使用,出了源文件就无法再使用
例:
#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后
#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定义常量和宏
//定义标识符的一般形式为:#define 标识符 常量
#define MAX 1000
//宏定义
//1.定义没有参数的宏一般形式:#define 宏名称 替换文本
#define BUFFER_SIZE (4 * 512)
//2.#define 宏名称( [形参列表] ) 替换文本
#define ADD(x,y) ((x)+(y))
指针
内存:内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
用来存放地址的变量-指针变量
//例:
#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;
}
结构体
结构体:我们自己创造出的类型,里面可以包括整型,字符等
/*
结构体一般形式为:
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;
}
//利用指针变量打印成员
#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;
}