【鹏哥C语言网课笔记】初识C语言

目录

1、数据类型

2、变量、常量

2.1 变量/常量的含义与创建

2.2 变量的分类

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

2.3.1 作用域

 2.3.2 生命周期

2.4 常量

2.4.1 字面常量

2.4.2  const 修饰的常变量

 2.4.3  #define定义的标识符常量 

2.4.4  枚举常量

3、字符串+转义字符+注释

3.1 字符串

3.1.1 字符串存储

3.1.2 字符数组不同初始化对比

3.2 转义字符

3.3 注释

4、选择语句、循环语句、函数后面详细讲解

5、数组

5.1 数组创建

 5.2 数组的访问

 5.3 数组的打印

6、操作符

7、常见关键字

7.1 typedef 类型重定义

7.2 static 静态的

8、 #define 定义常量和宏

 9、指针

9.1 内存

 9.2 指针变量

9.3 指针变量大小

10  结构体


1、数据类型

        C语言中数据类型如下表:

数据类型类型说明所占内存大小printf打印输出时格式
char字符数据类型1字节%c  
short短整型2字节
int整型4字节%d
long长整型4字节%ld
long long更长的整型8字节%f
float单精度浮点型4字节%lf
double双精度浮点型8字节

        C语言中有没有字符串类型呢?

        字符串是用字符数组进行存储,数组是一块内存空间,用字符数组来存放字符串。

        定义格式:char   string[ ] =  "abcde";  //双引号是引用字符串的

        字符串的打印格式:%s   例如printf(“%s”,string);

        地址打印格式: %p:是专门用于打印地址的。

       【补充】

       (1) C语言中计算变量所占内存大小的函数是sizeof,sizeof()的单位是字节byte。

       (2)计算机中的单位(从小到大):bit—byte—kb—mb—gb—tb—pb

       (3)大小换算关系:1byte=8bit   1kb=1024byte   1mb=1024kb   1gb=1024mb    1tb=1024gb

       (4)数据类型的作用是用来创建变量的。

         利用sizeof计算数据类型所占内存

2、变量、常量

2.1 变量/常量的含义与创建

  变量和常量含义:不能改变的量称为常量;能被改变的量称为变量。变量意味着可变。

  变量的创建:(1)数据类型    变量名字   =  0  (推荐:在创建时赋初值)

                        (2)数据类型    变量名字           (不推荐)

2.2 变量的分类

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

  • 局部变量       在代码块{  }内部定义的变量,只能在{   }内部使用,在main函数内部定义的变量也是局部变量
  • 全局变量       在代码块{  }外部定义的变量,所有代码都可以使用,例如在所有函数外部定义的变量

【说明】

当局部变量和全局变量名字冲突的情况下,在函数内部局部变量优先使用。

在定义变量的时候,不建议把局部变量和全局变量的名字写成一样的。

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

  • 作用域: 一段代码中所用到的名字并不总是有效的/可用的,限定这个名字的可用性的代码范围就是这个名字的作用域。通俗来讲,这个变量在哪里可以使用,哪里就是它的作用域。
  • 生命周期:指从变量的创建到变量的销毁之间的时间段。

2.3.1 作用域

  (1)局部变量的作用域:就是变量所在的局部范围。例如在代码块{  }中定义了某个变量,该变量的使用范围就是在该代码块{  }中变量定义位置之后可以对该变量使用。在{  }外部是不能使用的,不管是在上部还是下部都是不能使用的;在{  }内部该变量定义之前也不能使用。

  (2)全局变量的作用域:整个工程任何地方都可使用。

        a.全局变量使用说明一:在同一文件中定义的全局变量。

        如下图所示,定义了全局变量g_val,该变量下面的任何地方都可以使用。

         b.全局变量使用说明二:在同一工程内,不同源文件中定义的全局变量。

        跨文件使用全局变量的时候,只要用extern声明一下变量就可以使用。声明的意思就是告诉这个文件有这么一个变量。如下图所示,在add.c文件中定义了一个变量g_val,在test4_2.c文件中使用时用extern声明一下该变量,在该文件中就可以使用。

 【注意】

(1)执行性的代码(打印一句话、变量赋值)必须要写到函数/大括号{  }里面去,变量的创建可以写到{  }外部。如下图所示是错误的,将printf()语句写到了函数外面。

 2.3.2 生命周期

(1)局部变量的生命周期:进入局部范围{   }内部生命开始,出局部范围后生命结束。

(2)全局变量的生命周期:程序的生命周期。一个程序的main函数就是这个程序的生命周期。因为整个程序是从main函数第一句话开始执行,一直执行到return 0后,代码就会结束。

2.4 常量

不变的量就称为常量。常量的属性是一旦被定义,就不能被改变。

C语言中常量分以下几种:

  • 字面常量
  • const 修饰的常变量
  • #define 定义的标识符常量
  • 枚举常量

2.4.1 字面常量

2.4.2  const 修饰的常变量

        const修饰的变量,本质上还是变量,只不过具有常量的属性(不能被改变的属性)。是具有常量的属性的变量。

       用const修饰的常变量具有以下特点:

(1)const修饰的变量是不能被修改的。如下图所示,const修饰的变量num,他具有常数的属性,他的数值是不能被修改的。

 (2)被const修饰的变量,不能被用来创建数组的,创建数组必须是常量。这条可以证明被const修饰后,是变量。下图中n本质属性是变量,只不过被const修饰了一下,从根上还是变量,只不过不能被变了,本质上是变量。

 2.4.3  #define定义的标识符常量 

#define MAX 10000

 上面MAX就是define定义的标识符常量,MAX这个符号就是10000的意思,MAX是不能改变的。

define定义的标识符常量后不需要加;号。

2.4.4  枚举常量

枚举常量的含义:可以一一列举的常量。

枚举常量定义方式:关键字enum——枚举关键字

枚举类型中放的三个值就是枚举常量。

和结构体有些类似。

enum   变量名
{
    //以下取值就是这种枚举类型的变量的未来可能取值
    //枚举常量
    取值1;
    取值2;
    取值3;
}

当把枚举常量打印出来后,它的值是从0开始的,它的值是不能改的。

3、字符串+转义字符+注释

3.1 字符串

字符串就是一串字符,是用双引号括起来的一串字符。

【注】字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串内容。

3.1.1 字符串存储

字符串的存储:字符串是多个字符,多个字符如何存起来呢?——利用字符数组存起来。

字符数组——数组是一组相同类型的元素。

字符串里放的都是字符,就可以把字符串存到一个字符数组里。

如下程序所示,用char类型创建了一个数组arr[ ],方框内没有写大小,会根据后面字符串大小来初始化它的大小。

(1)字符串在结尾的位置隐藏了一个\0的字符。

(2)\0是字符串的结束标志,计算字符串长度时,\0只是结束标志而已,不算字符串内容,在求字符串长度的时候,不计算它。

3.1.2 字符数组不同初始化对比

给字符数组赋值一个字符串和给字符数组赋值字符进行对比

如下图所示,给字符数组arr1[ ]初始化时幅值一个字符串“abc“,和给字符数组arr2[ ]初始化时幅值一个字符数组{'a','b','c'}进行对比。

(1)对比一:当进行调试观察数组元素的时,数组arr1[ ]有4个元素,最后一个元素是\0,arr2[ ]有3个元素,如图一所示。

(2)对比二:当进行打印输出结果时,arr1[ ]的输出结果是abc,arr2[ ]的输出结果abc后面是乱码,如图二所示。arr1[ ]打印abc后遇到字符串结束标志\0,就不会往后打印了,就会停下,只打印abc,arr2[ ]打印abc后,后面没有\0,abc后面的内存放的是什么不知道,所以abc后面空间的内容是未知的,对于未知的内容打印出来就是乱码。

         如果想让arr2[ ]也输出abc,可以在arr2[ ]内部放入\0的字符。

 (3)求字符串的长度。利用strlen函数求字符串长度。字符串的结束标志\0仅仅是结束标志,在计算字符串长度的时候,没有包含\0。strlen函数从数组元素向后一直寻找\0,直到找到\0的时候就会停下来。在求arr2[ ]长度的时候在'c'后面没有找到\0,就会继续往内存中寻找,直到找到\0为止。

         当在arr2[ ]后加上‘\0’字符后,再去求字符串长度,则arr1[ ] 和arr2[ ]长度是相等的。

 【注意】

(1)以下写法是不对的,arr前用char来修饰,是字符变量,但后面赋值又赋值为字符串,是不对的。

char arr ="abcd"

(2)在求数组元素个数的时候是会算\0的,求字符串长度的时候是不算\0的。求数组元素个数的计算方法可以用sizeof(arr)/sizeof(arr[0])来计算数组元素个数。

3.2 转义字符

含义:转义字符就是转变了字符原有的意思。例如\n,不再是普通的一个\加一个n的意思,而是换行的意思,它也转变了字符原来的意思,转变成换行的意思。

C语言中的转义字符有:

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词
\'用于表示字符常量'
\"用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转移序列符
\a警告字符,蜂鸣
\b退格符
\f进纸符
\n换行
\r回车
\t水平制表符

\v

垂直制表符
\dddddd表示1-3个八进制的数字。如:\130    含义:X
\xdddd表示2个十六进制数字。如:\x30     含义:0
  •  \'    对单引号进行转义,例如要打印字符  ‘,不能直接printf("%c",'''),这样打印时,前面两个单引号''会认为是一对单引号,最后面一个单引号就落单了,就会出现问题。我们希望中间的单引号是普普通通的单引号,而不是一对单引号中的单引号,这时让它转义,在中间单引号前加一个\就可以了,例如printf("%c",'\''),这时中间的单引号就是普普通通的字符了。
  •  \"    对双引号进行转义,转换含义同上,例如要打印字符串  ”,不能直接printf("%s" , “”“),这样打印时,前面两个双引号“ ”会认为是一对双引号,最后面一个双引号就落单了,就会出现问题。我们希望中间的双引号是普普通通的双引号字符,而不是一对双引号中的双引号,这时让它转义,在中间双引号前加一个\就可以了,例如printf("%s" , “\”“),这时中间的双引号就是普普通通的字符串了。假如要打印双引号之间的单引号,这样就不需要转义了,因为中间的单引号不会和前后的双引号组成一对。
  • \\   对转义字符中的\进行转义,使得这个后面的\保留原来输出格式
  • \ddd  d是8进制数字(0-7),\后面可以是1-3个d。当\ddd是字符,以字符形式打印时。\后面跟上三个数字,是把ddd这个8进制数字转换成十进制所得的数字,以他为ASCII码值代表的字符进行输出。
  • \xdd   d是16进制数字(0-F),\x后面必须是两个dd。

 

【补充】

printf在打印数据的时候,可以指定打印的格式。

printf("%d",100)    //打印整型变量
printf("%c",'a')     //打印字符
printf("%s","abdc")  //打印字符串

3.3 注释

注释有两种风格:
  • C语言风格的注释 /*xxxxxx*/       缺陷:不能嵌套注释
  • C++风格的注释 //xxxxxxxx          可以注释一行也可以注释多行

4、选择语句、循环语句、函数后面详细讲解

5、数组

数组含义:一组相同类型的元素的集合。

5.1 数组创建

创建整型数组  int   arr[10]  =  {1,2,3,4,5,6,7,8,9,10};

创建字符数组  char  ch[5]  =   {'a','b','c'}; //不完全初始化,arr有5个元素,但是初始化时只给三个元素,剩下的会默认初始化为0。

 5.2 数组的访问

数组是用下标来访问的,数组的每个元素都有一个下标,下标是从0开始的。

 5.3 数组的打印

要把数组全部打印出来,就要产生下标0-9范围的值

利用循环语句(for循环,或while循环)产生数组的下标,然后进行打印。

6、操作符

操作符类型操作符说明
算术操作符+  -  *  /   %

/  除号两端都是整数时,执行整数除法,算出的是商;两端有一个小数,执行的是小数除法,就会的得到小数。

%  取模(求余),得到的是余数

移位操作符<<   >>移动的是二进制位
位操作符&   |    ^
赋值操作符

=   +=  -=  *=  /=  

&=   ^ =    |=      >>=   <<=

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

关系操作符>
>=
<
<=
!=   用于测试 “ 不相等 ”
==       用于测试 “ 相等 ”
逻辑操作符

&&     逻辑与

||        逻辑或

条件操作符exp1 ? exp2 : exp3
逗号操作符exp1 , exp2 , exp3 , …expN
下标引用、函数调用和结构成员操作符[  ]   (   )    .    ->

(1)!逻辑反操作

        说明:C语言0表示假,非0就是真。!的作用是把假(0)变成真(1),把真(非0)变成假(0)。当把假取反变成真的时候,规定结果为1。

        使用方法:当a为真,要做某一件事情的时候,判断语句中就是(a);当表达a为假做某件事情的时候,判断语句中就是(!a)。

(2)sizeof

        说明:sizeof是一个操作符,不是函数;用来计算类型、变量、数组的大小。Sizeof()后面的括号可以省略,可说明sizeof是一个操作符,不是函数。Sizeof求变量大小的时候括号可以省略,求类型的时候不可以省略。

        使用方法:计算数组大小的时候,sizeof计算的结果是数组的总大小,单位是字节,计算出的结果等于元素个数x每个元素所占字节数。数组元素个数的计算:sizeof(arr)/sizeof(arr[0])。

(3)~按位取反

        对一个数的二进制按位取反。把所有二进制位中数字,0变成1,1变成0。按位取反是所有位都变,包括符号位。

(4)++ 

        ++a:前置++,先++,后使用

        a++:后置++,先使用,后++

(5)exp1?Exp2:exp3   条件操作符

        三目操作符,有三个操作数。Exp1成立,exp2计算,整个表达式的结构是:exp2的结果。

Exp1不成立,exp3计算,整个表达式的结构是:exp3的结果。

(6)逗号表达式

        逗号表达式的特点:从左向右依次计算。

        逗号表达式的结果:整个表达式的结果是最后一个表达式的结果。

7、常见关键字

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

【注】Define 和include不是关键字。这两个是预处理指令

7.1 typedef 类型重定义

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

unsigned int num = 100;
typedef unsigned int  u_int//将unsigned int 类型重新起一个名字u_int

7.2 static 静态的

Static的三个用法:

  1. static  修饰局部变量——称为静态局部变量
  2. Static  修饰全局变量——-称为静态全局变量
  3. Static  修饰函数——称为静态函数

1、static修饰局部变量

        改变了局部变量的生命周期(本质上是改变了变量的存储类型),当被static修饰时,局部变量由栈区存放到了静态区。因为存在了不同区域,数据就有了不同的特点。静态区中全局变量和static 修饰的静态变量的生命周期非常长。他们的生命周期和程序的生命周期是一样的,程序不结束,全局变量和静态变量就不会销毁。下图为变量的存储。

 2、static修饰全局变量

        static修饰的全局变量,使得这个全局变量只能在自己所在的源文件(.C)内部可以使用,其他源文件不能使用。

        本质:全局变量在其他源文件内部可以被使用,是因为全局变量是具有外部链接属性,但是被static修饰后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了。

        下图所示,用static修饰全局变量后,test.c程序中无法使用g_val变量。

 3、static修饰函数

        static修饰函数后,使得函数只能在自己所在的源文件内部使用,不能在其他源文件内部使用。

        本质上,static是将函数的外部链接属性变成了内部链接属性,和static修饰全局变量一样。

         static修饰函数后:

8、 #define 定义常量和宏

说明:宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式,解释器或编译器在遇到宏时会自动进行这一模式替换。

 作用:

(1)define 定义符号/定义常量     

(2)define定义宏,define定义的宏完成的是替换。宏是有参数的,宏的参数是替换。 

#define  MAX 1000
#define  ADD(X,Y)  ((X)+(Y))   //宏在书写的时候,不应该把X和Y想象成一个普通的变量,它可能是一个表达式,需要把宏体整体括起来。

 9、指针

9.1 内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。

所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节

为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址

内存的管理方式:把内存划分为一个一个小格子,然后给每个小格子编上号。

(1)内存的编号方式

所说的机器是32位的或64位的,32位指的是有32根地址线。地址线是物理线,是可以通电的,正电时1,负电0,可把电信号转换成数字信息:1和0组成的二进制序列。是因为有地址线,地址线通电产生的电信号,电信号转换成数字信号对应的二进制序列就是地址编号。编号就被称为地址。

(2)一个这样的内存单元是多大空间呢?

一个内存单元的大小为1个字节byte,然后再去分配地址。

 9.2 指针变量

        创建一个变量a为int类型,它在内存中占用四个字节,在内存中给每个字节都分配了一个地址。现在想拿出它的地址。它是怎样一个地址呢?

        用&取出a的地址,取地址是取的是这四个连续空间的起始地址。只要拿到连续空间的起始地址,后面的地址照样可以找到。取地址时,不是把四个地址都拿出来,只会把第一个字节的地址拿出来

        %p:专用用来打印地址的。printf(“%p\n”,&a)

        将地址取出来后,它虽然是个地址,但也是一个值,这个值要存起来,就需要放到一个变量中去,用来存放地址的变量叫做指针变量。

      指针变量定义,int  *  pa = &a。  对于int  * 的理解:*说明pa是指针变量;int说明pa指向的对象a是int类型的。pa指向的是a,a的类型是int,所以指针变量是int类型。

        指针变量是用来存放其他变量地址的,指针是有类型的,指针的作用:第一是用来存放地址,第二是可以通过* pa来找到它所指向的对象,来操作它所指向的对象。* 叫做解引用操作符。* pa就是通过pa里的地址找到a,然后可以对a进行操作,这种是简介操作。

9.3 指针变量大小

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

10  结构体

        结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。结构体可以让C语言创建新的类型。

(1)结构体创建和初始化

 

(2)结构体的访问(如上图所示):

(a)点操作符:    结构体变量.成员变量

(b)箭头操作符:->,通过结构体指针来访问。结构体指针->成员变量名

        ps是指针,它指向对象的名字ps->name。

        结构体指针定义:Struct  stu  *  pa   =  &s

  • 11
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值