C语言的学习

一、 Linux的一些基本命令 

ctrl+alt+T        //打开终端

ctrl+shift+(+)   //放大字体  

ctrl+(-)            //缩小字体

ctrl+shift+n     //打开当前目录下的终端

pwd                //显示当前路径

ls                    //当前路径下查看文件夹、文件

ls-a                 //显示隐藏文件、文件夹   

ls-l                  //显示文件所有属性

.                      //当前目录   

..                     //上级目录

cd                   //切换路径

TAB键            //自动补全

cat                 //查看文本(短)

moer              //查看文本(长)

mkdir             //创建文件夹

touch             //创建文件

rm                 //删除文件夹、文件  

rm-r               //递归删除

rm-i               //删除前询问

rm-f               //强制删除

rmdir             //删除文件夹(空)

mv                //移动/重命名文件、文件夹

cp                 //复制文件、文件夹(空)

cp-r              //复制该目录下所有子目录和文件

clear或Ctrl+l     //清屏

二、数值数据和非数值数据

 非数值数据:

ASCII码表

 数值数据:

二进制、八进制、十进制、十六进制

为了区分不同的进制:八进制前加0,十六进制前0x(0X)

三、基本数据类型

关键字:系统预先定义好的,有特殊含义的,并且都是小写,不能重新定义。一共有32个:

数据类型:char(1bit)、short(2)、int(4)、long(32os中4bit/64os中8bit)、float(4)、double(8)、enum、union、struct、void

数据类型的转换:

1.强制转换(我们自己去转的)

2、隐式类型转换(编译器去转的)

横向箭头:不管有没有进行混合运算,都会进行转换;

纵向箭头:只有进行了混合运算,才会进行转换;

控制语句:if、else、for、do、while、switch、case、default、break、continue、goto

存储类型:auto、static、extern、register

auto:修饰局部变量,修饰的变量存储在栈区

extern:修饰全局变量,修饰的变量存储在静态区

static:既可以修饰局部变量,也可以修饰全局变量,修饰的变量存储在静态区

register:修饰局部变量,存储在寄存器中;

const:只读

return:返回函数

signed:有符号数

unsigned:无符号数

sizeof:计算所占内存空间的大小:单位:字节

typedef:给一个已有的数据类型起别名

volatile: 防止编译器优化

标识符:程序员自己定义的,一般用来定义变量名,函数名,类型名

命名规范:(见名知意)

1.由数字、字母、下划线组成

2.第一个不能为数字

3.不能和关键字重名

运算符

单算移关与,异或逻条赋

算数运算符:+  -  *  /   %(不能用于浮点数)  a++(先赋值再计算) ++a(先计算再赋值)

        注意:如果a++或者++a,单独成立一条语句,都相当于给a加1;

关系运算符:>   <   ==(常量通常写左边)   >=   <=    != 结果为布尔型(假0真1)

逻辑运算符: &&  ||   !

        截断法则:当前面的表达式能确定逻辑结果时,后面的表达式不在进行运算

sizeof运算符:

        sizeof:计算所占内存空间的大小:单位:字节

三目运算符: 表达式1 ?表达式2 :表达式3

        判断表达式1是否成立,如果成立,就将表达式2的值作为整个表达式的值,否则,就将表达式3的值作为整个表达式的值

逗号运算符:从左往右,依次去执行每个表达式,最后将表达式n的值作为整个表达式的值

位运算符:&   |   ~   ^   <<(无论正负都是高位丢弃,低位补0)    >>(正数低位丢弃,高位补0;负数符号位不变,低位丢弃,高位补1)

数据都是以二进制的补码形式进行运算

了解转义字符(1bit)

四、常量与变量

常量:

定义:在程序运行期间,不会也不能被改变的量

包含字符常量、整型常量、浮点型常量、字符串常量、标识常量(宏)

注意:

1、宏名一般用大写表示,小写也可以,因为要和普通的变量区分开来,所以用大写

2、宏后没有分号

3、宏只是一个单纯的替换,他并不会考虑运算符优先级的问题,因此,需要给每个形参,以及整个表达式,都加上括号。

 变量:

<存储类型>  数据类型   变量名;

局部变量:定义在函数体(任何函数体内)内的变量;

全局变量: 定义在函数体外的变量

五、输入与输出

输入

scanf (“格式控制串”,地址表) 以%c输入字符时不要加结束标志因为回车空格也算一个字符,若加输出标志可用%*c来吃掉垃圾字符

putchar():参数为字符的ascii值

输出

getchar():返回值为字符的ascii值

printf(“格式控制串”,输出表) 格式化符要和输出表一一对应

%d:以十进制输出

%o:以八进制输出

%x:以十六进制输出

#:在进制、十六制前加前缀

%u:以无符号形式输出

%ld:以长整型输出

%c:以字符形式输出

%f:以float形式输出

%e:以指数形式输出

%g:选择小数和指数中较短的形式输出

%m.nf:n决定小数点后的位数 m决定总共有多少位 ,若m小于实际长度则原样输出

 六、三大结构

1 顺序结构

语句按照一定的先后顺序去执行

2 选择结构

2.1 单分支if选择结构

if(表达式)
{
    语句;
}

先判断表达式是否成立,如果成立,就执行语句。

2.2双分支if选择结构

if(表达式)

{

    语句1;

}

else

{

    语句2;

}

先判断表达式是否成立,如果成立,则执行语句1,否则,执行语句2;

3.2.3 多分支if选择结构

if(表达式1)

{

    语句1;

}

else if(表达式2)

{

    语句2;

}

else if(表达式3)

{

    语句3;

}

。。。。

else  if(表达式n)

{

    语句n;

}

else

{

    语句n+1;

}

从上往下,依次去判断表达式是否成立,如果表达式成立,则执行对应的语句

2.4 switch语句

switch(表达式)

{

    case 标号1:

         语句1;

    case 标号2:

         语句2;

    case 标号3:

         语句3;

    。。。。

    case 标号n:

         语句n;

    default:

        语句n+1;

}

注意:

  1. 表达式不能为float类型
  2. 标号必须为常量
  3. 当表达式等于标号时,就冒号后面的语句,直到switch,case语句结束为止,或者遇到break语句结束。

3 循环结构

for循环

for(表达式1(可省略,但在for前要给循环变量赋初值);表达式2(可省略,死循环);表达式3(可省略,要在循环体内实现循环变量的变化))

{

    循环体;

}

 

for的嵌套语句:

 

第一个for循环决定循环多少次

第二个for循环决定每次循环内又循环多少次

七、整型数组与字符数组

整型数组:

一组数据类型相同的元素组和在一起

特点:1、数据类型相同   2、地址连续

定义:存储类型  数据类型  数组名[ 元素的个数 ];

                  比如  int arr[5];

数组的数据类型:int [5];      数据类型:去掉变量名,剩下的就是数据类型;

数组所占的内存空间的大小 = sizeof(数据类型)* 元素的个数

数组名: 1、整个数组

               2、数组首元素的地址

注意:定义数组时,元素的个数必须为一个确定的值(常量/常量表达式)

初始化可以分为部分初始化和全部初始化。

访问:数组名[下标];  注意:下标从0开始;

 冒泡排序:

思想:从左往右,两两依次比较,如果前一个数比后一个数大,就交换位置,反之,不变。

格式: for(i=0;i<N-1;i++)

      {
           for(j=0;j<N-1-i;j++)
           {
               if(a[j]>a[j+1])
               {
                   交换;
               }
           }
      }

字符数组:

字符数组:保存一组char类型的数据

存储类型  数据类型  数组名[元素的个数];

数据类型:数组中元素的数据类型

字符数组的本质就是字符串;

字符串的输出函数:

%s:字符串

printf(“ %s ”, str);

puts(数组名);

功能:将数组中的内容打印到终端,并且自动换行

注意:打印到‘\0结束

puts会自动换行,而printf不会

 字符串的输入函数:

scanf(“%s”,str);

gets(数组名);

功能:将输入的字符串保存在数组中,并且在末尾自动添加‘\0’

注意:gets不会进行越界检查,如果超出范围,就会操作未申请到的内存空间,段错误

出现段错误的原因:非法操作你没有申请的空间。

 求字符串的长度:

strlen(数组名);

功能:求字符串的长度

返回值:求得的字符串的实际长度,不包含’\0’

strlen和sizeof的区别:

  1. strlen求到的是字符串的实际长度,而sizeof求到的是申请到的内存空间的大小
  2. strlen是一个函数,sizeof是一个运算符

 字符串的拷贝函数:

strcpy(数组1,数组2/字符串);

作用:将数组2中的内容拷贝给数组1,包含‘\0’,相当于完全拷贝

注意:数组1的容量要大于数组2

 字符串的连接函数:

strcat(数组1,数组2/字符串);

功能:将数组2中的内容连接到数组1中去,数组1中的’\0’会被覆盖

注意:数组1的容量要足够大(字符串1+字符串2)

 字符串的比较函数:

strcmp(数组1/字符串1,数组2/字符串2);

功能:比较字符串1和字符串2的大小

返回值:

大于0:字符串1 > 字符串2

等于0:字符串1 == 字符串2

小于0:字符串1 < 字符串2

比较规则:从左往右,依次去比较字符串中的每个字符的ascii值,直到遇到不同的ascii码或者遇到‘\0’,结束比较

二维字符数组:

存储类型  数据类型  数组名[行数][列数];

行数:字符串的个数(一维字符数组的个数)

列数:字符串最多可以保存几个字符(一维数组中元素的个数)

 八、函数

1、什么是函数?

具有独立功能的模块

2、为什么使用函数?

1、提高代码的复用率

2、让程序变得模块化、简洁

3、怎样调用函数

函数名(实际参数列表);

注意:

  1. 需要将实参的值拷贝给形参,实参的个数以及数据类型要和形参一致
  2. 实参,可以是变量,常量,表达式,但是必须是一个确定的值
  3. 实参和形参是两块独立的空间
  4. 传参,实际上是将实参的值拷贝给形参
  5. 形参是局部变量,在函数调用时开辟空间,函数调用结束,立即释放

如果函数没有写在main函数之前,就需要声明;

声明:将函数头部直接复制粘贴至main函数之前,然后加上分号

声明的作用:帮助编译器做语法检查。

自定义函数:

存储类型  数据类型  函数名(形式参数列表)

{

    函数体;

}

 

数据类型: 返回值的数据类型(void)(数据类型省略不写,默认是int类型)

函数名: 见名知意

形式参数列表:(由程序员自己去确定!)要实现的功能需要几个参数,以及每个参数是什么类型

函数体:实现具体的功能

返回值:若没有返回值,void;返回值也可以省略,如果省略,默认int类型(返回有且只能有一个)

九:指针 

指针是一种数据类型,它是一种保存地址的数据类型

地址:内存分配的最小单元:字节。每一个字节都有一个编号,我们把这个编号就叫做地址

地址的本质:内存单元的编号

指针:指针就是地址

指针的本质:内存单元的编号

定义:存储类型  数据类型 * 指针变量名;

数据类型:指针指向的数据类型(指针保存的是什么数据类型的变量的地址)

 指针的赋值:

指针的赋值相当于改变指针的指向

(指针赋值时要注意 指针指向的数据类型必须相同)

注意:

在所有的32os操作系统中,所有的指针都占4个字节

在所有的64os操作系统中,所有的指针都占8个字节

 空指针与野指针:

指向零号地址的指针(值为0的指针,就认为该指针没有指向)

注意:零号地址禁止操作

NULL;

野指针:不知道指向哪里的指针

局部变量,没有初始化,随机值

局部指针变量,如果没有初始化,就是野指针

 二级指针:

保存一级指针的地址

定义:存储类型  数据类型  *指针变量名;

数据类型:指针指向的数据类型;(二级指针指向的数据类型:一级指针的数据类型)

总结:

1、指针的数据类型,去掉变量名就是数据类型

2、指针指向的数据类型,去掉的一个*和变量名,剩下的就是指针指向的数据类型

3、指针所能访问到的内存空间的大小,由指向的数据类型决定

指针的算数运算:

p+n:p向地址增大的方向移动了n个数据

p-n:  p向地址见效的方向移动了n个数据

p++:  p向地址增大的方向移动了一个数据 //改变指针的指向

p--:p向地址减小的方向移动了一个数据 //改变指针的指向

p-q:(p和q数据类型必须相同):这两个指针之间相隔的个数

注意:

1、指针的算数运算只有在连续的内存空间中,才有意义。

2、p是指针变量,以上的算术运算也同样应用于指针常量,但是++,--除外

注意:数组名和指针变量的区别:数组名是指针常量::指针常量不可以自加自减!!!

指针和一维数组的关系:

 

 注意:!!在使用指针变量的移动时:一定要注意:指针此时指向了哪里

指针和二维数组的关系:

1、&a、a、&a[0]、a[0]、&a[0][0]的值是一样的,但是表达的含义不一样

a:Int (*) [3] :他是一个指向一维数组的指针  a[0]:指向int类型元素的指针

2、为什么说a不是int**类型?

如果a是int**类型,那么他指向的数据类型应该是int * ,那么a+1,应该移动移动4字节,但是a+1,移动了12字节,移动了一个数组,因此a一定不是int**类型

3、a指向a[0]、a[0]指向a[0][0]

 数组指针:

指向数组的指针   //保存数组的地址

定义:存储类型 数据类型 (* 变量名) [元素的个数];

数组指针和一维数组的关系:

 注意:数组指针一般不去操作一维数组。因为p+1,移动一个数组,就会越界,因此数组指针,一般用数组指针去操作二维数组!

数组指针与二维数组的关系:

 指针数组:

元素为指针的数组

定义; 存储类型  数据类型 * 变量名[元素的个数];

 指针数组和二维数组的关系:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值