C语言笔记——第一篇 C语言基础知识

这是我在学习过程中的笔记,总结的经验,踩过的坑。希望能对你有所帮助。持续缓慢更新......

C语言——编程语言的基础

目录

你的第一个C语言程序

一、注释的使用

1、注释的风格:

2、注释快捷键

二、数据类型

三、变量与常量

3.1变量

3.1.1变量的定义

3.1.2变量的分类

3.1.3变量的使用及特点

3.2常量

3.2.1字面常量

3.2.2const修饰的变量

3.2.3#define定义的标识符常量

3.2.4枚举常量

四、字符串和转义字符

4.1字符串

4.2转义字符

五、选择语句

六、循环语句

七、函数

八、数组

8.1定义

8.2使用

九、操作符

类型

十、常见关键字

(1)typedef——类型重命名

(2)static

十一、#define 定义常量和宏

十二、指针

十三、结构体

建立结构体

结构体的使用


你的第一个C语言程序

现在,是的就是现在。打开你的Dev-C++或者VS或者......(安装方法以及如何新建项目并运行,可上b站搜索,我用的是VS。要安装最新版!)

在屏幕上打出以下代码,运行结果。

#include <stdio.h>
int main()
{
  printf("hello\n");

 return 0;
}

一、注释的使用

注释,用来解释自己的代码,为了让自己或者他人更好的理解代码的含义,或者注释掉不需要的代码。

1、注释的风格:

/* 第一种 C语言风格
    ...可惜不能嵌套使用
    ...
*/


//第二种  C++风格
//...可以一行,可以多行注释
//...

2、注释快捷键

vs——选中目标内容,设置注释,ctrl+k+c;取消注释,ctrl+k+u

注释要简洁明了,尽量减少使用,不要出现写一行代码就有一行注释,以及无意义的注释。如以下

为错误示例。

#include <stdio.h>
int main()
{
    int a=1; // 赋值a=1
return 0;
}

代码1.1 注释错误示例 

二、数据类型

先来看看计算机中的单位:

符号换算
bit
byte--字节=8 bit
kb=1024 byte
mb=1024 kb
gb=1024 mb
tb=1024 gb
pb=1024 tb

牢记1 字节 = 8 bit

数据类型:

1.char——字符型——1字节——8 bit——表达范围:

有符号:-128——127

无符号:   0——255


2.short int——短整型——2字节——16 bit——表达范围:

有符号:-32768——32767

无符号:0——65535


3.int——整型——4字节——32bit——表达范围:

有符号:-2147483648——2147483647

无符号:0——4294967295


4.long int——长整型——4字节——32bit——-表达范围:

有符号:-2147483648——2147483647

无符号:0——4294967295


5.float——浮点型——4字节——32bit——有效数字位数: 6~7位


6.double——双精度型——8字节——64bit——有效数字位数: 12~16位

有时,你会见到在数据类型前加 unsigned,如:unsigned int ,意为 无符号整型。

当然也有 signed ,但是通常省略,也就是说,默认数据类型是有符号的。

补充:字符型在计算机中以对应的ASCII码存储

记住以下ASCII对应字符:

48~57---'0'~'9'

65~90 ---'A'~'Z'

97~122---'a'~'z'

(图源网络)


三、变量与常量


3.1变量


3.1.1变量的定义


改变的值用变量来表示。

输入格式:

类型名  变量名 = 内容;

一般,变量名采用有意义的英文单词,字母,缩写......总之便于你或他人理解含义就好。小写

int a = 100;

char b = 'd';

float c = 22.4

代码3.1.1 变量定义


3.1.2变量的分类


局部变量:一对大括号内部的变量

全局变量:少使用!

#include <stdio.h>
int a = 1; //全局变量

int main()
{
    int b = 2; //局部变量
    int a = 3; //局部变量 
return 0;
}

代码3.1.2 变量的分类

如果输出 a,那么输出的值应该是多少呢?

输出的是a=3

图3.1.2 局部变量

局部变量如果和全局变量的名字一样,以局部变量优先,所以最好不要让他俩名字相同。


3.1.3变量的使用及特点


(1)变量的使用 


#include <stdio.h>
int main()
{
    int a = 0;//这是初始化变量
	int b = 0;
	scanf("%d%d", &a, &b);
	printf("%d,&d\n", a, b);

return 0;
}

代码3.1.3 变量的使用

在这里强调一下,所有的符号均为英文符号!

1.scanf("格式占位符",&变量名);

int a = 0;
int b = 0;
int c = 0;
scanf("%d",&a);
scanf("%d%d",&b,&c);

代码3.1.4 scanf

格式占位符
%c一个字符  
%s字符串
%d,%i有符号的十进制整数
%f,%lf十进制浮点型,或双精度型,带小数点如 3.45
 %ee--科学记数法浮点型如 2.4e01
%EE--科学记数法浮点型如 2.4E01
%g 或 %G根据数据自动选择 %f 或 %e
%p输出地址
%o无符号八进制整数
%u无符号十进制整数
%X无符号十六进制大写A~F
%x无符号十六进制小写a~f
%%输出一个%        

                        

在英文双引号内部是什么,从键盘输入的内容就是什么。

例如:

图3.1.3 举例

第一行 为输入内容,第二行 为输出内容。如果不输入逗号,会发生什么呢?

图3.1.4 举例

试一试如下代码段:

char a = 0;
char b = 0;
scanf("%c%c", &a, &b);
printf("%c %c", a, b);

代码1.5 字符型举例

输入:a空格b,结果是:

图3.1.5 结果

在字符型中,空格,回车,Tab都算字符。

所以,在scanf中除了变量的数据类型,必要的格式以外,最好不要再添加其他内容,以免从键盘输入时,给自己或他人制造麻烦。

2.printf("输入的内容\n",变量名);

例如:

#include <stdio.h>
int main()
{
    int a = 520;
	printf("我喜欢C语言\n");
	printf("%d\n", a);
return 0;
}

 代码3.1.6 printf

图3.1.6 结果


(2)变量作用域与生命周期


1.变量的作用域

意为,变量名可以使用的代码范围。

1.局部变量:变量所在的范围

2.全局变量:整个工程

2.变量的生命周期

意为,变量从建立到销毁的时间段。

1.局部变量:进入局部变量作用域——出作用域

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

#include <stdio.h>
int b = 2;
int main()
{
	int a = 1;
	
	{
		int c = 3;
	}
	printf("%d\n", a);
	printf("%d\n", b);
	printf("%d\n", c);
return 0;
}

代码3.1.7 作用域及生命周期 

图3.1.7 结果

c的作用域只在离它最近的一对大括号内。

生命周期的在学到函数后,会有更好的理解。


3.2常量


3.2.1字面常量


int a = 1;
char b = 'b';
float c = 1.3;


3.2.2const修饰的变量


const int a = 1;
//	a = 2;

const 修饰的变量具有常属性,必须在定义时就初始化,即赋值赋值后不可再次修改,即此时a为常量。

若令a=2,则报错。

图2.2 报错


3.2.3#define定义的标识符常量


#include <stdio.h>
#define a 10
int main()
{
//...
return 0;
}

3.2.4枚举常量


#include <stdio.h>
enum people
{
	name,
	sex
};

int main()
{
	enum people ww = name;
return 0;
}

注意enum中的元素即枚举常量之间逗号 ,   最后一个元素无符号大括号外为  分号 ;


四、字符串和转义字符


4.1字符串


(1)定义:由 " " 英文双引号引起来的一串字符

字符串以  '\0'  作为结束标志

(2)打印字符串的格式:

char ch1[] = "abc";
printf("%s\n",ch1);

char ch2[4] = { 'a','b','c' };
printf("%s\n", ch2);

代码4.1 字符串

图4.1输出结果

为什么ch3输出的内容是乱码呢?

定义ch3时,以数组(去看看目录中的数组在哪儿吧!)的形式定义,未指明个数,则自动计算个数=3,不会添加 '\0' 。程序在执行这段代码时,直到遇到 '\0' 才会停止。它只是字符数组。

而 ch1这种定义方式,"abc" 就是字符串,结尾自动补 '\0'。

ch2以数组形式定义,最后一个元素自动赋值0,即 '\0' 。程序执行时遇到它也可以停止,则ch2也是字符串。

合格的字符串一定是字符数组,合格的字符数组未必是合格的字符串。

(3)计算字符串的长度

#include <string.h> //引入头文件,使用strlen
#include <stdio.h>
int main()
{
	char ch1[] = "abc";
	printf("%d\n",sizeof(ch1));
	printf("%d\n",strlen(ch1));
return 0;
}

代码4.2 计算字符串

可以使用sizeof计算,也可以使用string库里的strlen计算。

图4.2 结果

strlen:用来计算 '\0' 前的字符串长度

sizeof计算了ch1里所有的元素长度,以字节为单位4个元素 * 每个字符型1字节 = 4字节

看看下面的代码:

char ch3[] = {'a', 'b', 'c', '\0'};

用strlen计算是多少呢?

结果是

由此可见 在字符串中  '\0' 有多重要了吧!


4.2转义字符


字符形式功能
\a响铃
\n换行
\r回车
\f换页
\tTab制表符
\b回退一格
\v竖向跳格
\\反斜线字符,可输出  \
\'单引号字符,可输出  '
 \"双引号字符,可输出 "
\0空值
\ddd输出1~3位八进制数所代表的字符,即八进制转换为十进制作为ASCII码,所对应的字符。如:\123
\xdd输出1~2位十六进制数所代表的字符,如:\x123

补充:各个进制转换

详解计算机基础:二进制,八进制,十进制,十六进制之间的互相转换_MuqiuWhite的博客-CSDN博客


五、选择语句


#include <stdio.h>
int main()
{
	int in = 0;
	printf("喜欢编程吗?\n0.不喜欢。1.喜欢\n");
	scanf("%d", &in);
	if (in == 0)
	{
		printf("呜呜~\n");
	}
	else
	{
		printf("加油!\n");
	}
	return 0;
}


六、循环语句


(1)while语句

(2)for语句:循环条件一目了然

(3)do...while语句:先进行一次再判断是否继续循环

//while语句的例子
#include <stdio.h>
int main()
{

	int i = 0;
	printf("一年有多少天应该在认认真真的学习并且收获到知识呢?\n");
	while (i < 366)
	{
		printf("%d天\n", i);
		i++;
	}
	return 0;
}

 上图为输出的结果的一部分,循环便是不断重复,直到达到某个条件。要注意条件的设置,避免出现死循环,减少不必要的循环。


七、函数


#include <stdio.h>
int add(int a, int b)//add函数为自定义求和函数
{
	return a + b;
}
int main()
{
	int a = 2, b = 5;
	int num=add(a, b);
	printf("%d\n", num);
	return 0;
}

程序是由多个函数组成的,函数用来减少减少代码量,重复使用。


八、数组


8.1定义


一组同类型元素的集合,下标从0开始。

数组类型  数组名[内容个数]={内容};

int a[3] = { 1,2,3 };
char b[] = "hello";//这种形式也叫字符串

8.2使用


	int a[3] = { 1,2,3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		printf("%d  ", a[i]);
	}

结果为

 数组的输出要用循环,字符串可以不用。


九、操作符


类型


(1)算术运算符

+      -       *      /      %(用于整数取余)

(2)移位运算符(用于字符/整数)

补码移动。

>>右移(分为逻辑移位和算术移位)    移动几个位置,十进制数就÷几个2

 <<左移  移动几个位置,十进制数就×几个2

(3)位运算符(化为二进制比较)

&按位与:

^按位异或

|按位或

(4)赋值(=左边必须是单个变量)、复合运算符(结合性从右向左)

=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=

(5)单目运算符(结合性从右向左)

逻辑非
~按位取反(二进制位)
+正号
-负号
++自增
--自减
(类型)强制类型转换
*指针运算符(解引用)
&地址与指针运算符(取地址)
sizeof(变量名/数据类型标识符)操作数的类型长度(字节为单位)

(6)关系操作符

<、<=、>=、>

== 是否相等、!= 是否不相等

(7)逻辑运算符

&&逻辑与

||逻辑或

(8)条件运算符(从右往左)

?:

若符合条件则输出冒号左边的,不符合输出右边的。

(9)逗号表达式

a,b,c,……

从左到右依次计算,结果取最右边的。

(10)单体运算符

()圆括号
[ ]下标运算符,操作数为数组名和[ ]里的内容
->指向结构体成员运算符
.结构体成员运算符


十、常见关键字


(1)typedef——类型重命名

unsigned int a = 2;
printf("%d\n", a);

typedef unsigned int ti;
ti b = 3;
printf("%d\n", b);

结果为:

由此可见,typedef将 unsigned int 重命名为ti,二者功能一致。

typedef适用于将繁琐的类型名重命名。比如结构体类型。

(2)static

1.修饰局部变量

a.不随函数结束而消亡

b.只初始化一次

c.保存上一次的值

 2.修饰全局变量

使得该全局变量只能在本源文件中使用。

修饰变量时,若没有初始化,会自动初始化变量为0;

3.修饰函数

使得该函数只能在本源文件中使用。


十一、#define 定义常量和宏


define不是关键字,是编译器实现的,用来定义宏的预处理指令,不是C语言中的内容。   

定义的常量:

#define min 100;

定义的宏:

#define 宏的类型(参数名)(宏体)

#define DEA(x, y) ((x)-(y))
#include <stdio.h>
int main()
{
  int sum = DEA(2, 3);
  printf("sum = %d\n", sum);
  sum = 100*ADD(2, 3);
  printf("sum = %d\n", sum);
  return 0;
}

结果为:实现了减法,可重复利用该代码。


十二、指针


指针就是地址。每个变量都有地址,存放地址的变量叫做指针变量。

  • &取地址 
int a = 3;
printf("%p\n",&a)//取出a的地址并输出
  • *解引用
    int a = 5;
    int* p = &a;
    printf("%d\n",*p);//通过找到p里存放的地址,找到a

    输出结果为 5。

int a = 5;
int* p = &a;//定义一个指针变量p并初始化,赋给p一个地址
*p = 3;//改变*p,也就是a的值
printf("%p\n", &a);

变量a的地址为: 

 注意:int* p = &a; 

类型为int *,变量名为p,能存储的内容为整型单元的地址,p是地址单元。

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

1个16进制位=4个二进制位,一个字节=8个二进制位 。 


十三、结构体


用来描述复杂的类型。

比如描述一个学生,有姓名,性别,年龄等等信息

建立结构体

struct 结构体名 

{

 定义成员变量1;

定义成员变量2;

};

	struct stu//声明结构体类型
	{
		char name[20];
		char sex[20];
		int age[20];
	};

结构体的使用

struct stu a = { "张三","男",100 };//初始化变量a

结构体变量名.成员名 

printf("%s  %s  %d\n", a.name, a.sex, a.age);

结构体指针->成员名

struct stu a = { "张三","男",100 };
struct stu* b = &a;
printf("%s  %s  %d\n", b->name, b->sex, b->age);


C语言的大门已经敞开了,这只是个开始哦。更详细的内容后续会一一搞定。

如有纰漏,请多见谅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值