wc---这就是C语言---都是玄学

C语言程序立地成佛

前言

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

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是随机值
这里的[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. 头文件:是否对库函数引用相匹配的头文件。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
谢谢了!

  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovewold少个r

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值