C语言程序立地成佛

这里写目录标题

  • C语言程序立地成佛
    • 前言
    • 1、初识计算机程序
    • 2、计算机语言
    • 3、初识C语言
      • 编写一个代码
      • 数据类型
      • 常量与变量
        • 常量:
        • 变量:
        • 全局变量与局部变量
          • 全局变量:
          • 局部变量:
      • 运算符
      • 字符串
        • strlen()函数
      • 关键字
      • define定义常量和宏
      • 数组
        • 数组的引用
        • 数组的初始化
      • 函数
        • 什么是函数
        • 自定义函数
      • ==指针==
        • 指针是什么?
        • 指针变量
        • 指针类型
        • 指针的解引用
        • 指针的访问
          • 直接访问
          • 间接访问
    • 后记

前言

-----对于一个计算机正在学习的小白。不管是从认知层面还是专业知识,都是匮乏的,但热情十足是真的。想通过一些分享心得和交流与同是刚进入学习的小白们一起进步,同是也希望大佬能提出一点建设性意见。文末附新手常见常见错误,都是我通过平时学习得到的经验。

1、初识计算机程序

----- 以前以为计算机无所不能,玩游戏,办公,NB的搜索引擎······总觉得神秘莫测。但才开始学习我就发现这是一个误解。其实,计算机的每一个操作都是根据人们事先指定的指令进行的。例如你觉得很简单的1+1,换算的电脑上就需要一条指令来执行加法,用另一条指令将计算机的运行结果输出到显示屏。但这一条难度比“1+1”复杂的指令,却能让更加复杂的运算变的更快。
所谓程序,无外乎就是一组计算机能识别的和执行指令的指令,计算机的一切操作离不开程序,离开程序,计算机将一事无成。所以计算机的本质就是一台会运算的机器,程序是计算机能改变世界的最底层的概念。

2、计算机语言

-----人与人之间交流需要语言,而人机交互之间也需要一种语言让计算机懂得人们的指令。机器语言:计算机的工作基于二进制,从根本上来讲,计算机只能识别“1”,“0”组成的指令。而这种能让计算机直接识别和接受的二进制代码被称作机器指令,它的集合就是该计算机的机器语言
-----而我们现在需要学习的就是高级语言,它很接近人们的习惯使用的自然语言和数学语言,所具有的特点:

  1. 高级语言的数据结构要比汇编和机器语言丰富;
  2. 高级语言与具体机器结构的关联没有汇编以及机器语言密切;
  3. 高级语言更接近自然语言更容易掌握;
  4. 高级语言编写的程序要经过编译或解释计算机才能执行;

3、初识C语言

-----C语言是一种通用的计算机编程语言,被广泛应用于底层开发。C语言的设计目标是提供一种简单易行的编译方式,处理低级存储,产生少量的机器代码并且不需要任何操作环境支持就可以运行的编程语言。

-----那如何开始写C语言代码

下面利用vs2019:

编写一个代码


int main()
{return 0;
}

-----对于一个程序,需要有程序入口和出口。

#include<stdio.h>
int main()
{printf("hello word");
return 0;
}

1.写出主函数(main函数):如何执行呢?-C语言是从主函数第一行开始,所以C语言代码得有main函数–入口
2.写个代码,在屏幕上打印:“hello word”:对于printf-为库函数-在系统上打印信息的-对于它的使用,得打声招呼(引用头文件 stdio.h)。到后面不难看出,每一个库函数对应的头文件可能不同,那么了解到一个库函数的使用,就得知道头文件类型。如何查询可以下载"MSDN”,利用查询的方式查找,页面为英文,基础差的可以利用有道词典的截图翻译。
3.编译+链接+运行代码。
使用快捷键1.cyrl+F5
2.Fn+ctrl+F5
3.菜单中:【调试】->【开始执行】
一个工程中,有且仅有一个main函数

一个工程可以有多个.c文件

但是多个.c文件中只能有一个main函数

至此你已经可以开始新世界的大门了!

数据类型

-----用计算机语言写程序解决生活问题,必须能够描述生活中所遇到的问题。比如对于一个人的年龄age=24岁,而一件商品的价格可能是24.6。那么描述一个数据?
C语言描述小数——符点数,C语言描述整数——整形。
所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式
不同的类型分配不同的长度和存储类型。
说明:
C语言没有具体规定部分类型数据所占存储单元格的长度,这是由于各编译系统自行决定的。C语言标准只要求long型数据长度不短于int类型,short类型不长于int类型。
即 sizeof(short)<=(int)<=(long)<=(long long)

常量与变量

作为数据的两种表现形式。

常量:

在程序运行过程中,其值不能被改变的量。其数值就是数学中的常数
(1)整形常量。如:100,123,0,-12
(2)实型常量。一种是十进制小数形式。如123.23,0.23,-67.23.
另一种是指数形式。如12.34e3代表(12.34*10三次方)
(3)字符常量。一种是普通字符,用单撇号(‘’)括起来的一个字符(字符常量在计算机中是以ASCII代码存放在计算机存储单元中,并不是储存字符本身)。

转义字符:以字符“\”开头的字符序列

(4)字符串常量:用(“”)括起来的字符串
(5)符号常量。用#define指令,指定一个符号代表一个常量

#define PI 3.1416 //行末无分号

变量:

-----与常量相对;变量必须先定义后使用。
常变量:C99允许使用常变量,方法是在定义变量前加入关键字const

const int a=3   //变量期间值不能改变。相比常量多了名字,能在程序中加以引用。

具有常量的常属性,但本质上是变量,因此叫常变量。

全局变量与局部变量

全局变量:

{ }外部定义的变量

局部变量:

{ }内部定义的变量

名字内外冲突情况下讲究局部优先原则
但一般情况下不建议将全局变量和局部变量名字相同

运算符

下面用一个表格来介绍整个C语言所用的

先通过一段简单的加减代码了解一下

#include<stdio>  //引用头文件(编译预处理指令)
int main()  //定义主函数
{     //函数起始标志
int a = 0;
int b = 0;
int sum = 0; //定义变量名
scanf("%d %d",&a,&b);   //输入值
sum = a + b;     //运算符运算
printf("%d\n",sum);   //输出结果
return 0;  //函数执行完返回值
}  //程序结束标志

对于scanf在VS中会出现的报错情况:在代码第一行插入

字符串

-----C语言中,字符串作为字符数组来处理。而字符串的实际长度如何测量:字符串中“\0”
前有几个字符有效字符就有多少,也就是是说在遇到“\0”就代表一个字符串结束。

-----在程序中如何来测量字符串的多少:

strlen()函数

用来测量\0前的字符个数

#include<string.h>
#include<stdio.h>
int main()
{int arr1[]="abc";
int arr2[]={'a','b','c'};
printf("%d\n",strlen(arr1));
printf("%d\n",strlrn(arr2));
return 0;
}

当你运行代码时

这里的[arr2]是一个随机值。
那么为何是一个随机值呢?
答案很简单strlen() 结束标志是\0;
而当打印字符串的时候默认字符串尾部\0
而当打印当个字符的时候是默认不存在\0的,什么时候到\0全凭电脑心情,与你无瓜。

关键字


define是不是关键字?no–是预处理指令
include是不是关键字?no–是预处理指令
auto–自动的 extern–声明外部符号 registere–寄存器关键词
signed–有符号的 unsigned–无符号的 static–静态的
union–联合体(共用体) void–无-空 typedef–类型重定义

这里主要讲一下static:static修饰全局变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型)

使用extern可以声明外部符号,就能实现在另一个源文件之中的调用

这幅图可以直观展示static修饰全局变量的意义
这里其他不做细探讨,因为新手入门目前接触较少,感兴趣可以查阅。

define定义常量和宏

可以理解为指定一个标识符定义为一个常量

//define定义标识符常量
#define MAX 1000
//define定义宏
#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; }

数组

数组:有序数据的集合,用数组名标识

数组的引用

1、数组必须先定义,后使用。
2、只能逐个引用数组元素,不能一次引用整个数组。
3、数组元素表示形式: 数组名[下标] ,下标可以是常量或整型表达式

数组的应用通过下标来访问,这个时候用到的操作符[]

#include<stdio.h>
int main()
{int arr[4]={1,2,3,4}
return 0;
}

arr[0]=1
arr[1]=2
arr[2]=3
arr[3]=4
数组的访问是从下标0开始。

数组的初始化

1、数组不初始化,其元素值为随机数。
2、数组可以部分初识化,未初始化部分默认为0。

#include<stdio.h>
int main()
{int arr[4]={1,2}
return 0;
}

3、数组在初始化固定数据时可以不先规定数组长度

#include<stdio.h>
int main()
{int arr[]={1,2,3,4}
return 0;
}

函数

什么是函数

在c语言中,你可以理解为一个工厂,用来完成原料到商品的加工。

int MAX(x,y)
{int max = 0;if(x>y){max=x;}else max=y;return max;
}

这就完成了一个简单的函数,那么为什么要完成这样一个看似复杂,费力不讨好的事情呢?

1、完成程序功能的封装,对于一个主函数,如果全部在主函数完成所有程序功能的开发,在后续的测试,修改,优化都可能引起程序的崩溃,那么我们就可以使用上述所说的。将主函数想象成大公司,负责运行,函数完成工厂的加工任务,哪里有问题,随时可以溯源查寻。
2、可以将功能重复使用,在不同的环境之下,可以随时方便的调用已经创建的函数,这个时候就不得不提c语言自带的库函数。

我们使用的scanf(),printf()``````都是c语言支持封装好的库函数,想象一下为什么我们现在写代码能越来越方便,离不开这些基础功能的封装。

注:但是库函数的使用必须包含对应的头文件

自定义函数

虽然有不少库函数了,当时功能是多样且变化的,这也是我们敲代码的意义所在

函数的组成:

int MAX(int x,int y)
{int max = 0;if(x>y){max=x;}else max=y;return max;
}

那么函数如何使用?
首先是声明。证明你有这样一个函数。

程序在执行的时候是一步一步往下走的,下面这张图则是教科书上的写法,我们调用一个函数时,要有函数的声明,可如果函数写在了main函数的上方,则不余需要声明了。

再传参数,将你要加工的原材料传递给工厂。

#include<stdio.h>
int MAX(int x,int y);//函数的声明
int main()
{int a = 0;
int b = 0;
scanf("%d %d",&a,&b);
int max=0;
max=MAX(a,b);  //调用函数
return 0;
}
int MAX(x,y)  //函数体
{int max = 0;if(x>y){max=x;}else max=y;return max;
}

总结:为什么要声明,为什么要定义:假设你有一个女朋友,你在你兄弟面前提起你有女朋友,他们会思考小红还是小花,而当你明确告诉你女朋友姓甚名谁,以后提起,自然而然别人会知道你的女朋友是谁。
当有女生靠近你,请大胆的说我有女朋友,住在何方,身高,体重。这就是女朋友的调用。

指针

-----指针是C语言的一个重要概率,也是C语言的一个重要特色。正确而灵活的运用指针,可以使得程序更加简洁、紧凑、高效。而指针的概念相对复杂,使用也比较灵活,对于我这种初学者而言,应该着重去理解它的实际意义,以理解的方式去为以后的指针学习中打下基础。

指针是什么?

什么是指针?首先得先弄清楚数据在内存中是如何储存又是如何读取的。

-----首先在对程序进行编译的时候->系统为变量分配内存单元(系统根据所定义的变量类型分配一定长度的空间);例如Visual C++为整形分配四个字节,为单精度浮点数分配4个字节,为字符型变量分配1个字节。而内存区的每一个字节有一个编号,这就是==“地址"==。

-----由于地址能找到所需的变量单元->地址指向变量单元因此地址形象化被称为指针(可以通过它找到以它为地址的内存单元)。
说明:数据是分类型的,对于不同类型的数据,在内存单元中分配的单元大小和存储方式是不同的,如果只是指定了地址,希望从该单元中调取数据是不现实的,因为能找到这样一个内存单元,但无法确定调用的是从几个字节中获取数据。所以为了有效的存取一个数据除了位置信息以外,还需要确定该数据类型。如&a,一般称它为”变量a的地址“,确切的说,它是“整形变量a的地址”。

-----当想要调取一个变量

指针变量


我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中
#include <stdio.h>
int main()
{int a = 10;//在内存中开辟一块空间int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。//a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
中,p就是一个之指针变量。return 0; }

//当确定了变量类型,变量将以地址的形式存储在内存单元之中,在程序之中一般通过变量名来直接访问地址,引用变量的值。->上述语句之中,首先是通过变量名指向地址->按照数据类型和存储方式从该四个字节中读出变量a的值->再按照十进制方式输出

指针理解的2个要点:

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
    总结:指针就是地址,口语中说的指针通常指的是指针变量

指针类型

-----数据分类型,指针也分类型。
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
不同类型的指针指向的是不同类型的地址,

指针的解引用

-----指针的解引用

//演示实例
#include <stdio.h>
int main()
{int n = 0x11223344;char *pc = (char *)&n;int *pi = &n;*pc = 0;   //重点在调试的过程中观察内存的变化。*pi = 0;   //重点在调试的过程中观察内存的变化。return 0; }

指针的解引用就是对地址下的变量进行引用,指针类型决定了访问权限(多大字节),比如:char * 是访问一个字节,int * 是四个字节。

指针的访问

直接访问

-----对于一把锁(A)可以直接用A钥匙进行打开。假如吧数值存放到变量a的存储单元中。直接根据变量名对a进行赋值,是对变量下的地址进行的直接访问。

间接访问

-----为了一些情况,也可以用B钥匙打开B抽屉拿出A钥匙打开A锁。先找到变量a地址的变量a_pointer,从其中得到变量a的地址,从而找到变量a的存储单元,然后对其进行存取访问。

后记

-----内容由于是初学者嘛,还是大量参考了谭浩强《C程序设计第五版》,《明确C语言·入门篇》。其中还有平时上课的板书和自己做的笔记和总结。我将平时自己会犯的错误和看他人常犯错误总结一下。即时给自己提醒,也希望能帮助像我一样刚刚入门的能更好的让代码跑起来。

  1. 语法错误:不符合C语言语法规则。这是最常见的错误,比如main写成mian,printf; 括号不匹配漏写分号
  2. 逻辑错误:这个相对比较难以发现,如果逻辑不够清晰,可以多对已知代码进行注释来锻炼自己对代码的理解能力。再就是截取代码片段请教他人。还可以参照答案对自己编写代码进行比对而不是盲目修改抄写。
  3. 运行错误:输入类型与输入格式符%d不匹配。
  4. 头文件:是否对库函数引用相匹配的头文件。







谢谢了!

wc---这就是C语言---都是玄学相关推荐

  1. 为什么每个语言都要和Java作比较?一文带你搞懂!

    [此文章转自乐字节] 对编程有兴趣或者是有一定了解的同学都知道,编程语言界会有各种各样的比较,但是播妞发现,各大编程语言都喜欢和Java作比较. 今天小编和大家一起扒拉一个问题--为什么各大语言都要和 ...

  2. 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(十五)——JSP基础语法   任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语

    javaweb学习总结(十五)--JSP基础语法 任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. ...

  3. 语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程。...

    语言都是相通的,学好一门语言,再学第二门语言就很简单,记录一下我复习c语言的过程. 为了将本人的python培训提高一个层次,本人最近买了很多算法的书. 这个书上的代码基本都是c语言实现的,c语言很久 ...

  4. 无监督方法实现C++、Java、Python 代码转换,程序员:出了bug怎么办,两种语言都要看吗?...

    点击上方"视学算法",选择加"星标" 重磅干货,第一时间送达 本文转载自:机器之心  |  参与:魔王 Facebook 提出的无监督代码转换方法 TransC ...

  5. 如果每一种语言都对应一种女生,你会喜欢哪一个?

    这几天调试都很顺利,今天很意外的不要加班,哥几个看着窗外还是白天,还有点不适应.没想到哥几个突然开始YY: 如果每种语言都对应一种女生, 你会喜欢哪一个? 程序猿寂寞起来,我自己都害怕.碍于人数有限, ...

  6. 机器学习与分布式机器学习_这就是为什么任何人都可以学习机器学习的原因

    机器学习与分布式机器学习 by Siraj Raval 通过Siraj Raval 这就是为什么任何人都可以学习机器学习的原因 (This is why anyone can learn Machin ...

  7. 编程c语言零基础知识,零基础学习C语言都需要掌握哪些基础知识

    随着互联网的不断发展,越来越多的人都在学习互联网软件编程开发语言,而今天我们就一起来了解一下,零基础学习C语言都需要掌握哪些基础知识. 无论学习哪门语言先应该了解一下自己所学语言的背景,也可以说它的发 ...

  8. 初学者对PHP的总结,PHP_献给php初学者(入门学习经验谈),1.概要:学习任何语言都需要 - phpStudy...

    献给php初学者(入门学习经验谈) 1.概要:学习任何语言都需要 多看 多想 多写 多问!!写编程是一种熟能生巧的东西!因为知识就那么多,你看多了就会觉得怎么都一样. 程序员就是炒冷饭的,一遍又一遍. ...

  9. C语言都能用来干吗、我为什么要学C语言

    最近在学C语言,可是越学习就越觉得迷茫,不知道我能用它来干什么? 现在总结一下很多网友的回答,给大家一些参考! 一 .  c语言是计算机技术的基础,是信息技术的基础,是自动化技术的基础,是很多电子设备 ...

最新文章

  1. matlab文档型数据导入,MATLAB-数据导入
  2. LoadRunner系统架构简介与运行原理
  3. Spring MVC 中 HandlerInterceptorAdapter的使用--转载
  4. TLSNotary中心化预言机(2) 核心功能
  5. STM32——GPIO(2)
  6. leetcode 148 --- 链表排序
  7. Cocoa编程中视图控制器与视图类详解
  8. win10家庭版远程桌面_win10 家庭版使用RDPWrap开通远程桌面服务
  9. 寒冬已至,传统零售业如何打破僵局“逆境生长”
  10. 常用技术网站2017-2018
  11. 支付宝回调验证失败问题
  12. JetBrain学生免费全家桶
  13. 大数据技术基础实验十三:Kafka实验——订阅推送示例
  14. Scrum立会报告+燃尽图(十月十七日总第八次)
  15. 时域采样与频域采样实验报告_光时域反射仪(OTDR)如何工作(光电读书)
  16. .Net 互联网技术(一)分布式ID生成方法生成演变
  17. Protege使用教程总结及详解,附官方教程文档(上)
  18. Redis | 第6章 事件与客户端《Redis设计与实现》
  19. Android中使用CoAP协议
  20. 什么是IOC容器——简单明了

热门文章

  1. linux-CPU 性能优化总结
  2. 思科考试答案 网上搜不到的几个
  3. laya开发微信小游戏《奇异水族馆》之 观察者模式应用
  4. jxbrowser 实现java 和 js互相调用
  5. 智慧节能系统都有哪些功能
  6. mysql 1045解决方法
  7. 工业机器人物料分拣实训装置
  8. Asp.net core 身份认证框架 Microsoft Identity的使用以及如何使用Idengtity创建自带的用户模型SignInManager和UserManager的使用等等
  9. 亲,你有一份 ChatGPT4 的体验机会待查收! 一站式 AI 工具箱 - Poe 介绍
  10. 《我的心曾悲伤七次》