1 C语言的起源

C语言是在1972年由贝尔实验室的丹尼斯.里奇和肯.汤姆逊在开发UNIX操作系统时设计的。C语言与Unⅸ操作系统关系密切,大部分UNIX内核,以及所有支撑工具和函数库都是用C语言编写的。当然,C语言也不是凭空产生,它是在B语言的基础上进行设计的。C语言是一门通用的计算机编程原因,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。’

2 C语言的特性

高效性:C程序相对紧凑,而且运行速度很快,它具有通常是汇编语言才有的微调控制能力,可以根据具体情况微调程序以提高运行速度或更有效地使用内存。
可移植性:由于C语言与UNIX关系密切,UNIX系统通常会将C编译器作为软件包的一部分。安装Linux时,通常也会安装C编译器。供个人使用的C编译器很多,运行各种版本的Windows和MAC的PC都能够找到合适的C编译器。
强大灵活:UNIX操作系统大部分是用C语言写的,其他语言,如FORTRAN、Perl、Python、LISP、BASIC、Logo等的许多编译器和解释器都是用C语言编写的,同时C语言还可用于解决物理学和工程问题,甚至可用于制作电影的动画特效。

3 第一个C语言程序

#include<stdio.h>
int main()//main函数是程序的入口,一个工程中main函数只有一个
{printf("Hello World\n");return 0;
}

4 基本数据类型

char //字符数据类型
short //短整型
int //整型
long //长整型
long long //更长的整型
float //单精度浮点型
double //双精度浮点型
之所以出现这么多的数据类型,是为了更加丰富地表达生活中的各种值,每种数据类型的大小可通过sizeof操作符计算如下:

#include<stdio.h>
int main()
{printf("%d\n", sizeof(char));//1个字节printf("%d\n", sizeof(short));//2个字节printf("%d\n", sizeof(int));//4个字节printf("%d\n", sizeof(long));//4个字节,理论上long的长度要大于等于intprintf("%d\n", sizeof(long long));//8个字节printf("%d\n", sizeof(float));//4个字节printf("%d\n", sizeof(double));//8个字节return 0;
}

5 变量和常量

在生活中有些值(不单单指数值)是不变的,比如:圆周率,性别,身份证号码,血型等等,这些值在C语言中用常量的概念来表示。
有些值是可变的,比如:年龄,身高,体重,薪资,这些值在C语言中用变量的概念来表示。

5.1定义变量的方法

char ch = 'w';  // 数据类型后跟变量名然后赋相应的值
int weight = 120;
double  price = 88.8;

5.2变量的分类

局部变量
全局变量

#include<stdio.h>
int global = 2019;//全局变量
int main()
{int local = 2018;//局部变量int global = 2020;//局部变量printf("global = %d\n", global);//打印结果为global = 2020return 0;
}

总结:上面的局部变量global的定义虽然与全局变量重名,但实际上是没有问题的!当局部变量与全局变量重名时,局部变量优先使用。

5.3 变量的使用

#include<stdio.h>
int main()
{int num1 = 0;int num2 = 0;int sum = 0;printf("输入两个操作数:>");//输出语句printf,把相应内容打印到屏幕上scanf("%d %d", &num1, &num2);//输入语句scanf,输入相应的值,即为变量num1和num2的值sum = num1 + num2;//将输入的两个值相加并赋值给sumprintf("sum = %d\n", sum);return 0;
}

5.4 变量的作用域和生命周期

作用域:程序设计概念,通常来说,一段程序代码中所用到的名字并不永远是有效的,而限制这个名字的可用性的代码范围就是这个名字的作用域。
1.局部变量的作用域是变量所在的局部范围
2.全局变量的作用域是整个工程
生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段。
1.局部变量生命周期:进入作用域生命周期开始,出作用域生命周期结束。
2.全局变量生命周期:整个程序的生命周期。

5.5常量

C语言中的常量和变量的定义的形式有所差异,C语言中的常量分为一下几种:
1.字面常量
2.const修饰的常量
3.#define定义的标识符常量
4.枚举常量

#include<stdio.h>
enum Sex
{MALE,FEMALE,SECRET
};
//括号中的 MALE,FEMALE,SECRET是枚举常量
int main()
{3.14;//字面常量1000;//字面常量const float pai = 3.14f;//const修饰的常量pai = 5.14;//NO#define MAX 100   //#define的标识符常量return 0;
}

6.字符串+转义字符+注释

6.1字符串

"Hello World.\n"

这种由双引号引起来的一串字符称为字符串面值,或者简称字符串,字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算做字符串的内容。

#include<stdio.h>
int main()
{char arr1[] = "bit";char arr2[] = { 'b','i','t' };char arr3[] = { 'b','i','t','\0' };printf("%s\n", arr1);//打印结果为bitprintf("%s\n", arr2);//打印结果为bit烫烫烫烫蘠itprintf("%s\n", arr3);//打印结果为bitreturn 0;
}
//arr2字符串数组中没有结束标志\0,产生错误结果,可见\0的重要性

6.2转义字符

假如我们想要在屏幕上打印一个目录:c:\code\test.c,我们该如何写代码?

#include<stdio.h>
int main()
{printf("c:\code\test.c");return 0;
}//实际上打印结果是 c:code  est.c

这里就不得不提一下转义字符了。转义字符顾名思义就是转变意义的意思。下面看一些转义字符

#include<stdio.h>
int main()
{printf("%c\n",'\'');//在屏幕上打印  '  ,一个单引号printf("%s\n","\"");//在屏幕上打印  "  ,一个双引号return 0;
}
笔试题:
//程序输出什么?
#include<stdio.h>
int main()
{printf("%d\n", strlen("abcdef"));//6printf("%d\n", strlen("c:\test\328\test.c"));//14//  \32 为转义字符,看做八进制32,两个\t 被看做水平制表符return 0;
}

7 注释

1.代码中有不需要的代码可以直接删除,也可以注释掉
2.代码中有些代码比较难懂,可以加一下注释文字
比如:

#include<stdio.h>
int Add(int x, int y)
{return x + y;
}
/*  C语言注释风格
int Sub(int x, int y)
{return x - y;
}
*/
int main()
{//C++注释风格//int a = 10;//调用Add函数,完成加法printf("%d\n", Add(1, 2));return 0;
}

C语言注释风格:/xxxxxxxxxxx/
缺陷:不能嵌套注释
C++注释风格://xxxxxxxxxx
可以注释一行也可以注释多行

8.选择语句

如果我们好好学习,我们就可以找到一份好工作,走向人生巅峰。不好好学习,我们就会失业,回家卖红薯。这就是选择!

#include<stdio.h>
int main()
{int coding = 0;printf("你会好好学习吗?(选择1 or 0):>");scanf("%d", &coding);if (coding == 1){printf("你会找到好工作\n");}else{printf("失业,回家卖红薯\n");}return 0;
}


我想我们的选择都是一样的!!!

9.循环语句

有些事情,在没有达到目标之前,我们必须不停的做,日复一日,直到达成目标,就像敲代码。

#include<stdio.h>
int main()
{int line = 0;while (line <= 20000){line++;printf("我要继续努力敲代码\n");}//while循环实例,当敲够20000行代码,就可以退出循环if (line > 20000)printf("走向人生巅峰\n");return 0;
}

10.函数

#include<stdio.h>
int main()
{int a = 0;int b = 0;int sum = 0;printf("请输入两个整数:>");scanf("%d %d", &a, &b);sum = a + b;printf("sum = %d\n", sum);return 0;
}//上述代码,写成函数如下#include<stdio.h>
int Add(int x, int y)
{int z = x + y;return z;
}//函数的特点就是简化代码,代码复用
int main()
{int a = 0;int b = 0;int sum = 0;printf("请输入两个整数:>");scanf("%d %d", &a, &b);sum = Add(a,b);printf("sum = %d\n", sum);return 0;
}

11.数组

要存储1-10的数字,怎样存储?C语言中给定了数组的定义:一组相同类型元素的集合

11.1 数组定义

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//定义一个整形数组,最多存放10个元素

11.2 数组的下标

C语言规定,数组的每个元素都有下标,下标是从0开始的,数组可以通过下标来访问。比如:

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//如果数组10个元素,下标的范围是0~9


11.3 数组的使用

#include<stdio.h>
int main()
{int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (i = 0; i < 10; i++){printf("%d ", arr[i]);}//打印素组arr的全部10个元素printf("\n");return 0;
}

12.操作符

这里以简单介绍为主,后续的文章里会详细讲解。
算数操作符:

 +    -     *     /      %

位移操作符:

>>      <<

位操作符:

  &      ^      |

赋值操作符:

=     +=   -=   /=    &=    ^=     |=     >>=    <<=

单目操作符:

!           逻辑反操作符
-          负值
+         正值
&          取地址
sizeof     操作数类型的长度,以字节为单位
~          对一个数的二进制按位取反
--         前置、后置--
++           前置、后置++
*          间接访问操作符(解引用操作符)
(类型)       强制类型转换

关系操作符:

>      判断大于
<      判断小于
>=     断大于等于
<=     判断小于等于
!=     判断不相等
==     判断相等

逻辑操作符:

 &&    逻辑与||    逻辑或

条件操作符:

 exp1 ?exp2 : exp3

逗号表达式:

exp1 ,exp2,exp3,···expN

下标引用、函数调用和结构成员

 []    ()    .    ->

13.常见关键字

auto  break  case  char   const  continue  default  do  double  else   enum   extern
float   goto   if    int   long   register   return   short   signed   sizeof   static
struct  switch  typedef   union   unsigned  void   volatile   while

13.1 关键字typedef

typedef 顾名思义就是类型定义,这里应该理解为类型重命名。比如:

#include<stdio.h>
typedef unsigned int unit_32;
//将unsigned int 重命名为unit_32,所以unit_32也是一个类型名
int main()
{//观察num1和num2,这两个变量的类型是一样的unsigned int num1 = 0;unit_32 num2 = 0;return 0;
}

13.2 关键字static

在C语言中:
static是用来修饰便,变量和函数的,具体有:
1.修饰局部变量-静态局部变量
2.修饰全局变量-静态全局变量
3.修饰函数-静态函数
13.2.1 修饰局部变量

 //代码1
#include<stdio.h>
void test()
{int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for (i = 0; i < 10; i++){test();}return 0;
}//打印1 1 1 1 1 1 1 1 1 1//代码2
#include<stdio.h>
void test()
{static int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for (i = 0; i < 10; i++){test();}return 0;
}//打印1 2 3 4 5 6 7 8 9

对比代码1和代码2的执行效果就可以理解static修饰局部变量的意义。static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
12.2.2 修饰全局变量

//代码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;
}//代码出现连接性错误

结论:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,无法在其他源文件中使用。
12.2.3 修饰全局函数

#include<stdio.h>
//代码1
//add.c
int Add(int x, int y)
{return x + y;
}
//test.c
int main()
{printf("%d\n", Add(2,3));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;
}//代码编译时连接性错误

结论:一个函数被static修饰,使得这个函数只能在本源文件内使用,无法在其他源文件中使用。
剩余关键字在后续文章中会陆续讲解

14. #define定义常量和宏

 #include<stdio.h>
#define MAX 1000
//#define定义标识符常量,就像给MAX贴了个1000的标签
#define ADD(x,y)((x)+(y))
//define定义宏
int main()
{int sum = ADD(2, 3);printf("sum = %d\n", sum);//打印5sum = 10 * ADD(2, 3);printf("sum = %d\n", sum);//打印50return 0;
}

15.指针

15.1内存

内存是电脑中特别重要的存储器,计算机中程序的运行都是在内存中进行的。为了有效地使用内存,我们把内存划分为一个个小的内存单元,每个内存单元的大小为1个字节。为了能够有效地访问到内存的每个单元,就给内存进行了编号,这些编号成为内存的地址。

变量都有地址,取出变量地址的操作如下:

#include<stdio.h>
int main()
{int num = 10;&num;//取出num的地址,num有4个字节,取出的是第一个字节的地址(较小的地址)printf("%p\n", &num);//打印num的地址,%p是以地址的形式打印return 0;
}//结果是010FFD78,当然程序每一次运行都要重新分配


那么地址又是怎样存储的呢?我们需要定义指针变量。

#include<stdio.h>
int main()
{int num = 10;int* p;//p为一个整型指针变量p = &num;return 0;
}

当然p作为一个变量,它也有它的地址。

15.2指针变量的大小

#include<stdio.h>
int main()
{printf("%d\n", sizeof(char *));printf("%d\n", sizeof(short *));printf("%d\n", sizeof(int *));printf("%d\n", sizeof(double *));return 0;
}//打印结果均为4,为32位平台

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

16. 结构体

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

struct Stu
{char name[20];//名字int age;      //年龄char sex[5];  //性别char id[15];  //学号
};

结构体的初始化:

//打印结构体信息
struct Stu s = { "张三",20,"男","202100666" };
// .为结构体成员访问操作符
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);// -> 操作符,通过指针来访问
struct Stu* p = &s;
printf("name = %s age = %d sex = %s id = %s\n", s->name, s->age, s->sex, s->id);

好了,这篇文章就先写到这里,看到这里,想必你对C语言已经有了一个初步的了解,后面的文章里,让我们继续揭开C语言的神秘面纱。

初识C语言,一起迈入编程世界的大门相关推荐

  1. 一起学习C语言:初步进入编程世界(三)

    上一篇<一起学习C语言:初步进入编程世界(二)>中,我们了解了C语言的加法运算方式和赋值运算符的用法,并通过printf函数成功输出计算结果.私下我们可以参考赋值运算表,练习更多的运算符用 ...

  2. 一起学习C语言:初步进入编程世界(一)

    上一篇<一起学习C语言:C语言发展历程以及定制学习计划>中,我们了解了C语言发展历程和C语言适用场景,作者本人按照自己的亲身经历抒写了一种高效的学习方式以及学习目标.从本篇起,作者将从搭建 ...

  3. 哪些语言塑造了今天的编程世界?作为程序员的你知道吗?

    哪些语言塑造了今天的编程世界,作为程序员的你知道吗? 为从繁重的工程计算中脱身,德国工程师康拉德·祖斯(Konrad Zuse)有了制造自动计算机的想法.1938年,他制造出了Z1使用简单却可靠的二元 ...

  4. 《C Primer Plus(第6版)中文版》一第1章 初识C语言1.1 C语言的起源

    本节书摘来自异步社区<C Primer Plus(第6版)中文版>一书中的第1章,第1.1节,作者 傅道坤,更多章节内容可以访问云栖社区"异步社区"公众号查看. 第1章 ...

  5. C语言篇 - (1)初识C语言 - (1)什么是C语言

    C语言篇 - (1)初识C语言 - (1)什么是C语言 简介: 纠正: 什么是C语言 简介: 我是一名初学者,我会以我的角度来展现学习编程的一个过程,每个阶段的对知识点的理解都将写在上面,如果后续对知 ...

  6. C语言初阶_初识C语言(1)

    凡是过往,皆为序章 期末考试结束了,真是感慨良多啊...... C语言编程题大家都做对了多少呢? 不管怎么样,都已经过去了.不管你学得怎么样,都可以在接下来的时间里,我们一起重新回顾一遍C语言初阶的知 ...

  7. c生万物之初识c语言

    c生万物之初识c语言 前言: 1.初学习了c语言,感觉还是很不错的,哈哈~~.下面让我来分享下我目前对c的认识 题外:后面有关于c语言风格培养的<高质量的c-c++编程>PDF版链接,有需 ...

  8. C语言学习——初识C语言(1)

    初识C语言1 一. 初识C语言 1.什么是C语言? 2. 写一个简单的C语言程序 3.main函数 4.数据类型 5.不同数据类型所占内存的大小 5.1不同数据之间的大小转换关系 5.2不同数据类型创 ...

  9. 梦开始的地方----初识c语言(1)

    目录 前言 一.c语言是什么? 二.初识C语言 1.打印hello world 2.数据类型 3.常量与变量 三.结束语 前言 Hello!!!我又来了,从今天开始就要从头开始学习c语言了,想要一块学 ...

最新文章

  1. 文件控制 fcntl函数具体解释
  2. redis中的hash
  3. 芯灵思Sinlinx A64开发板 Linux内核等待队列p
  4. redis常用配置项
  5. iOS 删除、重新排序xcdatamodel
  6. MPP 二、Greenplum数据加载
  7. ant target间的dependency
  8. SQL Server数据库指标
  9. C语言库函数大全及应用实例三
  10. Linux资源监控工具
  11. [转载] python 时间sleep() 的方法
  12. SPSS软件做方差分析
  13. testbed笔记:头文件里的函数
  14. 【零售知识】供应商结算
  15. ASP.NET农历时间显示(两)
  16. 南昌大学计算机学院夏令营,“优秀大学生暑期夏令营”参营营员名单公示
  17. VR中的9轴传感器(重力加速度/陀螺仪/磁力计)
  18. JOHNSON TROTTER 的全排列算法
  19. finder刷新文件夹_如何在OS X Finder中自定义文件夹视图
  20. mixamo动画批量添加根骨骼与将动作处理成原地动作(blender)

热门文章

  1. 程序员眼中的漫威!太有才了!
  2. 前向纠错FEC纠错编码原理
  3. 《结对-爬取大麦网演唱会信息-设计文档》
  4. 为什么我要选择使用 Yarn 来做 Docker 的调度引擎
  5. .Dragon4444勒索病毒处理成功方法
  6. 计算机专业海报排版设计,我研究了2000张大神海报,终于总结出这个排版技巧...
  7. python中gzip库用法详解(压缩和解压缩)
  8. pdf文件怎么转化为word,pdf转换成word的方法
  9. Jenkins用户密码重置
  10. 学而优则仕:中国古代政治原生态(转自 百度 读书吧)