文章目录
- 一、C语言是什么?
- 二、C语言简单介绍
- 1.第一个C语言程序
- 2.基本数据类型
- 3.输入输出函数
- 4.变量
- 5.字符串和字符
- 6.判断语句
- 7.循环语句
- 8.数组
- 9.函数
- 10.指针
- 11.结构体
一、C语言是什么?
C 语言是一种通用的、面向过程式的计算机程序设计语言。C语言是接近底层的,C语言能做嵌入式开发和操作系统等等。
二、C语言基本数据类型
1.第一个C语言程序
代码如下(示例):?
#include <stdio.h> //引入头文件
int main(){ //主函数
printf("第一个C语言程序!\n"); //输出函数
return 0; //结束代码运行,返回一个0
}
2.基本数据类型
(1). c语言的基本数据类型很多,是为了很合理的运用内存。
????????类型 | 名称 | 所占内存空间的大小 | char | 字符串 | 1字节 | short | 短整型 | 2字节 | int | 整形 | 4字节 | long | 长整形 | 4字节 | long long | 更长的整形 | 8字节 | float | 单精度浮点数 | 4字节 | double | 双精度浮点数 | 8字节 |
?(2). sizeof 是一个关键字?用来查看变量或者数据类型的所占内存空间大小
代码如下(示例):?
printf("%d",sizeof(char)); // 1
printf("%d",sizeof(short)); // 2
printf("%d",sizeof(int)); // 4
printf("%d",sizeof(long)); // 4
printf("%d",sizeof(long long)); // 8
printf("%d",sizeof(float)); // 4
printf("%d",sizeof(double)); // 8
3.输入输出函数
?1. printf()? 发送格式化输出到标准输出 stdout
? ? ? ? ?根据格式字符输出对应的数据:
%i , %d | 输出十进制整数 | %f?? | 输出浮点数 | %lf | 输出双精度浮点数 | %c | 输出字符 | %s | 输出字符串 | %p | 输出变量地址 |
? ? ? ? 这里只做简单的一些格式字符介绍
代码如下(示例):?
printf("%d", 10); // 10
printf("%c", 'a'); // a
printf("%s","abcd"); //abcd
? 2. scanf()? 从键盘上输入。
? ? ? ? ? ? 根据格式字符,输入一个对应的数据
代码如下(示例):
int a;
char str;
scanf("%d",&a); //输入一个数字,赋值给a
scanf("%c",&str); //输入一个字符,赋值给str
4.变量,常量
? ? ? ? 定义变量:
? ? ? ? ? ? ? ?数据类型? 变量名;
? ? ? ? 定义变量并初始化
? ? ? ? ? ? ? ?数据类型? 变量名? = 值;
? ? ? ? 局部变量和全局变量
? ? ? ? ? ? ? ?在函数内部定义的变量叫局部变量,在函数外部定义的变量叫全局变量。
? ? ? ? 变量的生命周期
? ? ? ? ? ? ? ? 变量的生命周期就是变量的创建和销毁之间的时间段。
? ? ? ? ? ? ? ? 局部变量的生命周期:进入局部范围生命开始,出局部范围生命结束。
? ? ? ? ? ? ? ? 全局变量的生命周期:程序执行结束。
? ??代码如下(示例):
#include "stdio.h"
int a = 100; 全局变量
int main(){
int b = 10; //定义变量并初始化, 局部变量
printf("%d",b); // 10
return 0;
}
? ? ? ?定义常量:
? ? ? ? ? ? ? ? #define 定义标识符常量
? ? ? ? ? ? ? ? 例:#define Max 1000? ? ? ? ? ? ? 这后面不能加分号
? ? ? ? ? ? ? ? ? ? ? ? 这是定义了一个名叫Max的常量? 它的值是1000
? ? ? ? ? ? ? ? ? ? ? ? #define和#inculde都是它们是预处理指令
? ? ? ? ? ? ? ? ?const 关键字修饰的常变量
? ? ? ? ? ? ? ? ?例: const int a = 100;
? ? ? ? ? ? ? ? ? ? ? ? ?这个a本质还是变量 ,但是被const修饰过后,就具有常量的属性了
5.字符串和字符
????????字符串是由双引号引起来的,字符串末尾位置隐藏着一个 '\0' 代表字符串结束? ? ? ?
????????????????"aa"? 这是一个字符串
? ? ? ? ? ? ? ? 定义字符串变量:
? ? ? ? ? ? ? ? ? ? ? ? char str[] = "abcd";? ?通过下标访问? ?str[0]? = 'a'? str[1] = 'b';??
?????????????????? ? ? ?char str[20] = {0};? ? ?这是定义了一个空字符串数组,0 的ASCII值是 '\0'
? ? ? ? ? ? ? ? ? ? ? ? 字符串遇到'\0' 就会结束? ?
? ? ? ? ? ? ? ? 这是字符串数组,因为字符串是多个所以得这样定义,数组下标是从0开始的
????????字符是由单引号引起来的。
????????????????'a' 这是一个字符
? 6.判断语句? ? ? ? ? ? ?
例:这是双分支
#include "stdio.h"
int main(){
int i = 0;
if(i){
printf("执行if");
}else{
printf("执行else");
}
return 0;
}
这段代码最终会输出 "执行else"
因为 if 括号里面的表达式 / 值是 0,0为假执行 else ,1为真执行 if 。
if else 语句可以理解为? ? 如果条件不成立,就执行else。
?例:这是多分支
#include "stdio.h"
int main(){
//定义一个变量为成绩
int score = 80;
// if() else if() 来判断成绩为优秀还是良好还是及格
if(score >= 90){
printf("优秀!");
}else if(score >= 80){
printf("良好");
}else if(score >= 60){
printf("及格");
}else{
printf("如果上面条件都不符合就执行我!");
}
return 0;
}
这段代码最终会输出良好
代码是从上往下执行的,先判断第一个条件条件不符合,看下一个,下一个如果还不符合,再看下一个,如果还不符合就执行 else
很显然第二个条件符合,输出。
多分支语句是? 多个条件 , 由 if 和 多个 (else if) 组成的?
三元表达式
? ? ? ? ?格式:
? ? ? ? ? ? ? ? ? 表达式 ?值1 : 值2 ;?
char s;
s = 1 > 0 ? 'Y' : 'N';
printf("%c",s); //Y
??可以理解为? ? 1 > 0 吗? 如果大于那就是为真,就把 'Y' 赋值给s变量,不大于则为假
? 就把'N' 赋值给 s变量
7.循环语句
? ? ?1.? for循环
? ? ? ? ? ? ? ?格式 :?
????????????????????????????????for(初始值 ; 条件表达式; 增量){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????循环体
????????????????????????????????}
? ? ? ? ? ? ? ? 初始值只使用一次,条件是判断循环结束否,增量控制循环次数
? ? ? ? ? ? ? ? 执行顺序 : 1.初始值??? 2.判断条件? 真 执行代码块? 执行完,初始值+1,继续重复
????????????????????????????????????1.初始值??? 2.判断条件? 假 结束循环
#include "stdio.h"
int main(){
int i;
for(i = 1; i < 101; i++){
printf("%d",i); //打印结果是 1 - 100
}
return 0;
}
? 2. while循环
? ? ? ? ? ? ? ? 格式:
? ? ? ? ? ? ? ? ? ? ? ? int i = 0;? 初始值
? ? ? ? ? ? ? ? ? ? ? ? while (条件表达式){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代码块
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? i++;? 自增量
????????????????????????}
? ? ? ? ? ? ? ? 执行顺序: i = 0;? 判断条件? 真: 执行代码块 ,i++,继续重复,再判断,真:执行
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?i = 0;? 判断条件? 假:? ? 结束循环
? ? break,continue关键字
? ? ? ? ? ? ? ?break 跳出循环。后面代码不执行? ? ? ? ? ? ? ?跳出一层循环
? ? ? ? ? ? ? ?continue 跳过本次循环,后面代码不执行
#include "stdio.h"
int main(){
int i,j;
for(i = 1; i < 101; i++){
if(i % 2 == 0){
continue;
}
printf("%d",i); //打印结果是 1 - 100 中的奇数
}
for(j = 1; j < 101; j++){
if(j == 51){
break;
}
printf("%d",j); //打印结果是 [1 - 50]
}
}
? 8.数组? ? ? ? ? ? ? ?
? ? ???1.一维数组
? ? ? ? ? ? ? 数组是一堆连续的空间,存放着相同数据类型且大小差不多的值? ? ? ??
? ? ? ? ? ? ? 定义数组 : 元素类型? 变量名[ 数量 ];
? ? ? ? ? ? ? 定义数组并初始化:元素类型? 变量名[]? = {值1,值2};
? ? ? ? ? ? ? ? ? ? ? ?例: int arr1[4] = {1,2,3,4};
? ? ? ? ? ? ? ?数组下标 从 0 开始??
? ? ? ? ? ? ? ?访问数组某个元素? arr1[3]? => 4?
? ? ? ? ? ? ? ? 遍历数组:
#include <stdio.h>
int main(){
int arr1[10] = {1,2,3,4,5,6,7,8,9,10}; //定义并初始化
int j;
printf("arr1数组元素为:");
for (j = 0; j < 10; j++) {
printf(" %d", arr1[j]); //循环10次 从0开始 每次输出数组[i]个元素
}
return 0;
}
? ? ? ? 2. 二维数组
? ? ? ? ? ? ? ? 定义二维数组 : 元素类型 变量名[长度][长度];
? ? ? ? ? ? ? ? 例: int arr[2][3];? ? ? ?
? ? ? ? ? ? ? ? 定义二维数组并初始化: 元素类型 变量名[长度][长度] = {{值1},{值1},{值1}};
? ? ? ? ? ? ? ? 例:? int arr[3][3] = {{1,2,3},?{4,5,6} , {7,8,9}};?
? ? ? ? ? ? ? ??一个二维数组可以被认为是一个带有 x 行和 y 列的表格:例?
arr[0][0] =>1 | arr[0][1] =>2 | arr[0][2] =>3 | arr[1][0] =>4 | arr[1][1] =>5 | arr[1][2] =>6 | arr[2][0] =>7 | arr[2][1] =>8 | arr[2][2] =>9 |
? ? ? ? ? ? ? ? 第一行 是 arr[0] => {1,2,3};? ??
? ? ? ? ? ? ? ? 第二行是?arr[1] => {4,5,6};?
? ? ? ? ? ? ? ? 第三行是?arr[2] => {7,8,9};??
? ? ? ? ?遍历二维数组:? ? ??
#include <stdio.h>
int main(){
int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int i, j;
for (i = 0;i < 3;i++) { //外循环一次
for (j = 0;j < 3;j++) { //内循环 循环到不符合条件为止
printf("arr[%d][%d] = %d\n",i,j,arr[i][j]);
}
}
return 0;
}
//运行结果 i可以看做每一行 j可以看做每一列
arr[0][0] = 1
arr[0][1] = 2
arr[0][2] = 3
arr[1][0] = 4
arr[1][1] = 5
arr[1][2] = 6
arr[2][0] = 7
arr[2][1] = 8
arr[2][2] = 9
9.函数
? ? ? ? ? ? ? 函数是C语言非常重要的知识,函数是C语言模块,有很强的独立性,可以互相调用。
? ? ? ? ? ? ? C语言有很多内置函数,像printf()? scanf()? 都是内置函数
? ? ? ? ? ? ? 函数定义 :? 返回值类型? 函数名(形参){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????函数体
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?定义需要在主函数main()的外部定义,调用需要在main()函数里调用
????????例:
#include <stdio.h>
// 定义一个求和函数, 返回值类型是整形,参数有两个整形参数
int sum(int x, int y){
return x + y;
}
int main(){
int x = 1;
int y = 2;
int sum1;
sum1 = sum(x,y); // 调用sum函数将x,y的值传进去
printf("%d",sum1); // 打印返回的结果
return 0;
}
返回值类型 有 int char? float 等等,还有一个空类型(void) 可以理解为无返回值类型
????????例:
#include <stdio.h>
void hello(){
printf("hello world!"); // 没有返回值
}
int main(){
hello();
return 0;
}
封装一个函数,函数功能是冒泡排序
????????例:????????
#include <stdio.h>
int Sort(int array[],int arrlen) {
int i, j, z;
for (i = 0; i < arrlen - 1; i++) {
for (j = 0; j < arrlen - i - 1; j++) {
if (array[j] > array[j + 1]) { //如果 数组第一个元素比第二个元素大
array[j] = array[j] + array[j + 1]; //那么就交换
array[j + 1] = array[j] - array[j + 1];
array[j] = array[j] - array[j + 1];
} // 交换的代码可以看做这样
} // a = 2 , b = 3
} // a = a + b, b = a - b, a = a - b;
printf("排序后的array是:");
for (z = 0; z < arrlen; z++) {
printf(" %d", array[z]);
}
return 0;
}
int main() {
int arr1[] = { 1,20,5,7,8,4,2,1,20,9 }; //定义数组
int length = sizeof(arr1) / sizeof(int); //计算数组长度
Sort(arr1,length); //将数组,长度传进去
return 0;
}
10.指针?
? ? ? ? 指针是什么? 指针就是地址。
? ? ? ? 地址是什么? 计算机所有程序都在内存中进行,地址就是内存中的内存单元的编号。
? ? ? ? 一个内存单元大小是1字节(8bit),一个内存单元对应一个地址(或编号)。
? ? ? ? 计算机的单位:
?1bit? =? 1 或 0 | bit是二进制数 | ?1byte = 8bit | byte是字节 | ?1kb? =? 1024byte | kb 常见单位 | ? 1mb =? 1024kb | mb 常见单位 | ? 1gb = 1024mb | gb 常见内存单位 |
? ? ? ? 地址是由32bit位组成的
? ? ? ? int a = 10;? ? 因为int所占大小是4字节,所以它有四个地址,但是取地址默认取出第一个地址
?地址 | ? ?值 | ?0x00000067EEBFF594 | 0a | ?0x00000067EEBFF595 | 00 | ?0x00000067EEBFF596 | 00 | ?0x00000067EEBFF597 | 00? |
? ????????&a 默认取出整形变量a的第一个地址,所以是 0x00000067EEBFF594
? ? ? ? ? 这四个地址就是四个内存单元,专门存放a变量的
? ?定义指针:? ?类型 * 变量名;
? ?定义并引用 :? ? ? ?类型? a? = 值;
????????????????????????????????类型 * 变量名? =? &a;? ? ? ? ? ?变量a的类型要与 指针变量的类型相同
? ? ? ? 例1:? ? ? ? ?
#include <stdio.h>
int main(){
int a = 10;
printf("%p",&a);
int * pa = &a;
printf("%d",*pa);
// %p专门打印地址,打印出的形式是十六进制
// &a这是取地址,就是一串地址 0x000000BFAC
// *pa 说明这是指针变量,int说明pa执行的对象类型是int。
// printf("%d",*pa); *pa 解引用操作,通过地址找到a变量 打印10
return 0;
}
? ?指针类型的大小都是相同的,它们都是存放着地址。
? ?指针的类型大小取决于编译器的位数(32位数4字节,64位数8字节)
? ?因为笔者使用的是32位的所以都是四字节
????????例:
printf("%d",sizeof(char *)); // 4
printf("%d",sizeof(short *)); // 4
printf("%d",sizeof(int *)); // 4
printf("%d",sizeof(long *)); // 4
printf("%d",sizeof(long long *)); // 4
printf("%d",sizeof(float *)); // 4
printf("%d",sizeof(double *)); // 4
11.结构体
???????? 结构体使得c语言有能力秒数复杂类型,比如一个学生有年龄,有身高,有学号,这几个数据类型不相同,定义变量太多也不好。这样就可以使用结构体,构建一个 虚拟学生
构建一个虚拟学生出来,就可以实例化多个学生,它们有自己的名字,成绩,学号
? ? ? ? 定义结构体:
? ? ? ? ? ? ? ? ? ? ? ? ?struct? 结构体名{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 年龄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 姓名
????????????????????????}????????
? ? ? ? ? ? ? ? ? ? ? ? struct 结构体名? 变量名 = { 20 , "lisi" };? 实例化??
? ? ? ? ?例:
#include <stdio.h>
struct stu { //用struct关键字定义一个stu结构体
char name[20]; //学生姓名
int age; //学生年龄
double score; //学生成绩
int id; //学号
};
int main() {
// 创建了一个李四学生
struct stu s = {"李四" , 20 , 91.9, 20040202}; //结构体的创建和初始化
printf("1: %s %d %lf %d\n", s.name, s.age, s.score , s.id);//结构体变量.成员变量
struct stu * ps = &s; //struct stu是&s的类型
printf("2: %s %d %lf %d\n", ps->name, ps->age, ps->score, s.id);
// 创建了一个张三学生
struct stu z = {"张三" , 19 , 99.5, 20040302}; //结构体的创建和初始化
printf("11: %s %d %lf %d\n", z.name, z.age, z.score , z.id);//结构体变量.成员变量
struct stu * pz = &z; //struct stu是&z的类型
printf("12: %s %d %lf %d\n", pz->name, pz->age, pz->score, pz->id);
return 0;
}
? ? ? ? 访问结构体成员可以有两种方式:
? ? ? ? ? ? ? ?使用结构体变量名. 成员名
? ? ? ? ? ? ? ? ? ? ( . ) 可以理解为 的? ? ? ?比如 : s的name? ? ?s的age? ?s的score
????????????????使用结构体指针名->成员名???
? ? ? ? ? ? ? ? ? ? ?ps?是一个地址? ?存放 s 这个结构体变量名这个地址
? ? ? ? ? ? ? ? ? ? ?ps -> age? ? 可以理解为? ? ps指针变量 找到 s结构体变量访问里面的成员。? ? ? ? ???
? ? ? ? ? ??
本章完!如果觉得对你有帮助!请大家点赞评论转发!
|