c语言的基础概念和简单语法

目录

第一章:了解C语言及一些基本概念

第二章:算法——程序的灵魂

第三章——顺序程序设计

第四章:选择结构程序设计

第五章:循环结构程序设计

第六章:利用数组处理批量数据

第七章:用函数实现模块化程序

第八章:善于利用指针


第一章:了解C语言及一些基本概念

1、所谓程序,就是计算机能够识别和执行的指令。

2、机器语言,计算机工作基于二进制,从根本上讲,计算机只能识别和接受由0和1组成的指令。

3、计算机能直接识别和接受的二进制代码称为机器指令。

4、机器指令的集合就是该计算机的机器语言。符号语言是为了克服机器语言的一些缺点,符号语言就是用一些英文字母和数字表示一个指令。

5、汇编语言:汇编程序软件把符号语言的指令转换为机器指令,一般,一条符号语言的指令对应转换为一条机器指令。转换的过程称为“代真”或者“汇编”,因此,符号语言又称为符号汇编语言或汇编语言。低级语言中不同型号的计算机的机器语言和汇编语言是互不相同的。

6、高级语言的语言功能很强,且不依赖于具体机器,用它写出来的程序对任何型号的计算机都适用(或只需做很少的修改),它与具体机器距离较远,故称为高级语言。高级语言需要通过编译程序把软件的高级语言写的程序(源程序)转换为机器指令的程序(目标程序),然后让计算机执行机器指令程序。

7、高级语言的三个发展阶段:(1)非结构化语言是语言发展的初期,编程风格比较随意,只要符合语法规则即可,没有严格的规范要求,程序中的流程可以随意跳转。但难以阅读和维护。

(2)结构化语言:为了解决非结构化的问题,提出了“结构化程序设计方法”,规定程序必须由具有良好特性的基本结构(顺序结构、循环结构、选择结构)构成,程序中的流程不允许随意跳转,程序总是由上而下顺序执行各个基本结构。c属于结构化语言。

(3)面向对象的语言:近十多年来,在处理规模较大的问题时,开始使用面向对象的语言。c++、c#、Visual Basic和Java等语言是支持面向程序设计方法的语言。

8、c语言的一些特点:(1)语言简洁紧凑,使用方便、灵活;(2)运算符丰富;(3)数据类型丰富;(4)具有结构化的控制语句,用函数作为程序的模块单位,便于实现程序的模块化。c语言是完全模块化结构化的语言;(5)语法限制不太严格,程序设计自由度大:(6)c语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可直接对硬件进行操作。(7)用c语言编写的程序可移植性好。(8)生成目标代码质量高,程序执行效率高。

9、分析一下最简单的c语言程序分析“Hello world!”

# include <stdio.h>    //编译预处理命令
int main              //定义主函数
{                       //函数开始的标志
    print ("Hello world.\n");    //输出所指定的信息
    return 0;    //函数执行完毕时返回函数值0
}                函数结束的标志

main是函数的名字,表示“主函数”,main前面的int表示此函数的类型是int类型。在执行主函数之后会返回一个值,其值为整形。return 0的作用是,当main函数执行结束前将整数0作为函数值(当函数正常结束时,得到的函数返回值为0,当执行main函数过程中出现异常或执行错误时函数值为一个非零的整数这个函数值是返回给调用main函数的操作系统,借此可以判断函数是否正常执行)。每一个c语言程序都必须有一个main函数。函数体由花括号{ }括起来。printf是输出函数,\n是换行符,每个语句最后都有一个分号,表示语句结束。在程序中只要用到标准函数库中的输入输出函数,应该在本文件模块的开头下面加一行“#include <stdio.h>”。

10、注释在程序进行预编译处理时会被替换成空格,因此在编译时不会产生目标代码。注释的两种方式:(1)//单行注释,以//开头,以换行符结束,不能跨行。(2)以/*开始,以*/结束的块式注释,可多行可单行。编译器在发现第一个/*时,会开始找注释结束符*/,把二者之间的内容作为注释。

11、c语言程序结构

(1)一个程序由一个或多个源程序文件组成。源程序文件可以包括以下三部分;

预处理指令:c编译系统在对源程序进行翻译之前,先有一个预处理器(预编译器)对预处理指令进行预处理,对于#include <stdio.h>指令来说,就是将stdio.h头文件内容读进来,取代#include <stdio.h>。由预处理得到的结果与程序其他部分一起,组成一个完整的、可用来编译的最后的源程序,然后由编译程序对该源程序正式进行编译,才得到目标程序。

全局声明:即在函数之外进行的数据说明。在函数外面声明的变量称为全局变量、在程序开头(定义函数之前)声明的变量在整个源程序文件内有效、在函数中声明的变量只在函数范围内有效,称为局部变量。

函数定义:指定每个函数的功能,在调用该函数时便会完成函数定义中的功能。

(2)函数是c程序的主要组成部分,程序的绝大部分工作都是靠各个函数来完成的,函数是c程序的基本单位。c程序由一个或多个函数组成,且必须包含一个main函数(且只有一个main函数)。可以调用系统提供的库函数(例如printf和scanf函数),也可以根据自己需要编制设计函数。

(3)一个函数包括两个部分

函数首部:即函数第一行,包括函数名、函数类型、函数属性、函数参数(形式参数)名、参数类型。一个函数名后面必须跟一对圆括号,括号内写函数的参数名及类型,如果函数没有参数,可以在括号中写void,也可以是空括号。

int max (int a,int b)

 函数体:函数首部下面花括号内的内容,如果函数中包括有多层花括号,则最外面的一层花括号是函数体的范围。函数体分为声明部分和执行部分。声明部分包括定义在本函数中所用到的变量和对本函数所调用函数进行声明。执行部分由若干个语句组成,指定在函数中所进行的操作。

(4)程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何。

(5)程序中要求计算机的操作是由函数中的c语句完成的。

(6)在每个数据声明和语句的最后必须有一个分号。

(7)c语言本身不提供输入输出语句。

(8)程序应当包含注释。

12、运行c程序的步骤和方法

(1)上机输入和编辑源程序,源程序文件用.c作为后缀保存。

(2)预编译和正式编译,检查语法错误。

(3)进行连接处理(通过连接编译程序),一个程序包含若干个源程序,而编译是以源程序文件为对象的(一次编译一个源程序),所以要将编译后的目标模块连接装配起来,再与函数库相连接就能生成一个可供计算机执行的目标程序,称为可执行程序。

(4)运行可执行程序,得到运行结果。

13、程序设计的任务

问题分析;设计算法;编写程序;对源程序进行编辑、编译和连接得到可执行程序;运行程序,分析结果;编写程序文档;

第二章:算法——程序的灵魂

1、程序=算法+数据结构

数据结构:对数据的描述,在程序中需要用到那些数据,以及这些数据的类型和数据的组织形式。

算法:对操作的描述,要求计算机进行操作的步骤。

2、一个有效算法应该具有以下特点:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性。

3、表示算法的几种方法

(1)用自然语言表示算法,虽然通俗易懂,但文字冗长,易出现歧义。

(2)用流程图表示算法,直观形象,易于理解。流程图表示算法的三种基本结构:顺序结构、选择结构和循环结构。循环结构分为当型(while)循环结构和直到型(until)循环结构。

(3)用N-S流程图表示算法

(5)用伪代码表示算法,伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。

(6)用计算机语言表示算法。

4、结构化程序设计方法

(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码;

第三章——顺序程序设计

1、数据的两种表现形式——常量和变量

转义字符及其作用:

转义字符字符值输出结果
\'一个单撇号(')输出单撇号字符
\''一个双撇号(')输出双撇号字符
\?一个问号(?)输出问号字符
\\一个反斜线(\)输出反斜线字符\
\a警告(alert)产生声音或视觉信号
\b退格(backspace)将光标当前字符后退一个字符
\f换页(from feed)将光标当前位置移到下一页的开头
\n换行将光标当前位置移到下一行的开头
\r回车(carriage return)将光标当前位置移到本行的开头

\t

水平制表符将光标当前位置移到下一个Tab位置
\v垂直制表符将光标当前位置移到下一个垂直制表对齐点
\o、\oo或\ooo其中o代表一个八进制数字与该八进制码对应的ASCII字符与该八进制码对应的字符
\xh[h...]其中h代表一个十六进制数字与该十六进制码对应的ASCII字符

与该十六进制码对应的字符

2、c语言允许使用的数据类型

%u表示用无符号十进制数的格式输出;

%d表示用十进制整数的形式输出;

%o表示以八进制输出;

%x以十六进制数形式输出整数,或输出字符串的地址;

%c表示用字符形式输出;

%s表示输出字符串;

%p输出地址;

3、基本的算术运算符:+正号运算符(单目运算符)、-负号运算符(单目运算符)、*乘法运算符、/除法运算符、%求余运算符、+加法运算符、-减法运算符、++自增、--自减。

4、算术表达式和运算符的优先级与结合性(这里面是详细运算符和结合性表)CSDN

5、强制类型转换运算符一般形式为(类型名)(表达式):(int)(x+y)将 x+y的值转换为int型。

6、c语言中的9种控制语句

(1)if()···else···        条件语句

(2)for()···        循环语句

(3)while···        循环语句

(4)do···while···        循环条件

(5)continue        结束本次循环语句

(6)break        终止执行switch语句或循环语句

(7)switch        多分枝循环语句

(8)return        从函数返回语句

(9)goto        转向语句,在结构化程序中基本不用goto语句

注:()是判别条件···是内嵌的语句

7、赋值语句

赋值运算符“=”,复合的赋值运算符“a+=3”等价于“a=a+3”,赋值表达式“a=3+5”一般左值是变量,右值可以是变量可以是常量,将右值经过处理后赋值给左值。

8、程序文件开头用预处理指令#include把有关头文件放在本程序中,stdio.h头文件中存放了调用标准输入输出函数时所需要的信息,包括与标准I/O库有关的变量定义和宏定义以及对函数的声明。在预编译处理时,系统会把在该头文件中存放的内容调出来,取代本行的#include指令。调用不同的库函数,应当把不同的头文件包含进来。

9、printf的一般格式为:printf(格式控制,输出列表),格式控制用双撇号括起来,包含格式声明和普通字符。输出列表是程序需要输出的一些数据,可以是常量、变量和表达式。

printf("a=%d,b=%d\n",x,y);    //若a=2,b=3的话输出为a=2,b=3

printf函数中用到的格式字符

d,i以带符号的十进制形式输出整数(正数不输出符号)
o以八进制无符号形式输出整数(不输出导符0)
x,X以十六进制无符号形式输出整数(不输出导符0x),用x则输出十六进制数的a~f时以小写形式输出,用X时,则以大写字母输出
u以无符号十进制形式输出整数
c以字符形式输出,只输出一个字符
s输出字符串
f以小数形式输出单、双精度数,隐含输出六位小数
e,E以指数形式输出实数,用e时指数以“e”表示(如1.2e+02),用E时指数以E表示(如1.2E+02)
g,G选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0。用G时,若以指数形式输出,指数以大写表示
l长整型整数,可加在格式符d、o、x、u前面
m(代表一个正整数)数据最小宽度
n(代表一个正整数)对实数,表示输出n位小数;对字符串,表示截取的字符个数
输出的数字或字符在域内向左靠

10、scanf函数的一般形式:scanf(格式控制,地址列表),格式控制的含义与printf函数中的相似,地址列表是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。使用scanf应注意:(1)变量地址加“&”;(2)格式控制字符串中除格式声明外的其他字符在输入时要对应输入相同字符;(3)%c格式声明字符时,空格字符和转义字符中的字符都作为有效字符输入。(4)在输入数值数据时,如输入空格、回车、Tab键或遇非法字符(不属于数字的字符)认为该数据结束。

scanf函数中用到的格式字符

d,i输入有符号的十进制整数
o输入无符号的八进制整数
x,X输入无符号的十六进制整数(大小写作用相同)
u输入无符号的十进制整数
c输入单个字符
s输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志'\0'作为其最后一个字符
f输入实数,可以用小数形式或指数形式输入
e,E,g,G与f作用相同,e与f、g可以互相替换(大小写作用相同)
l

输入长整型数据(可用%ld,%lo,%lx,%lu)以及double型数据(用%lf或%le)

h输入短整型数据(可用%hd,%ho,%hx)
域宽指定输入数据所占宽度(列数),域宽应为正整数
*本输入项在读入后不赋给相应的变量

11、putchar和getchar字符输入输出函数。putchar(c)中的c可以是字符常量、整型常量、字符变量或整型变量(其值在ASCII代码范围内)。getchar函数没有参数,它的作用是从计算机的终端输入一个字符,即计算机获得一个字符。getchar只能接收一个字符。

第四章:选择结构程序设计

1、if语句常见的三种形式

(1)if (表达式) 语句1
(2)if (表达式)
    语句1
else
    语句2
(3)if (表达式1)    语句1    //else部分嵌套了多层的if语句
else if(表达式2)    语句2
else if(表达式3)    语句3
·                    ·
·                    ·
·                    ·
else if(表达式m)    语句m
else                语句m+1

2、关系运算符和关系表达式;重点是其优先次序,下面链接中有概括。CSDN

3、在c的逻辑运算中,以1代表真,以0代表假,但在判断一个量是否为真时,以0代表假,以非0代表真。逻辑运算符的优先次序也在上面链接。在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。

c逻辑运算符及其含义
&&逻辑与(AND)同真为真,否则为假
||逻辑或(OR)一真则真,同假则假
逻辑非(NOT)假作真,真作假

4、条件运算符和条件表达式,条件运算符是c语言中唯一的一个三目运算符,其一般形式为:

表达式1?表达式2:表达式3(先求解表达式1,若为真则求解表达式2,否则求解表达式3)。

5、选择结构的嵌套,注意if与else的配对关系,else总是与它上面的最近的未配对的if配对,也可加花括号来确定配对关系。

if()
    if()    语句1
    else    语句2
else
    if()    语句1
    else    语句2

6、switch多分支选择语句一般形式如下

switch(表达式)
{
    case    常量1:语句1    //其表达式的值应为整数类型(包含字符类型)
    case    常量2:语句2    //case后跟常量或常量表达式
    ·        ·
    ·        ·
    case    常量n:语句n
    default:    语句n+1    //可以没有default标号,若全部匹配不到,则不会执行任何语句,自动转到下一语句
}

第五章:循环结构程序设计

1、while语句的一般形式为:while(表达式)语句,只要当循环条件表达式为真(即给定的条件成立)、就执行循环体语句。特点是先判断后执行。循环体如果包含一个以上的语句应该用花括号括起来,作为复合语句出现。

2、do···while循环语句的特点为先循环后判断。

do
    语句
while(表达式);

3、for循环语句的一般形式为

for(循环变量赋初值;循环条件;循环变量增值;)
    语句

如果有固定次数用for循环,必须执行一次用do···while,其他可用while。不同循环之间本质上可相互替换和嵌套。

4、break跳出循环,continue结束本次循环,继续执行下一次循环。

第六章:利用数组处理批量数据

1、数组是一组有序数据的结合,用一个数组名和下标来唯一地确定数组中的元素,数组中的每一个元素都属于同一个数据类型。定义一维数组的一般形式为:类型符  数据名[常量表达式];数组名的命名规则与变量名相同,即只能由数字、字母、下划线组成且数字不能在首位;在定义数组时需要指定数组中元素的个数,方括号中的常量表达式用来表示数组中元素的个数。常量表达式中可以包括常量和符号常量但不能包括变量。

引用数组元素的表示形式为:数组名 [下标];

int a[10];    //定义数组
t=a[6];    //引用数组    

一维数组的初始化:即给数组元素赋值,未赋值的系统会自动把他们初始化为0,若是指针型数组,则初始化为NULL(空指针)。

2、二维数组的定义和引用

二维数组常称为矩阵,可写成行和列的排列形式其一般形式为:类型说明符  数组名[常量表达式][常量表达式];二维数组中元素排列的顺序是按行存放的。二维数组的行列关系是逻辑上的概念,在实际内存中,各元素是连续存放的,是线性的。

float  a[3][4],b[5][6];    //定义a为3行4列的数组,b为5行10列的数组;
a[3][2]    //引用数组中3行2列的元素

二维数组的初始化

int a[3][4]={{1,2,3,4}{6,4,6,7}{6,11,14,9}}    //分行给二维数组赋初值
int a[3][4]={1,2,3,4,6,4,6,7,6,11,14,9}    //按排列顺序赋初值
int a[3][4]={{1},{5},{9}}    //部分赋初值,只对各行第一列元素赋初值,相对与后面三个0省略了
int a[3][4]={1,2,3,4,6,4,6,7,6,11,14,9}    //对全部元素赋初值时,一维长度可省略

3、字符数组是用来存放字符数据的,定义方法与数值型数组类似

char c[6]={'I',' ','l','o','v','e'};    //字符数组的初始化注意空格

注:c系统在用字符数组储存字符串常量时会自动加一个'\0'作为结束符。(\0在ASCII码中代表空操作符)。若用scanf键入字符串的话不需要加&地址符,因为在c语言中数组名代表该数组第一个元素的地址。

字符数组的输入输出可以有两种方法:(1)用“%c”逐个字符输入输出;(2)用“%s”将整个字符串一次输入或输出。

4、使用字符串处理函数“在使用字符串处理函数时头文件应该为#include <string.h>”(1)puts输出字符串的函数——puts (字符数组);(2)gets输入字符串函数——gets(字符数组);用puts和gets都只能输入或输出一个字符串。(3)strcat字符串连接函数——strcat(字符数组1,字符数组2),把字符串2连接到字符串1后面,结果放在字符数组1中。(4)strcpy和strncpy字符串复制函数——strcpy(字符数组1,字符串2),其作用是将字符串2复制到字符数组1中去。(5)strcmp字符串比较函数——strcmp(字符串1,字符串2),其作用是比较字符串1和字符串2,比较规则是两字符串自左至右逐个字符比较(按ASCII码值大小比较),直到出现不同字符或遇到“\0”为止。若字符串1与字符串2的值相同则函数值为0,字符串1>字符串2,函数值是一个正整数,小于的话函数值是一个负整数。(6)strlen测字符串长度的函数——strlen(字符数组),函数的值为字符串的实际长度,不包括‘\0’在内。(7)strlwr转换为小写的函数——strlwr(字符串),将字符串中大写字母转换为小写字母(8)strupr转换为大写的函数——strupr(字符串)。

第七章:用函数实现模块化程序

1、本质意义上函数就是用来实现某种功能的。一个较大程序,往往分成若干个程序模块,每一个模块包含一个或多个函数,每个函数实现一个特定的功能。一个c程序可以由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。函数不能嵌套定义。

2、从函数的形式来看,函数分为无参函数和有参函数;(1)无参函数是在调用时,主调函数不向被调用函数传递数据,带回不带回函数值都可;(2)有参函数是主调函数在调用时,通过参数向被调用函数传递数据,一般执行被调用函数时会得到一个函数值,供主调函数使用。

3、定义函数需要包括:(1)函数名;(2)函数类型;(3)函数名和类型是为了在调用函数时方便传递数据,无参函数不需要;(4)函数功能;

4、定义函数的方法:(1)定义无参函数

类型名 函数名()或(void)
{
    函数体    //函数体包含声明部分和语句部分
}

(2)定义有参函数

类型名 函数名 (形式参数列表)
{
    函数体    //包含声明部分和语句部分
}
int max(int x,int y)
{    
    int z;        //声明
    z=x>y?x:y;    //执行语句
    return(z);    //将z值返回主调函数
}

(3)定义空函数,空函数用来为将来扩充功能做准备,先占好位置。

类型名 函数名()
    { }        //无实际作用

5、调用函数

函数调用的一般形式——函数名(实参列表):按函数调用在程序中出现的形式和位置来分,有以下三种函数调用方式(1)函数调用语句,把函数当做一个单独语句使用,不要求函数带回值,只要求函数完成一定的操作。(2)函数表达式,函数调用出现在另一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。(3)函数参数,函数调用作为另一个函数调用时的实参。当作为函数表达式或函数参数,函数调用本身时不必有分号的。

6、函数调用时的数据传递,在调用有参函数时,主调函数和被调用函数之间有数据传递关系。

形式参数:在定义函数时函数名后面括号中的变量名称为“形式参数(形参)”或“虚拟参数”。 实际参数:在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数(实参)”,可以是常量、变量、表达式。在调用函数时,系统会把实参的值传递给被调用函数的形参,即形参是从实参处得到的值,该值在函数期间有效,可以参加该函数中的运算。

7、函数的返回值:(1)函数的返回值是通过函数中的return语句获得的。将被调用函数中的一个确定值带回到主调函数中去。(2)函数返回值的类型:double min(int x,int y)函数值为双精度型。(3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。(4)对于不带返回值的函数,应当定义函数为“void”类型。

8、函数的声明和定义:函数的定义是指对函数功能的确立,包括指定函数名,函数值类型,形参及其类型以及函数体等,是一个完整的,独立的函数的单位。而函数声明则是把函数的名字,函数类型以及形参的类型,个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查,不包含函数体。

9、数组作为函数参数,调用参数时,需要提供实参(实参可以是常量、变量、表达式)数组元素的作用与变量相当,一般来说,凡是变量可以出现的地方,都可以用数组元素代替。因此,数组元素也可以用作函数实参,其用法与变量相同,向形参传递数组元素的值。数组名也可以用作实参和形参,传递的是数组第一个元素的地址。

10、局部变量和全局变量:局部变量也称为内部变量,是在函数内部作定义说明的,其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。全局变量也称为外部变量,在函数外部定义的变量,它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。如果不对全局变量进行初始化,那么它会自动初始化为零。外部变量与内部变量重名时,外部变量会被自动屏蔽不起作用。extern关键字可以先使用后定义全局变量。

11、变量的存储方式和生存期

内存中供用户使用的存储空间分为:程序区、静态内存区、动态内存区。静态存储区的数据在程序执行过程中占据固定的存储单元,而动态存储区是不断的进行分配和释放。在c语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。存储类别指的是数据在内存中存储的方式,一般在定义和声明变量和函数时,应同时指定其数据的两个属性(若不指明存储类型的话,系统会自动指定一种存储类别)。

static int a;    //静态局部整型变量或镜态外部整型变量

12、把建立存储空间的声明称定义,把不需要建立存储空间的声明称作声明。

第八章:善于利用指针

1、指针就是c语言中信息(一般包括位置信息和所指向数据的类型信息)存储的地址,对变量的访问都是通过地址进行的。

2、指针变量:专门用来存放另一变量的地址(即指针)的变量,定义指针变量时左侧应有类型名“类型名 *指针变量名”;

char *la;//定义一个指向字符型的指针变量

int *sb;//定义一个指向整型的指针变量

3、获取某个变量的地址,可以使用取地址运算符&

char *la=&a;

如果需要访问指针变量指向的数据,可以使用取值运算符*

printf("%c,%d",*la,*sb);

避免访问未初始化的指针(野指针)

4、当函数的参数是指针类型时,它的作用是将一个变量的地址传送到另一个函数中。

5、指针和数组的关系:数组名是数组第一个元素的地址

指向数组的指针

char a[5];//定义数组
char *p;//初始化指针
p=a;或p=&a[0];//指向数组名或数组的首地址都能指向该数组

6、对指针加减运算相当于指向距离指针所在位置向前或向后第n个元素;对比标准的下标访问数组元素,使用指针进行间接访问的方法叫作指针法。

例:p+1并不是将地址加1,而是指向数组的下一个元素。(根据定义的类型长度加1个单位的int、char...)

7、指针数组和数组指针的区别
int *p1[5]   指针数组 是数组 变量类型指针int *

int (*p2)[5] 数组指针 是指针 指向一个数组(注意运算符的优先级问题)

8、指针和二维数组
数组array[4][5]

*(array+1)==array[1]指向数组第二行第一个元素

*(array+1)+3==&array[1][3] 指向数组第二行第4个元素

结论

*(array+i)==array[i]

*(*(array+i)+j)==array[i][j]

*(*(*(array+i)+j)+k)==array[i][j][k]

9、void指针和NULL指针
void指针 称为通用指针,可以指向任意类型的数据。也就是说任何类型的指针都可以赋值给void指针。

NULL指针 当你不清楚将指针初始化为什么地址时,可将它初始化为NULL,在对指针进行解引用时,先检查该指针是否为空。

#define NULL ((void *)0)  不指向任何数据

10、指向指针的指针
int num=520;

int *p=&num;

int **pp=&p;两次解引用

好处:

避免重复分配内存

只需进行一次修改

11、常量和指针

const关键字用来定义常量,被const修饰后即使是变量值也无法改变。

指向常量的指针——指针可以修改为指向不同的变量、指针可以修改为指向不同的变量、可以通过解引用来读取指针指向的数据、不可以通过解引用来修改指针指向的数据;

常量指针

指向非常量的常量指针——指针自身不可被修饰、指针指向的值可以被修改

指向常量的常量指针——指针自身不可以被修改、指针指向的值也不可以被修改

12、参数和指针
形参 形式参数函数定义时的参数,相当于一个占位符,无实际数据,函数内部有效。

实参 实际参数,具体的值。

传值和传址的区别:传值的话在不同函数中函数值不同作用域的时候情况是不同的。传址相当于把这个函数值的根都复制了过去,不受作用域的影响。

可变参数

#include <stdio.h>
#include <stdarg.h>//可变参数头文件
int sum(int n, ...);//...说明参数个数不确定
int sum(int n, ...)
{
	int i,sum=0;
	va_list vap;//定义参数列表
	va_start(vap,n);//定义宏
	for(i=0;i<n;i++)
	{
		sum +=va_arg(vap,int);//获取后面参数的值
	}
	va_end(vap);//关闭参数列表
	return sum;
	
}
int main()
{
    int result;
    result=sum(3,1,2,3);
    printf("result=%d\n",result);
    return 0;
}

13、指针函数和函数指针
指针函数:用指针变量作为函数的返回值

int *f()
char *f1(char c)
{
return "字符串"
}//用char类型的指针来定义字符串,因为字符数组只要指名开头地址,结尾是\0自动判断

不要返回局部变量的指针

函数指针

#include <stdio.h>
int square(int);
int square(int num)
{
	return num * num;
}
int main()
{
	int num;
	int(*fp)(int);
	printf("请输入一个整数:");
	scanf("%d\n",&num);
	fp=square;//函数名相当于地址进行传递也可写成fp=&square
	printf("%d*%d=%d\n",num,num,(*fp)(num); 

	return 0;
}
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值