C语言学习基础知识分享

目录
  • 写在前面
  • 为何学习C语言
    • 语言层面
    • 个人层面
  • 初识C语言
    • 什么是语言
    • 标准
    • helloword
    • main
    • printf
  • 数据类型
    • byte & bit
    • sizeof
  • 常量
    • 常量分类
  • 变量
    • 定义变量
    • 变量的分类
      • 局部变量
      • 全局变量
      • 局部优先
    • 变量的使用
      • printf
      • scanf
  • 作用域&生命周期

写在前面

我们正式开始接触到C语言,这是我在学习过C语言后重新写的博客,我把之前的稍微优化了一下,希望能用更加朴素的语言和大家分享,我希望给大家带来一个可以看的懂,理论和实践并行的内容.当然里面也会存在一些错误和不恰当的地方,还请诸位指正.

为何学习C语言

我想从两个方面和大家分析学习C语言的必要性和好处.

语言层面

我们先来下一个结论 C生万物,编程之本, 很多人学习计算机都是从C语言开始的,它是长远IT职业发展的首选,C语言是母体语言,是人机交互接近底层的桥梁 ,学会 C语言,相当于掌握技术核心 . IT行业,一般每10年就有一次变革,40年间,在 TIOBE 排行榜中,C/C++位置长期霸占前三名,没有丝毫撼动,可谓经典永不过时!

个人层面

在当今社会,技术不断的发展和更新,语言更是层出不穷的出现,C\++、Java、、python、go.语言实在是太多了,那么我们为何还要学一门很老的语言,我们学习最新的语言不是可以更好的适应当前技术的迭代吗?

每个人都有每个人的理解,首先我来说一下自己的观点.和大多数人一样,我接触的第一门语言就是C语言,那时的我感觉内容多,而且还很难理解,尤其是后面的指针一直在困扰着我,但是当我在后面逐渐学习的其他语言后,C语言的很多理念出现在其中,尤其是一脉相承的C\++.C语言的学习可以大大提高我们学习其他语言的能力.

初识C语言

我想分为两个博客的内容和大家整体的过一下C语言的基本知识,这样我们看别人的代码可以看的懂.我认为大家对他有一个认识是非常重要的,这样即使我们深度不够,也有往下探究的欲望.

什么是语言

在现实生活中我们可以很容易的知道人与人交流是通过语言来进行交流的, 人和人可以用汉语,英语,俄语...进行交流,那么人和计算机呢?或者说计算机和计算机是通过什么语言交流的?这就是计算机语言. C语言是常见的一种计算机语言,每一个语言都有自己的优点,也有自己的缺点,C语言同样如此,相比较于其他的语言,C语言更加适合底层开发, 注意C语言是适合底层开发,不意味着只能干,我们也可以使用C语言做上层的业务.

标准

什么事物要想发展要好,必须要有标准.那么什么是标准,在早期我们是通过二进制编程的,,很多人要查手册,这里很难,所以那个时候一般研究这些的都是都是科学家.此时有很多科学家觉得我们使用二进制是在是太麻烦了,受不了了,我们给二进制序列起一个名字,例如张三和身份正好对应,我们把这些名字称之为助记符,后面又发展成汇编语言,B语言,C语言和后面的很多语言.

C语言很优秀,很多厂商会对C语言进行定制,自己增加自己的语法,这个时候就出现了差异,这就是杂乱尺寸生,此时又权威的一些人提出了国际标准,也就是K&R标准,这就是标准.后来标准进行迭代,逐渐的迭代出其他的版本,例如流行的C89标准,和后面的C90,C99.主流标准是C89和C90,C99之后都比较少一些,我们主要看C89的知识点.

helloword

我们来认识第一个代码,这是我们几乎每一个程序员都写过的代码.

#include <stdio.h>
int main()
{
  printf("hello,world\n");
  return 0;
}

main

如果你已经尝试了上面的代码,觉得既新奇又饱含疑惑,那么下面我们先来简单的揭开它的面纱.注意,我们找个博客的目的是可以简单的上手C语言,会用就可以了,至于它的原理随着我们学习的深入,我们都会逐渐明白的,所以说不要着急.

<font color = red>我们规定main函数是程序的入口</font>,注意,这里标准直接这样规定的,也就是说我们启动一个程序时,编译器会自动的找到main函数,然后从上往下的开始执行里面的代码.

我们这里需要看一下main函数的大体框架,后面我们要严格按照这个格式来写,至于为什么这里都等到函数那里去谈.

int main()
{
    // 代码
    return 0;
}

在一些比较老的代码规范里面,还存在下面的写法,这里我们强烈不推荐.,他们实在是太老了,而且看着还很别扭.

void main()
{

}

printf

我们从main入口进入了,现在我们开始在想,我们程序的目的是往屏幕上打印Hello World,所以我们调用了一个函数,函数相关的细节我们会单独分享.这个时候我告诉你在标准库里面有一个printf函数可以帮助我们完成这个功能,我们要用这个函数,这里需要引一个头文件stdio.h,我们通过下面的做法来达到这个目的.

#include <stdio.h>

到这里解决我们大部分疑惑,也可以简单的上手写一些代码了.

#include <stdio.h>
int main()
{
  printf("我是C语言的初学者");
  return 0;
}

数据类型

我们都知道,我们可以从不同的角度来描述一个物体,假如说这有一个箱子,我们可以这样描述.

这里你会发现有不同的数据类型,存在整数和小数,甚至名字是一串字符.我们计算机要模拟世界,那么肯定要提供这些类型,C语言就给我们内置了很多的数据类型,我们先来见识一下.


数据类型


说明


大小


char


字符类型


1 字节


short


短整型


2 字节


int


整型


4 字节


long


长整型


4 字节


long long


更长的整形


8 字节


float


单精度浮点数


4 字节


double


双精度浮点数


8 字节

回答一下下面的问题:

为什么要定义这么多类型?

我们的应用场景是非常复杂的,不同应用场景要求不同大小的空间,比如说,一个人的年龄、身高等变量可以定义成short型,定义成 int型就浪费了空间。

这些类型的大小是什么意思?

根据不同的类型在内存中开辟不同大小的一块空间,每个类型开辟的空间是固定的,至于如何计算,这个我们下面谈

byte & bit

在回答不同类型占据的空间前我们先来看一下计算机里面的一些单位.这里我们用一个宿舍楼来进行举例子.在一所高校中,我们把一栋宿舍楼分成很多个小宿舍,每一个小宿舍都有固定的床位.计算机同样如此,在计算机中,一块很大的内存,我们把他分成很多个小空间,这个空间名字叫做字节(byte),这里我们首先要强调的是字节是内存的基本单位.和每个小宿舍有这个固定床位一样,每一个字节又会被分为八个区域,这个区域叫做比特位(bit),也就是一字节等于八个比特位.

sizeof

上面回答了内存的基本单位,这里就理解不同的数据类型占据若干的字节是什么意思了.这个时候我们又在想,我们是不是可以验证一下,你在这里一直给我灌输理论,总是感觉有点不踏实.这里我们就要请出sizeof这个关键字.我们先来解释一下什么是关键字.

我这里直接说我的理解,所谓的关键字是C语言官方给我们提供的,这些关键字有着不同的功能,比如说上面的int,我们可以很清楚的知道int代表的是一个整型.sizeof也是一个关键字,它的作用是计算占据内存空间的大小,单位就是字节.后面我们会遇到很多关键字,我们用一个谈一个.现在开始验证一下这些类型的大小,你会发现printf又出现了新的用法,这个后面会谈到,先暂时这样用着.

#include <stdio.h>
int main()
{
  printf("char       %d\n", sizeof(char));
  printf("short      %d\n", sizeof(short));
  printf("int        %d\n", sizeof(int));
  printf("long int   %d\n", sizeof(long int));
  printf("long long  %d\n", sizeof(long long));
  printf("float      %d\n", sizeof(float));
  printf("double     %d\n", sizeof(double));
  system("pause");
  return 0;
}

常量

生活中的有些值是不变的(比如:圆周率,性别(?),身份证号码,血型等等),有些值是可变的(比如:年龄,体重,薪资)。 在C语言中,我们会学习到变量,常量,作用域,生命周期......等概念,我们不由得发出疑问,什么是变量,为什么要有变量?这些都是我们需要处理得疑惑.我先谈谈常量,后面再说说变量。所谓的常量就是不可再次修改的数据.它有下面的几种分类.

数值常量 1,2,3...字符串常量 "abcd","defcbg"

这里面我重点谈谈字符串常量,在C语言中,存在一个字符串常量池,这个我们等到操作系统再谈,像"abcd"就是其中的一部分,要是我们想要修改"abcd"变为"bbcd",这是做不到的,有的人可能会感到疑惑,这不是很简单吗,我们只需要把a修改成b不就完成了吗?但是这只是象,"bbcd"也是字符串常量池的一部分,我们所谓的修改,就是更改指针所指向的地址(指针后面谈).

#include <stdio.h>

int main()
{
  char* pa = "abcd";
  printf("%p\n", pa);

  pa = "bbcd";
  printf("%p\n", pa);
  return 0;
}

常量分类

上面的太笼统 这类简单的说一下,在C语言中我们将学习不同的常量.

字面常量 就是字符const 修饰的常变量枚举 后面谈#define 定义得的标识符常量

注意:const是一个关键字,这个关键字作用是很大的,我们后面会重点分析.

变量

简单得来说,变量就是可以修改得量.变量不同于常量,它可以被修改的\.例如int x = 10,x可以修改为20,但是我们不能把常量1修改成常量2.这就是变量定义.<font color = red>在计算机中,变量是一个在内存中开辟特定大小的空间,用来保存数据. </font>

定义变量

这倒是很简单,就是<font color = blue>类型 变量名 = 初始化的值</font>.这里我们需要谈一下什么是变量名,前面我们描述箱子的时候,谈到了长度,我们用L表示,此时这里就可以认为L就是一个变量.

int a = 10;          // 定义一个整型变量a  并初始化为 10
double b = 10.2;     // 定义一个双精度浮点数变量b  并初始化为 10

变量的分类

变量的分类主要分为两大类,我们尽量不要使用全局变量.

  • 全局变量
  • 局部变量

局部变量

局部变量:包含在代码块中的变量叫做局部变量。局部变量具有临时性。进入代码块,自动形成局部变量,退出代码块自动释放.(网上很多说函数中的变量是局部变量,不能说错,但说法是不准确的),下面的a和d都是局部变量.

int main()
{
  int a = 10;
  double d = 11.01;
  return 0;
}

这里来个复杂的,这里就可以验证一下局部变量具有临时性,这里的临时性可以认为对标下面的作用域和生命周期.

#include <stdio.h>

int main()
{
  int a = 10;
  {
    int x = 20;
    printf("x = %d\n", x);
  } return 0;
}

这里的临时性就可以通过下面的代码验证出来

#include <stdio.h>

int main()
{
  int a = 10;
  {
    int x = 20;
    printf("x = %d\n", x);
  }
  printf("x = %d\n", x);

  return 0;
}

局部变量如果不进行初始化,那么根据编译器的不同,我们拿到的是随机值,甚至严格的编译器都不会让我们使用.

我们在测试一下gcc编译器,这里看看有什么不同.看来gcc是没有VS严格的,但是我们要按照最标准的来,严格遵守变量被定义一定要初始化.

全局变量

这里我想和大家谈谈全局变量,这个有一点重要.所谓的全局变量,全局变量具有全局性 , 我们可以认为是在main函数外边所定义的变量,一般按照<font color = bluee>g_变量名</font>的格式来走,当然,也可以不按.

#include <stdio.h>

int g_key = 20;        //全局变量
double g_val = 10.00;

int main()
{

  printf("%d\n", g_key);
  printf("%d\n", g_val);
  return 0;
}

上面我们谈到了局部变量不进行初识化是随机值,那么全局变量呢?这是很简单的,我们直接给一个结论,全局变量定义起来即使我们不初始化,他也是固定值,是0.这里只验证VS.

int a;
int main()
{
  printf("%d\n", a);
  return 0;
}

注意,如果你坚持看我后面写的博客,就会发现我们很少使用全局变量,它是有一定的缺陷的,等到后面我们会专门谈的.

局部优先

大家看一下下面的代码.<font color = red>如果全局变量和局部变量同名,编译器优先使用局部变量,这就是局部优先原则.</font>

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

变量的使用

我们先来简单色的通过格式化输入输出来分析一下变量是如何被我门使用的,这些都是很简单的.

printf

这里我们需要再次谈一下printf函数,上面我们已经使用过它的用法了,可能大家会有一些疑惑,这里需要具体的分析一下这个函数.

printf()函数是我们经常使用的的函数之一,他的作用就是将我们想要的数据输出到指定位置,这里的指定位置包含屏幕,我们先使用一下

#include <stdio.h>

int main()
{
  int a = 10;
  printf("%d\n", a);
  return 0;
}

这里我们可以看到,我们使用了printf()函数

printf("%d\n",a);

这里有几点要说一下

% 被称为 "转换说明",所谓的转换说明就是将数据按指定的格式显式出来%d是指将a的值以十进制的形式打印来,例如 %o :打印八进制、%x 打印十六进制.....

数据输出的格式与很多,下面我列出一张表


X


例子


说明


d


%d


打印int型,默认1


f


%f


打印float型,小数点后默认6位


e


%e


以科学计数法的形式打印,小数点后默认6位


g


%g


以科学计数法或者float型打印,方式看g的大小选择

scanf

我们在想既然变量是可以变化的,我们总不能把先要的值全部列出来吧,我们如果手动输入该如何做到呢?这里给大家简绍一个scanf函数.

和printf() 一样,scanf()也是存在特定的格式读入,这里先给出个例子,我们一起来看看

#include <stdio.h>

int main()
{
  int a = 0;
  scanf("%d", &a);
  printf("%d\n", a);
  return 0;
}

作用域&生命周期

这个一直是一个比较容易模糊的点,有很多人对他们的区别可能分不太清楚,一般我们能分辨清楚就可以了

作用域 变量可以被使用的地方,就是作用域生命周期 变量开始开辟空间 到 空间销毁

这里我先给出点结论,适合大部分情况.局部变量的作用域和生命周期是在局部变量所在的代码块中,除了代码块就不可以了.全局变量的作用域和生命周期是整个程序.

到此这篇关于C语言学习基础知识分享的文章就介绍到这了,更多相关C语言基础内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言基础知识分享续篇

    目录 写在前面 数组 数组使用 函数 字符串 strlen && sizeof sizeof strlen 转义字符 操作符 选择语句 if else switch 循环语句 for while do while 跳出语句 contine break 指针 自定义类型 struct 写在前面 好了,现在我们开始C语言的第二个部分.今天我们需要看下面几个知识点,都是非常简单的,我们主要认识一下. 数组 我们知道一个一个属性可以用一个类型去表示,那么我想问的是如果是一个属性的多个呢?也就是多个

  • C语言菜鸟基础教程之自定义函数

    先动手编写程序: #include <stdio.h> int add(int x, int y) { int z = x + y; return z; } int main() { int a = 1; int b = 2; int c = add(a, b); printf("c = %d\n", c); return 0; } 运行结果: c = 3 程序分析: (1) 函数定义的形式为: 类型 函数名称(类型 形式参数,--) { 函数体 } (2) 对应于咱们的程

  • C语言菜鸟基础教程之加法

    先动手编写程序: #include <stdio.h> int main() { int a = 1; int b = 2; int c = a + b; printf("sum is %d\n", c); return 0; } 运行结果: sum is 3 程序分析: 先定义一个整型变量a,把1赋值给a. 再定义一个整型变量b,把2赋值给b. 最后定义一个整型变量c,它的值不是靠赋值得到的,而是把a和b相加之后的值赋值给它,即c的值为3.

  • C语言菜鸟基础教程之单精度浮点数与双精度浮点数

    上节课 简单介绍了浮点数.计算机程序中的浮点数分为单精度浮点数和双精度浮点数. 单精度和双精度精确的范围不一样. 计算机里的最基本的存储单位用位(bit)来表示.bit只能用来存储0或1. 稍大一点的单位是字节(Byte,简写为B). 再大一级的是千字节(kilo Bytes),用k来表示. 再大一级的单位是兆字节(Mega Bytes),用M来表示.一张照片的大小通常为1~3M. 再大一级的单位为G.一部高清电影的大小通常为1~2G. 再大一级的单位为T. 换算关系为: 1B = 8bit 1

  • C语言菜鸟基础教程之求1到100的和

    题目:求1+2+3+--+98+99+100 (1)用数学方法求解 (2)编写C语言程序求解 解: (1)数学方法 S = 1+2+3+--+98+99+100 = (1+100) + (2+99) + (3+98) + -- + (49+52) + (50+51) = 101 * 50 = 5050 (2)C语言编程 #include <stdio.h> int main() { int sum = 0; // 赋初值 for(int i = 1; i <= 100; i++) { s

  • C语言 map函数的基础用法详解

    目录 map map具体操作 总结 map 有N个学生的姓名name和学号ID,要求给你一个学生的name求查找他的ID. 简单做法是定义 string name [ N ] 和 int ID[ N ] 存储信息,然后在name [ ] 中查找这个学生,找到后输出他的ID.但是这样的缺点是需要查找所有的name [ N ],时间复杂度是O( N ),效率低下. 利用 STL 中 map容器 可以快速实现查找,复杂度是O( log 2 N ). map是关联容器,它实现从键(key)到值(valu

  • C语言基础使用IDE快速开发的方法

    这篇文章介绍一下如何使用CLion进行C语言的开发与调试. CLion CLion是Jeb Brain出品的一款跨平台的C/C++的集成开发环境IDE. 详细介绍: https://www.jetbrains.com/zh-cn/clion/ 下载地址: https://www.jetbrains.com/zh-cn/clion/download/ 官方提供了30天试用的方式,可根据需要进行下载使用. 安装与设定 首先选择缺省主题 然后选择缺省插件 习惯使用vim方式的可以通过点击对应的Inst

  • c语言 树的基础知识(必看篇)

    第一.树的定义: 1.有且只有一个称为根的节点 2.有若干个互不相交的子树,这些子树本身也是一颗树 第二.专业术语: 树的深度:从根节点到最低层,节点的层数 ,称之为树的深度.  根节点是第一层 结点的层次:根节点为第一层,根节点的子节点为第2层,以此类推 叶子节点:没有子节点的节点 非终端节点:实际就是非叶子节点 结点度: 子节点的个数称为度树的度 第三.树的分类 一般树:任意一个节点的子节点的个数不受限制 二叉树:任意一个节点的子节点最多2个,且子节点的位置不可更改 满二叉树:在不增加层数的

  • C语言菜鸟基础教程之Hello World

    首先,需要一款C语言的编译器,可以使用在线编译器,也可以在本地安装编译器,比如Mac电脑可以安装Xcode,PC可以安装Dev C++. 编写第一个程序:Hello World! #include <stdio.h> int main() { /* 我的第一个 C 程序 */ printf("Hello, World! \n"); return 0; } 运行结果: Hello, World! 程序分析: (1) 这里stdio.h是一个头文件.代表stantard inp

  • 易语言编程基础知识

    创建一个易应用程序只需要短短几分钟的时间 - 通过在设计窗口上"绘制"诸如编辑框和按钮等组件来创建用户界面.然后,为窗口和组件设置属性以规定诸如标题.位置.尺寸等的值.最后,编写处理程序将生命真正赋于程序. 组件及事件驱动 组件及其事件驱动是使用易语言在 Windows 环境下编程的基础知识.所谓"组件",即用作组成用户图形界面的基本成员,譬如:窗口.编辑框.图片框等等.组件按可否容纳其它组件划分为容器类和非容器类.按运行时是否可能具有可视外形划分为界面类和功能类.

  • C语言指针基础知识实例讲解

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到,内存区每一个字节都有一个编号,地址也可以形象的理解成我们生活中的住址,通过住址找到每一个人所在的地方.指针作为一个变量用来存放地址,可以通过指针来改动变量. 上图就是一个简单的定义一个一级指针变量和利用指针改变变量数值的过程.int*表示整型指针,*p表示解引用操作,就是利用指针找到a的地址然后再改

  • 新手学习PHP的一些基础知识分享

    一,PHP脚本代码标记 PHP的脚本是文件中一对特殊标记所包括的内容,如ASP是"<%....%>",PHP可看成是"<?...?>". 然而为了适应XML标准以将PHP嵌入到XML或XHTML中,PHP不建议使用短格式的"<?...?>",而建议使用长格式标记"<?php...?>" 此外PHP代码块还支持 <script language="php"

  • C语言操作符基础知识详解

    目录 一.单目操作符: 二.关系操作符 三.条件操作符 四.逗号表达式 五.逻辑操作符 总结 一.单目操作符: !:逻辑反操作符: -:负数操作符: +:整数操作符: &:取地址操作符: sizeof:操作数的类型长度操作符: sizeof(数组名)--数组名表示整个数组,sizeof(数组名)求的是整个数组的大小,单位是字节 例如: int a[10] = { 0 }; printf("%d\n",sizeof(a)); suzeof(a[0]);-->(4) 不同的表

  • javascript基础知识分享之类与函数化

    1.对象适合于收集和管理数据,容易形成树型结构. Javascript包括一个原型链特性,允许对象继承另一对象的属性.正确的使用它能减少对象的初始化时间和内存消耗. 2.函数它们是javascript的基础模块单元,用于代码复用.信息隐藏和组合调用.函数用于指定对象的行为.一般来说,编程就是将一组需求分解成一组函数和数据结构的技能. 3.模块我们可以使用函数和闭包来构造模块.模块是一个提供接口却隐藏实现状态和实现的函数或对象. 1.自定义类型--构造函数模式(伪类模式) 在基于类的系统中,对象是

  • 使用ARM汇编破解iOS程序基础知识分享

    一.Thumb指令与ARM指令 Thumb指令为16位,因此存储代码的密度高,节省存储空间.但是功能不全,它只是ARM指令(32位)集的补充,是ARM指令集下的一个子集.在初级阶段我们不需要了解这些知识,只要有个概念知道有这么个东西就可以. 二.ARM的寄存器初步了解 R0-R3: 用于函数参数及返回值的传递,超过4个参数,其它参数存在栈中,在ARM中栈是向下生长的,R0还可以作为返回值. R4-R6, R8,R10-R11: 没有特殊规定,就是普通的通用寄存器 R7: 栈帧指针,指向母函数与被

  • jQuery学习基础知识小结

    jQuery学习笔记: jQuery学习 1.基本语法: $(selector).action() $:定义jQuery selector:选择符,查询和查找HTML元素 action():对元素执行的操作 实例: $(this).hide()------隐藏当前元素 $("p"),hide()-------隐藏所有的p元素 $("#ID").hide()-----隐藏id=ID的元素 $("p.Class")--------隐藏class=Cl

  • C语言操作符基础知识图文详解

    目录 1.算术操作符 + - * / % 2.移位操作符 >> (右移操作符) <<(左移操作符) 左移操作符:<< 右移操作符:>> 3.位操作符 3.1 & 按位与 3.2 | 按位或 3.3 ^ 按位异或 3.4 ~ 按位取反 4.赋值操作符 = 5.逻辑操作符 5.1 ! 非 5.2 && 与 5.3 || 或 6.条件运算符 ? 7.单目操作符 7.1 ! 7.2 + 正值 7.3 - 负值 7.4 & 取地址 7.

  • R语言学习Rcpp基础知识全面整理

    目录 1. 相关配置和说明 2. 常用数据类型 3. 常用数据类型的建立 4. 常用数据类型元素访问 5. 成员函数 6. 语法糖 6.1 算术和逻辑运算符 6.2. 常用函数 7. STL 7.1. 迭代器 7.2. 算法 7.3. 数据结构 7.3.1. Vectors 7.3.2. Sets 7.3.3. Maps 8. 与R环境的互动 9. 用Rcpp创建R包 10. 输入和输出示例 如何传递数组 通过.attr("dim")设置维数 函数返回一维STL vector 函数返回

随机推荐