> 文档中心 > 初次见面——C语言的整体把握【小白福音】

初次见面——C语言的整体把握【小白福音】

写作记录点滴,笔者讲以实时学习内容为基础,总结整理,做成对大家有用的东西。

初次见面

C语言第一步:简单的系统学习来让我们看懂代码

文章目录

  • 初次见面
  • 前言
  • 一、程序猿的第一份见面礼
  • 二、与实际生活联系,各种各样的数据类型
    • 1.类型介绍
    • 2.类型解读
  • 三、常量变量
    • 1.变量
      • 1.变量的定义方法
      • 2.变量的分类
      • 3.变量的使用
      • 4.变量的作用域与生命周期
    • 2.常量
      • 1.字面常量
      • 2.const 修饰的长变量
      • 3.define的标识符常量
      • 4.枚举常量
  • 四,字符串,转义字符,注释
    • 1.字符串
    • 2.转义字符
    • 3.注释
  • 五.选择语句
  • 六.循环结构
    • while
  • 七.函数
  • 八.数组
    • 1.数组定义
    • 2.数组的下标
  • 九.操作
    • 1.算数操作符
    • 2.移位操作法
    • 3.位操作符
      • 按位与
      • 按位异或
      • 按位或
    • 4.赋值操作符
    • 5.单目操作符
      • (类型) 强制类型转换
    • 6.关系操作符
    • 7.逻辑操作符
    • 8.条件操作符
    • 9.逗号操作符
    • 10.下标引用操作符
        • 有四个陌生
    • typedef
    • static
      • 1.修饰局部变量
      • 2.修饰全局变量
      • 3.修饰函数
      • 4.全局变量与函数没被修饰时
  • 十.#define定义常量和宏
  • 十一.指针
    • 1.内存
    • 2.指针变量
      • 指针变量的大小
  • 十二.结构体
  • 总结

前言

刚开始写博客,不管是立意还是排版都有很多想法,奈何经验不足,语言、框架难免冗长,还请各位指正建议
编程语言学习对初学者来说是非常困难的,一是内容抽象,二是内容庞大,上手难。如果跟着教材学习实在是吃力不讨好,由于学校教材大多比较,内容设计漏洞过多,时不时会出现许多当前能力无法理解的代码,甚至从未接触过的内容。
本文讲对C语言进行简单整体的概括,来让大家在以后的学习中轻松一点,比别人强(卷)一点
这一专栏笔者主要进行知识的梳理与巩固,决定将在不就后开启一个提醒总结专栏;

一、程序猿的第一份见面礼

你好世界! 今天向世界说你好,明天向世界搞革命

C语言或者说C程序是有一个个函数组成,而主函数则是某一部分的整体,当编译某一部分或某一程序是,主函数比不可少。也可讲其理解为固定格式(格式),写好套用即可。
初次见面——C语言的整体把握【小白福音】
上图是近期较为主流的主函数格式,基本在初期C语言学习中每一份代码离不开他。
注:笔者在这里没有写出编译器的使用、选择及文件的创建,主要是考虑每个人爱好习惯不同,其次这是每位程序员都应掌握的技能,本文偏向理论性整理及个别重要工具的使用,将不再对各有喜爱的内容作出观点。(笔者使用vs

二、与实际生活联系,各种各样的数据类型

1.类型介绍

char//字符数据类型 (字母,符号short      //短整形  int //长整形long//长整形long long  //更长的整形  (整数,可以根据大小需要选择float      //单精度浮点型double     //双精度浮点型  (小数,小数点后面会有更多位

2.类型解读

看到这里不由得会发问,为什么有这样多的分类
联系生活,生活中充满了各种各样的数据类型,如商场中的商品标签,名称需要字符来表示,价格可以用整形或者浮点型表示,千千万万,无处不在,而人通过编程在计算机上实现目标功能,不就是创造生活中的点点滴滴,目标功能是为人服务,人离不开生活。
“存在这么多的类型,其实是为了更加丰富的表达生活中的各种各样值”

从字面得知,每种大类型还分为小类型,毋庸置疑,与大小有关,来感受一下

代码如下(示例):

#include int main(){printf("%d\n", sizeof(char));printf("%d\n", sizeof(short));printf("%d\n", sizeof(int));printf("%d\n", sizeof(long));printf("%d\n", sizeof(long long));printf("%d\n", sizeof(float));printf("%d\n", sizeof(double));printf("%d\n", sizeof(long double));return 0;}

这里出现了新朋友,
#include
C语言的编程离不开函数,一部分函数需要我们自己创建,还有一部分是编译器提供的库函数,只需我们在头文件引出便可直接拿来用,格式如上;stdio.h为标准输入输出,是最常见的头文件,我们与计算机的交流与获得计算机的反馈离不开输入与输出,输入就是键盘输入 scanf
输出便是打印在屏幕 printf 注意哦,编译符号一定要是英文,编译器是英文做的,看不懂中文
sizeof
在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符。看看结果

在这里插入图片描述

1 2 4 4 8 4 8 8
那大小的单位是多少呢?字节
这里引申一下,程序员长用的数字
计算机内存最小单位为bit(比特),也就是我们熟悉的二进制,由0和1组成。八个bit是一个byte(字节),1024个byte是一个kb,1024个kb是一个mb,由此类推,gb,tb…等等等等
每一次类型的创建都会在内存开辟空间,其中比较特殊的两个便是整形和长整形,为什么多了一个“长”,大小却都是四个字节呢?
C语言语法规定,长整形的大小只要大于等于整形即可,有些编译器下是4,有些编译器是8,不用过于纠结.
不同的类型大小为我们提供了内存占用空间优化的选择。

三、常量与变量

生活总是可以和所学知识紧密练习,生活中也有许多常量与变量,常量如一个人的身份证号码,性别等等,变量如年龄,体重等等·,数据性很强的编程亦是如此

1.变量

1.变量的定义方法

通常为 数据类型  变量名    =后按要求初始化,建议每次创建变量时随手初始化,可以初始化为0或者有帮助的内容
char a=‘w';//字符用单引号,字符串用双引号int b = 10;float h = 45.5f;//f表示单精度

2.变量的分类

变量又分为局部变量和全局变量

#include <stdio.h>int global = 2019;//全局变量int main(){    int local = 2018;//局部变量    int global = 2020;//局部变量    printf("global = %d\n", global);    return 0;}
通俗的说,局部变量在大括号内,全局变量在大括号外。那么,上述代码中,下面定义的global会不会有问题

在这里插入图片描述
可见,当局部变量和全局变量同名时,局部变量优先使用。
建议平常使用是尽量不要将局部变量与全局变量同名。

3.变量的使用

#include <stdio.h>int main(){    int num1 = 0;   int num2 = 0;    int sum = 0;    printf("输入两个操作数:>");    scanf("%d %d", &num1, &num2);    sum = num1 + num2;    printf("sum = %d\n", sum);    return 0;}
变量创建且初始化后,可以被赋值或修改此处的scanf和printf便是上文提到的由头文件包含的函数格式需要注意并掌握

4.变量的作用域与生命周期

作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域
  1. 局部变量的作用域是变量所在的局部范围。也就是局部变量所在大括号的内部。
  2. 全局变量的作用域是整个工程。可以理解为在大括号外部定义

2.常量

C语言中常量与变量的定义方式不同
有以下几种
字面常量
const修饰的长变量
#denfine定义的标识符常量
枚举常量

1.字面常量

像 1.1 5 称为字面常量

2.const 修饰的长变量

用法

int a=0;const int a=0;

//const使变量a具有了长属性,在后续编译有是一个长值不可修改,但仍然是一个变量,在特定语法环境下无法使用

3.define的标识符常量

#define MAX 100//    常量名 值

4.枚举常量

这里又出现了一位新朋友,enum,用来创建枚举类型,描述一个概念时,会有多条内容,比如说性别,就会有,男,女,保密
这里只做简单申引。

enum sex{    male      //0    female   //1    secret    //2}printf("%d\n",male);printf("%d\n",0);

枚举常量默认是从0开始,依次递增1

四,字符串,转义字符,注释

1.字符串

“abcdef…、n” 此类由双引号引起来的一串字符称为字符串。
字符串的结束标志是’\0‘,是一个转义字符,是字符串的结束标志,打印时另起一行,不算作字符串内容。

#include //下面代码,打印结果是什么?为什么?int main(){    char arr1[] = "bit";    char arr2[] = {'b', 'i', 't'};    char arr3[] = {'b', 'i', 't', '\0'};    printf("%s\n", arr1);    printf("%s\n", arr2);    printf("%s\n", arr3);    return 0;

字符串的创建方式 类型 名称[] =""或{}初始化
%s为打印字符串。
在这里插入图片描述
当字符串由双引号引起时,字符串末尾隐藏一个/0字符串停止,且不做内容,故照常打印。
当字符串由多个’'引起的字符组成且最后一位不是/0时,由于字符是从内存上获取,我们并不知道所打印字符在哪个位置,之后位置存放哪个内容并不清楚,只有遇到/0时才会停止打印。故此类情况会打印一些随机乱码,遇到/0才会停止。

2.转义字符

在打印时,往往需要打印一些操作符,但打印的结果缺是操作符作用后的结果,这里便需要转义字符的帮助

转义字符 释义
\? 在书写连续多个问号时使用,防止他们被解析成三字母词
\’ 用于表示字符常量’
\“ 用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符 tab 四个空格
\v 垂直制表符
\ddd ddd表示1~3个八进制的数字。对应十进制的ASCII码为打印内容(下同})
\xdd dd表示两个十六进制数字
#include int main(){    //问题1:在屏幕上打印一个单引号',怎么做?    //问题2:在屏幕上打印一个字符串,字符串的内容是一个双引号“,怎么做?    printf("%c\n", '\'');    printf("%s\n", "\"");    return 0;}

3.注释

代码难懂,害怕以后看自己或别人的代码看不懂,注释很重要
不需要的可以删除,也可以注释
注释风格
C语言注释风格/* */
不支持嵌套注释
c++注释风格//
个性DIY

五.选择语句

生活中充满了选择,C语言中的选择通过if else来实现

#include int main(){    int coding = 0;    printf("你会去敲代码吗?(选择1 or 0):>");    scanf("%d", &coding);    if(coding == 1)   {prinf("坚持,你会有好offer\n");   }    else   {printf("放弃,回家卖红薯\n");   }    return 0;}

语法格式如图
if后的条件成立执行语句,不成立即不处理或执行else后.
在这里插入图片描述

六.循环结构

循环有while,for,以及 do while

while

while(条件){条件成立执行语句且返回条件判断}条件不成立跳出循环

do while 与while不同即为while先判断后循环,do while先循环后判断

#include int main(){    printf("开始学习编程\n");    int line = 0;    while(line20000) printf("好offer\n");    return 0;}

(可以嵌套使用哦)

七.函数

#include int main(){    int num1 = 0;   int num2 = 0;    int sum = 0;    printf("输入两个操作数:>");    scanf("%d %d", &num1, &num2);    sum = num1 + num2;    printf("sum = %d\n", sum);    return 0;}上述代码,写成函数如下:#include int Add(int x, int y){   int z = x+y;   return z;}int main(){    int num1 = 0;   int num2 = 0;    int sum = 0;    printf("输入两个操作数:>");    scanf("%d %d", &num1, &num2);    sum = Add(num1, num2);    printf("sum = %d\n", sum);    return 0;}

函数创建以后后续多次使用会有大用途you

记录 10-25
码字第二天,写博客真的很费时间和精力,昨天码了半天感觉思维都停滞了,可能看起来越来越水

八.数组

学习变量的创建与初始化,我们发现一次只能创建单个变量或字符串,那么我们要储存1-10的数字要怎么存储呢?数组
数组:一组相同类型元素的集合

注意哦,相同类型的元素,不同类型不可以

1.数组定义

int arr[10]={1,2,3,4,5,6,7,8,9,10}类型  名称    内容/初始化

像其他变量一样,初始化化时可以单写一‘0‘,意味讲数组中十个元素全部初始化为0,也可以这样

int arr[10]={1,2,3}

剩余元素默认为0,称为不完全初始化

2.数组的下标

C语言中,数据的每个元素都有一个下标,默认从0开始

int arr[10]={0,0,0,0,0,0,0,0,0,0,}     0,1,2,3,4,5,6,7,8,9

后续打印或访问可以通过下标访问
具体使用;

#include 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]);//i是下标哦 } printf("\n");    return 0;

九.操作符

C语言实现算法实现必然离不开操作符
这里以复习科普为主

1.算数操作符

+   -   *   /   %

加减乘除比较熟悉,%为模运算,也就是取余数
这里注意

#include int main(){int a =7;int b = 2;a = a/2;printf("%d\n",a);return 0;}

大家认为结果是多少
很简单是3,因为%d打印整形,省略了小数点后,当我们换成%f来试试
结果也并不是3.50000、、、、
是0.000000
因为除号两端都是整数,默认结果也会为整数,如果想或得理想效果,只需在任意一端加入.0,如7.0/2或7/2.0
这时数据类型也应该发生变化为float或double类型以及%lf

2.移位操作法

作用于二级制位
<>
以<<左移操作符为例

int a =3;int b = a<<1;printf("%d\n",b);

3的二进制位为011,由于是int类型,有四个字节大小的空间,即32个比特位
00000000000000000000000000000011
整体左移一位并将空位补0就变为了110
00000000000000000000000000000110
即b的打印结果应该为6

3.位操作符

& ^ |
分别叫

按位与

a=3 b = 5 c=a&b将a和b的2进制比较0000000000000000000000000000001100000000000000000000000000000101有0即为0,全1才为100000000000000000000000000000001即c=1

按位异或

a^b
不是次方

相同为0,相异则为1a=3 b = 5 c=a&b将a和b的2进制比较0000000000000000000000000000001100000000000000000000000000000101有0即为0,全1才为100000000000000000000000000000110即c=6

按位或

同上,有1即为1,全0才为0这里的位也指的是二进制位

4.赋值操作符

=  +=  -=  *=  /=  &= ^=   |=    >>=   <<= 
单个=叫赋值int a ;a = a+4;可以写成a+=4;

其他符合操作符亦是如此

5.单目操作符

C语言中0表示假,非0表示真

!    逻辑反操作(否点,真假替换,如不等于0可写为!=)-    负值+    正值&    取地址sizeof      操作数的类型长度(以字节为单位)(类型所创建变量在内存中占据的空间)~    对一个数的二进制按位取反(1变成0,0变成1)--   前置、后置--(前置先--,后置后++)++   前置、后置++(前置先++,后置后--)*    间接访问操作符(解引用操作符)(类型)强制类型转换

以上二进制都是内存中的二进制位

(类型) 强制类型转换

int a = 3.14;正常打印3的同时,编译器在打印时会警告int转换为double会丢失数据可以通过int a = (int)3.14;来进行强制类型转换.

6.关系操作符

通常用在条件判断中

>>=<<=!=   用于测试“不相等”==      用于测试“相等”

注意;一个=为赋值。两个==表示判断相等

7.逻辑操作符

&&
逻辑与,和数学中的且相同,结果真为1假为0;
同真则真,有假为假
||
逻辑或,同上,与或相同,同假则假,有真为真。

8.条件操作符

a?b:c

与if else相同,先判断条件a是否成立,成立即输出吧,不成立则输出c

9.逗号操作符

a,c,b,d在创建多个变量时,可以讲变量用逗号隔开,一次创建int a=0,b=3,c=6;也可以int a = (a+c, c=a+c,b=a+c);要从左到右依次计算并取最后一个表达式结果

10.下标引用操作符

[ ]
下标引用操作符

int arr[5]可以找到下标为5对应的元素

操作数有几个呢
arr 4 共两个

()
函数调用操作符

#include int Add(int x, int y){   int z = x+y;   return z;}int main(){    int num1 = 0;   int num2 = 0;    int sum = 0;    printf("输入两个操作数:>");    scanf("%d %d", &num1, &num2);    sum = Add(num1, num2);//函数调用,传参数    printf("sum = %d\n", sum);    return 0;}

可见,调用函数时必不可少,
操作数有三
add 3 5
并不确定,根据函数具体内容

有四个陌生

&,*,.,->
#常见关键字
写代码时,直接拿来用,C语言提供了内置关键字

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

auto 定义自动变量,自动创建与销毁,所有局部变量都是auto,一班省略
break 终止,用于循环
case Switch
const,修饰变量,修饰指针
continue 用于循环
default case语句
if else
enum枚举
extern,申明外部符号
各个关键字以后都会详细提到,现在选部分提及;

typedef

类型定义,类型重命名
当一个类型名过长时,可以通过typedef重命名

typedef unsigned int uint_32;uint_32即为重命名后的unsigned int

static

static在C语言中可以修饰变量和函数

1. 修饰局部变量-称为静态局部变量 2.修饰全局变量-称为静态全局变量 3.修饰函数-称为静态函数 循环时保留数据,不会因为生命周期销毁

1.修饰局部变量

#include void test(){    int i = 0;    i++;    printf("%d ", i);}int main(){ int i = 0;    for(i=0; i<10; i++)   { test();   }    return 0;}//代码2#include void test(){    //static修饰局部变量    static int i = 0;    i++;    printf("%d ", i);}int main(){ int i = 0;    for(i=0; i<10; i++)   { test();   }    return 0;}

代码一结果
在这里插入图片描述
代码二结果

在这里插入图片描述

static修饰局部变量改变了变量的生命周期
让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。

2.修饰全局变量

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使
用。

3.修饰函数

一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使
用。

4.全局变量与函数没被修饰时

在其他源文件中只需用extern申明即可

十.#define定义常量和宏

如上文,#define定义常量时

#define MAX 1000

MAX为常量名,建议创建大写
defined定义宏

#define ADD(x,y) ((x)+(y))函数方式int Add(int x, int y){    return c+y;}

两者作用一样,具体区别以后细细道来

十一.指针

1.内存

谈到指针必然离不开内存
“内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。”
上述编号为二进制编号,由计算机地址线数量不同影响,地址线是物理的线,有高电平和低电平两种信号,{我们长说的32位与64位就说的是地址线}(1.0)于是将这些二进制序列做为地址编号
以32位为例

000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000010.....11111111111111111111111111111111一个地址是4个字节即32个比特

总共2^ 32个,即有这么多的地址编号,&取地址操作符即为取到所创建变量所在地址的编号。
数据的创建需要在内存中开辟空间,寻找一片空间放入数据

取出变量地址如下:#include int main(){ int num = 10; &num;//取出num的地址    //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0;

在这里插入图片描述

每次打印地址是第一个字节的地址,(数字较小)
0x开头表示16进制,32比特需要简化表达
注意,开辟空间是由编译器选择地址,可能会有每次打印地址结果不同的结果,是因为每次都是随机创建的.

2.指针变量

inrt num = 10;int    *p;类型   *(说明p是指针变量)p=&num//讲num的地址存入p

使用

#include int main(){ int num = 10; int *p = &num; *p = 20;    return 0;}p中存储着num的地址,*解引用操作符可以让p通过地址找到num,并修改num

其他类型

char ch = 'w'; char* pc = &ch; *pc = 'q';

指针变量的大小

指针变量中存储地址,地址的大小相同

#include //指针变量的大小取决于地址的大小//32位平台下地址是32个bit位(即4个字节)//64位平台下地址是64个bit位(即8个字节)int main(){    printf("%d\n", sizeof(char *));    printf("%d\n", sizeof(short *));    printf("%d\n", sizeof(int *));    printf("%d\n", sizeof(double *));    return 0;}

十二.结构体

结构体使C语言具有描述复杂对象的能力
一位同学有姓名 年龄 性别 学号,多个信息,同时也是一个变量,这时数据类型无法满足我们的需求
便可以用结构体来描述(货品)(产品)

. 结构体成员访问操作符
结构体变量.结构体成员
->
可以讲结构体变量的地址取出
如struct stu *pl =&变量名
struct 结构体类型

struct Stu{    char name[20];//名字    int age;      //年龄    char sex[5];  //性别    char id[15]; //学号    结构体成员    //打印结构体信息struct Stu s(创建) = {"张三", 20, "男", "20180101"}(初始化为想用的数据);//.为结构成员访问操作符printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);//->操作符struct Stu *ps = &s;printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);}

开辟一块空间,讲结构体成员放在不同的区域,调用成员时可以
结构体变量.结构体成员
便可拿出想要的信息在这里插入图片描述
(*pl).解化
结构体指针
在这里插入图片描述
->

printf("%s %d %s\n",pl->num,pl->num,pl-.sex)与上种写法完全相同结构体指针->结构体成员

补充:一个汉字占据两个字节


总结

作者是一个刚开始接触编程的学者,会定期更新一些与作者所学内容同步的内容回顾与总结,是以所学内容为基本框架,加入自己的思考,作为一个复习巩固。好记性不如烂笔头,好多学习过程中感觉理解的内容回顾是已经感到陌生与难懂,这份总结,是自己的复习资料,也可以和大家共勉,时间有限,内容必然有误,还请指正.
码字不易,求三连支持.