【C语言】初识C语言

初识C语言

目录

C语言

函数

数据类型

变量

常量

字符串

转义字符

操作符

关键字

内存

指针

结构体


C语言

C语言:计算机编程语言,用于底层开发;是人和计算机交流的语言。

.c文件表示源文件;.h文件表示头文件;

C语言写出来的程序是.c文件,需经过编译器(编译、链接),生成可执行.exe文件


函数

main函数

. 主函数;

. 程序的入口,C语言代码都是从main函数的第一行开始执行;

. 一个程序中,main函数有且只有一个

代码展示:

int main()// int 表示返回整型
{
	return 0;
}
int main(void)// void 表示main函数不接受参数
{
	return 0;
}
int main(int argc, char* argv[]) // int argc, char* argv[] 表示指定参数
{
	return 0;
}
int main(void)// void 表示main函数不接受参数
{
	return 0;
}

printf输入库函数

. 库函数的使用必须包含头文件;

. printf库函数需要的头文件叫:stdio.h ;

代码展示:

#include <stdio.h>
int main()// int 表示返回整型
{
	printf("CSDN");// 双引号内是什么就输出什么
	return 0;
}

scanf输入函数

* scanf("%d ", &变量名); // %d后面不能加 \n ;

. 使用scanf函数需要用到占位符 &(&变量名) ;

  代码展示:

#define _CRT_SECURE_NO_WARNIN
#include <stdio.h>
int main()// int 表示返回类型
{
	int num = 0;// 定义变量;并且为变量赋了初始值
	printf("请在键盘上输入一个数:");
	scanf("%d", &num);// %d 表示打印一个十进制整数
	return 0;// 表示返回的 0
}

. 在源文件的第一行需要定义宏:#define _CRT_SECURE_NO_WARNINGS


 题目要求多组输入:使用 scanf 的返回值进行判断

. scanf 读取数的个数是几个,就返回几;

 . 程序中,按 Ctrl + z 结束循环;但是在VS中需要输入三次 Ctrl + z;

代码展示:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a = 0;
	// 1
	// scanf的返回值是:
	// scanf读取成功
	while (scanf("%d", &a) == 1)
	{
		//当scanf读取到一个数,则返回 1 ; 读取到几个数则返回几
		//所以上面 scanf("%d", &a) 返回的是 1
		//读取的
		printf("scanf做判断语句\n");
		int b = 0;
		while (scanf("%d %d", &a, &b) == 2)
		{
			//scanf读取到两个数
			// 2 == 2 为真,则执行 while 语句
			printf("scanf读取到两个数");
		}
	}

	// 2
	// scanf读取失败
	// 返回的是 EOF (EOF的值是-1)
	while (scanf("%d", &a) != EOF)
	{
		// 如果scanf读取到一个数,则为 1
		// 1 != EOF 为真,则执行 while 语句
		printf("scanf做判断语句\n");
	}
	return 0;
}

数据类型

. 目的:数据类型是用来创建变量的

. 计算机中的单位:bit - 比特位 ;byte - 字节 (1byte = 8bit) ;KB (1KB = 1024byte) ;

MB (1MB = 1024KB) ;GB ;TB ;PB ......

数据类型长度/(字节)打印方式
字符型char1%c
整型short2%hd
int4%d
long4%ld
long long8%lld
浮点数单精度浮点数float4%f
双精度浮点数double8%lf

代码展示:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
	int a;
	float b;
	double c;
	char d;
	printf("请输入:");
	scanf("%d", &a);// %d输出整型
	scanf("%f %lf", &b, &c);// 输出浮点数
	scanf("%c", &d);// %c输出字符型;%s输出字符串(在C语言中没有字符串类型)
	return 0;
}

代码展示:

#include <stdio.h>
int main()
{
	printf("%d\n", sizeof(char));// \n表示换行的意思
	printf("%d\n", sizeof(short));// sizeof计算大小
	printf("%d\n", sizeof(long));
	printf("%d\n", sizeof(long long));
	printf("%d\n", sizeof(float));
	printf("%d\n", sizeof(double));
	return 0;
}

变量

. 变量定义:数据类型  变量名;

代码展示:

int main()
{
	int a;//定义变量
	char ch = 'c';//定义变量并赋与了初始值
	return 0;
}

. 变量分类:全局变量、局部变量

1. 由{}区分:在{}内的叫局部变量;在{}外的叫全局变量;

2. 局部全局都可以使用的时候,局部优先;

代码展示:

#include <stdio.h>
int num = 20;// 全局变量
int main()
{
	int num = 10;// 局部变量
	printf("%d\n", num);// 输出的是局部变量10
	return 0;
}

变量作用域(范围):

. 全局变量作用域:整个 工程中使用都有效

. 局部变量作用域:在定义局部变量之后的局部范围内都有效

变量生命周期(时间):

. 全局变量生命周期:整个程序的生命周期

. 局部变量生命周期:进入作用域生命周期开始,出作用域生命周期结束

代码展示:

#include <stdio.h>
int a = 1;
int main()
{
	int a = 2;
	int b = 110;
	{
		int b = 120;
		printf("%d\n", a);//就近原则,输出2
	}
	printf("%d\n", b);//出了 b = 120 所在的作用域,则 b = 120 的生命周期结束;此处输出110
	printf("%d\n", a);// a = 2 还在局部范围内,则 a = 2 的生命周期还未结束;就近原则,此处输出2
	return 0;
}

常量

.  const修饰的常变量

1. const就是常属性的意思,修饰变量;

2. 被const修饰的值不能被改变;

3. 常量的属性,本质还是变量

代码展示:

#include <stdio.h>
int main()
{
	const int a = 10;//a 就是const修饰的常变量,但是本质上a还是变量
	// int arr[a] = {0};//定义的是整型数组,所以[]内必须是整型常量;因为 a 本质还是变量,所以不能写 a;
	return 0;
}

. define定义的标识符常量

1. #define 常量名 值;

代码展示:

#include <stdio.h>
#define M 10
int main()
{
	int arr[M] = { 0 };//说明 M 是一个整型常量
	return 0;
}

. 枚举常量

1. 由关键字enum定义;

2. enum name{枚举常量名1,枚举常量名2,...};

3. 输出的值是默认的,依次从 0, 1, 2...;

4.改变默认值可以通过对枚举常量名1进行赋值(枚举常量名1 = 值);

代码展示:

#include <stdio.h>
enum Gender
{
	female = 5,
	male,
	secrecy,
};
int main()
{
	enum Gender f = female;
	enum Gender fm = male;
	printf("f = %d\n", f);//输出值为5
	printf("fm = %d\n", fm);//输出值为6
	return 0;
}

. 字面常量

1. 直接定义的常量就叫字面常量,例如:10;100;20;.... ;

字符串 

 * 字符串是在双引号内部的;在单引号内部的叫字符 *

. 字符串的结束标志是 \0 ,但 \0 不作为字符串

. 计算字符串长度是计算 \0 之前的字符串长度,不包括 \0

. 计算字符串长度使用 strlen 库函数,需要调用头文件 string.h

代码展示:

#include <stdio.h>
#include <string.h>
int main() 
{
	char arr[] = "adcd";// 在d的后面隐藏了 \0
	char arr_1[] = { 'a','b','c','d' };
	printf("arr:%s\n", arr);
	printf("字符串arr的长度为:%d\n", strlen(arr));
	printf("arr_1:%s\n", arr_1);
	printf("字符串arr_1的长度为:%d\n", strlen(arr_1));// 随机值,找到 \0 才会停
	return 0;
}

转义字符

转义字符释义
\dddddd表示1~3个八进制数
\xdddd表示2个十六进制数
\\表示一个反斜杠 \
\'表示一个单引号 '
\"表示一个双引号 "
\t表示键盘上的 tab键
\n表示换行
\r表示回车
\b表示向后退一格
\a警告字符,蜂鸣

操作符

* 在C语言中:0 表示假,非0 表示真

/   (得商)

1: 除号两端都是整数,执行整数除法,不会得到小数;

2: 打印用 %lf ,保证除号两端至少有一个小数(默认是double类型),得到的就是一个小数;

3: (%.2lf 表示只保留两位小数位)

% (取模)得到是余数;
逻辑操作符

&& -- 并且 (有一假,则为假);

|| -- 或者 (有一真,则为真);

三目操作符表达式1 ?表达式2 :表达式3(表示式1成立执行表达式2;不成立执行表达式3)
逗号表达式从左向右依次计算,最后一个表达式的结果是整个表达式的结果;

关键字

关键字:不能自己创建的关键字 ;

类型char ; double ; enum ; float ; int ; long ; short ; sizeof ;struct ;  void ; auto(自动)所有局部变量都是auto类型 ;signed(有符号的) ; unsigned(无符号的) ; typedef(重定义) ; union(联合体);
循环类型break ;continue ;do while ; while ; for
分支类型

switch ; break ; case ; default ; if ; else ; go to(跳转)

存储类型extern(声明外部符号) ; register(寄存器关键字) ; static(静态的)
函数类型return
不常用volatile(易变的)

. typedef:是类型名重定义,将复杂的类型简单化

代码展示:

#include <stdio.h>
typedef unsigned char unchar;//将 unsigned char 重新定义为 unchar 
int main()
{
	unsigned char ch = 'a';
	printf("%c\n", ch);
	unchar ch_1 = 'A';//uncahr 也表示 unsigned char(无符号字符型)
	printf("%c\n", ch_1);
	return 0;
}

 . static:1. 修饰局部变量 2. 修饰全局变量 3. 修饰函数 (被static修饰的变量是没有对应的汇编代码的。)

1. static修饰局部变量,作用域依旧在局部作用域内,但生命周期变长了;

1. 局部变量被static修饰之后,进入函数时已经创建好了,出函数时也不销毁,多次调用时,共享变量;

1. 普通的局部变量是放在栈区上的,被static修饰的后,存放在内存的静态区,静态区的变量生命周期和全局变量生命周期一样;

代码展示:

#include <stdio.h>
void test_1()
{
	static int i = 1;//static使得i的值没有被销毁
	i++;
	printf("%d ", i);//输出 2 3 4 5 6
}
int main3()
{
	int j = 0;
	while (j < 5)
	{
		test_1();
		j += 1;
	}
}
void test()
{
	int i = 1;//局部变量
	i++;
	printf("%d ", i);//输出 2 2 2 2 2
}
int mian2()
{
	int j = 0;
	while (j < 5)
	{
		test();
		j = j + 1;
	}
	return 0;
}

2. static 修饰全局变量,将外部链接属性变成了内部链接属性;全局变量只能在当前.c文件中使用;改变了作用域,但生命周期没变;

3. static修饰函数,将外部链接属性变成了内部链接属性;

. extern:声明来自外部文件的符号

内存

在语言层面上,内存主要分为:栈区、堆区、静态区

. 栈区: 局部变量放在栈区;函数的形式参数;为具有临时属性的变量开辟的;

. 堆区:为动态内存开辟和管理的;

. 静态区:全局变量;静态变量;

 指针

 . 内存:给每个内存进行编号 -- 编号叫做地址;

1. 把内存划分为一个个有效的内存单元(一个单元是一个字节);

2. 给每个内存单元进行编号(编号 == 地址 == 指针),C语言中把地址也叫指针;

3. 一个地址管理一个字节;

. 指针变量:存放地址的变量;

. 指针变量的大小是固定不变的,(x86下编译是4个字节,x64下编译是8个字节)

代码展示:

#include <stdio.h>
int main()
{
	int a = 10;
	int* pa = &a;//pa叫指针变量
	// * 说明pa是指针变量
	// int 说明pa指向的是int类型的变量
	//*pa就等价于a
	return 0;
	return 0;
}

代码展示: 

#include <stdio.h>
int main()
{
	char* pc;
	short* ps;
	int* pi;
	double* pd;
	printf("%zd\n", sizeof(pc));//格式字符串的打印使用"%zd"
	printf("%zd\n", sizeof(ps));
	printf("%zd\n", sizeof(pi));
	printf("%zd\n", sizeof(pd));
	return 0;
}

 结构体

. 结构体:用来描述复杂类型的

代码展示:

//结构体struct
struct Stu
{
	char name[20];
	int age;
	float score;
};
int main()
{
	struct Stu s1 = { "girl", 18, 90 };//相当于int num = 0;
	struct Stu s2 = { "girl_1", 19, 95 };
	struct Stu s3 = { "girl_2", 20, 100 };

	printf("%s %d %f\n", s1.name, s1.age, s1.score);

	struct Stu* ps1 = &s1;//ps1的类型由s1决定
	printf("%s %d %f\n", ps1->name, ps1->age, ps1->score);
	return 0;
}

文章有许多不足处,希望大家能够在评论区指出!
————————————————
版权声明:本文为CSDN博主「我叫小白菜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/2201_75406088/article/details/131152462 

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值