初识c语言

初识C语言

前言

提示:这里是本文要记录的大概内容:

在学习考研的数据结构结构之前,准备重新学习一下C语言的相关知识,同时也写博客记录一下相关的知识点。本篇文章主要讲的内容就是“初识c语言”,简单的讲解一下c语言的相关内容,首先对c语言有个大概的了解。也很适合初学者哟!
(我用的编译器是vs2022版本)


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是c语言?

C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进
行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和
国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。

二、编写你的第一个c语言程序

打开编译器,首先引入库#include<stdio.h>`,在main函数里面写想要打印的内容:例如“Hello World”;在这里插入图片描述
//main函数是程序的入口
//一个工程中main函数有且仅有一个
//printf();的作用就是可以在控制台打印输出你想要输出的内容。

二、详细知识点

1.数据类型

char        //字符数据类型
short       //短整型
int         //整形
long        //长整型
long long   //更长的整形
float       //单精度浮点数
double      //双精度浮点数

为什么会有这么多中类型呢?那每种类型的大小是多少呢?
我们可以使用一个关键字sizeof()来查看每种数据类型的大小

由此
注:控制台打印出来大小单位是Byte(比特),一个Byte=8bit,也就是1比特等于8个字节。
存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。

2.常量和变量

在我们的生活中,有些值是可以变的,例如:年龄,体重…;有些值是不能改变的,例如:性别,圆周率…
在c语言里面,可以改变的值叫做变量,不能改变的值叫做常量。

1)常量

(1)常量的分类
  • 字面常量
  //字面常量演示
    3.14;//字面常量
    1000;//字面常量
 
  • const修饰的常量
  //const 修饰的常变量
    const float pai = 3.14f;   //这里的pai是const修饰的常变量
    pai = 5.14;//是不能直接修改的!

pai 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面限制了变量 pai 不能直接被改变,但是 pai 本质上还是一个变量的,所以叫常变量。

  • #define定义的标识常量
    //#define的标识符常量 演示
    #define MAX 100
    printf("max = %d\n", MAX);
  • 枚举常量
enum Sex
{
 MALE,
 FEMALE,
 SECRET
};
int main()
{
    //枚举常量演示
    printf("%d\n", MALE);
    printf("%d\n", FEMALE);
    printf("%d\n", SECRET);
    //注:枚举常量的默认是从0开始,依次向下递增1的

2)变量

(1)变量的分类
  • 全局变量
  • 局部变量
#include <stdio.h>
int global = 2019;//全局变量
int main()
{
    int local = 2018;//局部变量
    //当局部变量与全局变量同名的时候,局部变量的值优先
    int global = 2020;//局部变量
    printf("global = %d\n", global);
    return 0;
}

如果是要引入另一个.c文件夹的变量的时候可以添加以下代码

//另一个文件夹
int a=6;
//在该文件夹引入变量
extern int a;
(2)变量的作用域和生命周期
  • 作用域
  1. 局部变量的作用域是变量所在的局部范围。
  2. 全局变量的作用域是整个工程。
  • 生命周期
  1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
  2. 全局变量的生命周期是:整个程序的生命周期。

3.字符串

这种由双引号引起来的一串字符称为字符串字面值,或者简称字符
串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
在这里插入图片描述
第二种存储字符串的方式由于没有结束符,所以在打印的时候会继续在存储的空间内往下打印,直到在某个地方读取到结束标志\0

4.转义字符

例如\t在c语言里面会被识别为水平制表符,不会直接打印出\t,因此就需要转义字符。转义字符顾名思义就是转变意思。

符号含义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\’用于表示字符常量’
\"用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符
\a警告字符,蜂鸣
\b退格符
\n换行
\r回车
\t水平制表符
\v垂直制表符
\dddddd代表1~3个八进制的数字
\xdddd表示2个十六进制的数字

在这里插入图片描述

//%d——>用来输出十进制整数,按整型数据的实际长度输出。
//%s——>打印字符串
//%c——>打印字符
//%f——>打印float数据
//%lf——>打印double数据
//%zu——>sizeof()打印

5.选择语句和循环语句

(1)选择语句

在c语言里面的选择语句是if else语句,可以只有if,也可以多个if else一起使用
在这里插入图片描述

(2)循环语句
  • while循环
 int main()
{
	int i = 0;
	//while后面的括号是循环的条件
	//下面的大括号是满足循环条件执行的内容
	while (i<10)
	{
	   //i++的意思相当于i=i+1;
		i++;
	}
	printf("%d\n", i);
	return 0;

}
  • for循环
 int main()
{
	int i ;
//for后面的括号,第一个语句是初始化内容,第二个语句是判断语句,
//第三个语句是符合判断语句过后执行的操作
//大括号的内容可以写符合循环条件执行的内容
	for (i=0;i<10;i++)
	{
		
	}
	printf("%d\n", i);
	return 0;
}
  • do while循环
    与while不同的是,先循环,再接着判断是否符合判断语句
int main()
{
	int i =1;
	do
	{
		i++;
		printf("%d\n", i);

	} 
	while (i < 10);
	return 0;
}

在这里插入图片描述

6.数组

int main()
{   //a1是定义的数组名
    //因为有内容,所以数组的长度会按照内容自己分配大小
	int a1[] = { 1,2,3,4,5,6,7,8,9 };
	//不完全初始化,剩余的部分会全部默认为0
	char a2[4]={'b','c','d'};
	//这里是通过数组的下标来访问,从0开始,下标为5的是6
	printf("%d\n", a1[5]);
}

注:

  1. 数组定义格式:型名 数组名[常量表达式]={};
  2. C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
    数组可以通过下标来访问的。
  3. 数组内容没有初始化时,必须指定长度大小;如果有内容可以不写,因为会按照内容自己分配大小;

7.操作符

(1)算数操作符
  • 加+
  • 减 -
  • 乘 *
  • 除 /
    除号两端都是整数的时候,执行的是整数除法,如果两端只要有一个浮点数就会执行浮点数的除法
  • 取模 %
    取模操作符的数必须是整数
int main()
{
	int a = 11;
	int b = 3;
	float c = 0;
	printf("%d\n", a+b);
	printf("%d\n", a - b);
	printf("%d\n", a / b);
	c = 8.0 / 3;
	//.2f 对结果保留2位小数
	printf("%.2f\n", c);
	printf("%d\n", a % b);
	return 0;
}

在这里插入图片描述

(2)移位操作符
符号功能
>>将一个操作数的所有位向左移动指定的位数。右边空出的位用0填充,左边移出的位丢弃。
<<根据操作数的类型,有两种右移操作:逻辑右移和算术右移。逻辑右移:将一个操作数的所有位向右移动指定的位数。右边空出的位用0填充,无论原来的最左边是0还是1,左边移出的位都丢弃。算术右移:将一个操作数的所有位向右移动指定的位数。右边空出的位用0填充,但最左边的位如果是1(表示负数),则左边移出的位用1填充,保持符号位不变。
(3)位操作符
符号功能
&按位与只有当两个位都为1时,结果位才为1;否则,结果位为0
|按位或如果两个对应的位中至少有一个为1,那么结果位将为1,否则为0
^异或使用异或操作可以交换两个变量的值,而无需使用额外的变量。
(4)赋值操作符
符号功能
=赋值
+=a+=b相当于a=a+b
-=a-=b相当于a=a-b
*=a*=b相当于a=a*b
/=a/=b相当于a=a/b
&=a&=b相当于a=a&b
^=a^=b相当于a=a ^b
(5)单目操作符
符号功能
取反
&取地址
sizeof()计算大小(单位byte)
- -前置:先- -再使用;后置先使用再- -
++前置:先++再使用;后置先使用再++ ( int b=a++相当于int b=a;a=a++)( int b=++a相当于a=a++;b=a;)
(类型)强制类型转换 int a=(int)3.14
(6)关系操作符
  • 小于<
  • 大于 >
  • 小于等于<=
  • 大于等于>=
  • 不等于!=
(7)逻辑操作符
  • 逻辑与&&
    对于逻辑与,只有两个操作数都是真,结果才是真
  • 逻辑或 ||
    对于逻辑或,如果一个操作数或多个操作数为 true,则逻辑或运算符返回布尔值 true;只有全部操作数为false,结果才是 false。
(8)条件操作符(3目操作符)
  • exp1?exp2:exp3

如果exp1为真,整个表达式结果为表达式2的结果;
如果exp1为假,整个表达式结果为表达式3的结果

int main()
{
	int a = 4;
	int b = 8;
	//由此可见:c的值为b的值8
	int c = a > b ? a : b;
	printf("%d\n",c);

}
(9)逗号表达式
  • 逗号隔开的一串表达式,会从左到右依次计算,整个表达式的结果是最后表达式的结果:exp1,exp2,exp3…

8.常见关键字

关键字不能自己创建(在这里只介绍几个常用的关键字)

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)typedef
typedef unsigned int unit;
int main()
{
    unsigned int a=1;
    //如果后续还需要unsigned 多次重复打字很麻烦
    //在mian函数外面用typedef定义
    //改行代码与前面一行效果相同
    unit a=1}
(2)static用来修饰变量和函数
  • 修饰局部变量
    static修饰局部变量的时候,局部变量出了作用域,不会被销毁,可以继续使用,到程序结束,生命周期才结束。
//static 修饰局部变量
void test()
{
	static int a = 1;
	a++;
	printf("%d\n",a);
}
int main()
{
	int i = 0;
	while (i<10)
	{
		test();
		i++;
	}
	return 0;
}
  • 修饰全局变量
    全局变量是具有外部链接属性的,在其他.c文件中如果想要调用某一.c文件里面的变量的时候,可以使用extern…;但是static修饰全局变量的时候,全局变量的外部链接属性就变成了内部链接属性,因此其他的文件就不能再使用该全局变量。
//代码1
 //add.c文件
int g_val = 2018;
//test.c文件
int main()
{
    printf("%d\n", g_val);
    return 0;
}
//代码2
//add.c
static int g_val = 2018;
//test.c
int main()
{
    printf("%d\n", g_val);
    return 0;
}

代码1正常,代码2在编译的时候会出现连接性错误。

  • 修饰函数
    作用同上全局变量

//static修饰函数
//代码1
//add.c
int Add(int x, int y)
{
    return x+y;
}
//test.c
//引入另一个.c文件的函数
extern int Add(int x,int y);
int main()
{
	int a = 10;
	int b = 50;
	int c=Add(a,b);
	printf("%d\n",c);
	return 0;
}
//代码2
//add.c
static int Add(int x, int y)
{
    return x+y;
}
//test.c
int main()
{
    printf("%d\n", Add(2, 3));
    return 0;
}

代码1正常,代码2在编译的时候会出现连接性错误.

(3) register(寄存器)
register int num=3;//该句的含义是建议将3存放到寄存器里面
(4)define定义常量和宏
//define定义标识符常量
//将MAX定义为常量
#define MAX 1000
//define定义宏
//ADD是宏名,里面的x,y是宏的参数,参数无类型,后面的()里面是宏体
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
    int sum = ADD(2, 3);
    printf("sum = %d\n", sum);
    
    sum = 10*ADD(2, 3);
    printf("sum = %d\n", sum);
    
    return 0;
}

9.指针

(1)内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节(Byte)。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
取出变量地址操作如下:

#include <stdio.h>
int main()
{
 int num = 10;
 &num;//取出num的地址
    //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
 printf("%p\n", &num);//打印地址,%p是以地址的形式打印
 return 0;
}

那地址如何存储,需要定义指针变量。

int num = 10;
int *p;//p为一个整形指针变量
p = &num;

总的来说内存单元的编号就是他的地址,地址也被称为指针;存放指针(地址)的变量就是我们常用的指针变量。使用实例如下:

  • 整型指针
//%p可以打印地址
//内存里面的地址不能随便改动
int main()
{
	int a = 10;//向内存申请4个byte,存储10
	//int*p = &a;//取a的地址

	//*说明p就是指针变量,int说明p指向的对象是int类型
	//a里面存的值是10,p里面存储的是a的地址
	int* p = &a;
	
	printf("%p\n", &a);
	*p=50;//解引用操作符,可以通过p中存放的地址,找到p所指向的对象,*p就是p所指向的对象
	printf("%d\n", a);
	return 0;

}
  • 字符指针
#include <stdio.h>
int main()
{
 char ch = 'w';
 char* pc = &ch;
 *pc = 'q';
 printf("%c\n", ch);
    return 0;
}
(2)指针变量的大小
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
    printf("%d\n", sizeof(char *));
    printf("%d\n", sizeof(short *));
    printf("%d\n", sizeof(int *));
    printf("%d\n", sizeof(double *));
    return 0;
}

指针大小在32位平台是4个字节,64位平台是8个字节。

10.结构体

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。

  • 结构体初始化
//结构体的定义
struct + 结构体名称
{
	成员列表;
};
  • 结构体使用实例
//结构体的初始化
struct Stu
{
	char name[20];
	int age;
	char sex[10];
	char tele[12];
};

int main()
{
    //结构体的使用
	struct Stu s = {"yuanyuanlp",21,"male","19990421777"};
	//第一种打印方式
	printf("%s %d %s %s\n", s.name, s.age, s.sex, s.tele);
	//第二种打印方式
	print(&s);
	return 0;
}

void print(struct Stu *ps)
{
    //两种访问方式等价
	printf("%s %d %s %s\n",(*ps).name,(*ps).age,(*ps).sex,(*ps).tele);
	//->结构体的指针变量
    //坐标是结构体的指针,右边指向的对象是结构体的成员名
	printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->tele);
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了c语言的相关知识,正如题目所言是“初识c语言”!希望阅读完本篇文章过后,你能对c语言有个初步的了解,能简单阅读c语言的一些代码。其余关于c语言的知识详细介绍,以及案例练习将在后面持续更新哟!
(手打了两天终于写完了…)

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值