C语言的第4天

来源:互联网 发布:荣耀8 设置网络2g 编辑:程序博客网 时间:2024/06/06 11:41

今天讲了二维数组和函数的基本用法,还讲了一个调试工具gdb

gcc filename.c -g

gdb filename.out

l   列出前10行代码(一次只列出10行)按enter是重复l操作

b 行号/函数名字   设置断点

r运行

n下一条指令

q退出

p 变量名    查看变量里的内容

s 下一步

 

定义一个二维数组

int a[2][3]={{1,2,3},{4,5,6}};

这个二维数组表示的意思是:定义了一个一维数组arr[1],这个数组里有两个元素,每个元素是以3int为单位,即每个元素是12个字节。如图

取二维数组里的内容  如要a[0][1]的值则是*(*a+1)

a[1][2]的值则是*(*(a+1)+1)

*a 二维数组首地址

*a+1 首地址加一个int单元(加1是基类型单元)这样就到了 a[0][1]的地址.即内容是2的地址。

*a+1由于二维数组是以3int为单位的,即*(a+1)就由a[0]a[1],即到了内容是4的地址

*(a+1)+1到了a[1]里面,加上一个 int单位,就到了内容是5的单元的地址。即**(a+1)+1)是取的5。如图

数组的名字是一个常量。

数组的名字就是数组的首地址。

始终要记得访问方式。

int (*a)[3]   把访问a地址里内容是以3int字节为一个单元。

int (*b)[3];

       b=&[0][1];

       printf(“%d\n”,*(*(b+1)+1));

 

   *(b+1) 由于b是以三个int为一个单元访问,即一次访问12个字节。即跳过3,4直接由2跳到了5,即为内容为5的地址

*(b+1)+1现在是以1int为单元的访问,即跳到内容为6的地址,也就是**b+1+1)的取值是为6。 如图

 

 

 

 

*****************************************************************************

 

下面摘抄自谭浩强的C程序设计(第三版)中的指针与函数部分内容

 

 

 

 

 

注意:

1.       指针变量前面的*表示变量的类型为指针型的变量。指针变量名是pointer_1,pointer_2,而不是*pointer_1,*pointer_2.这是与定义整型或浮点型变量的形式不同的。

2.       定义指针变量是必须定义指定基类型。不同类型的数据在内存中所占的字节数是不同的。一个指针变量只能只向同一个类型的变量。

 

3.       指针变量中只能存放地址(指针),不要将一个整数(或其他任何非地址类型的数据)赋予一个指针变量。

4.       指针运算符的优先级相同,但运算顺序是自右向左。&*point_1&a相同,都是变量a的地址。  *&a*point_1的作用是相同的,都是等价于变量a

5.       函数的参数不仅可以是整型,浮点型,字符型等数据,还可以是指针类型。他的作用是将一个变量的地址传送到另一个函数中。

 

 

*****************************************************

1.一个较大的程序一般应分为若干个程序模块,每个模块用来实现一个特定的功能。

2.一个C程序可由一个主函数和若干个其他函数组成。由主函数调用其他函数,其他函数也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。

3.一个C程序由一个或多个程序模块组成,每个程序模块作为一个源程序文件。一个源文件由一个或多个函数以及其他相关内容(命令行,数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以文件为单位进行编译的。

4.C程序的执行时从main函数开始的,如是在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。

5.所有函数都是平行的,即在定义函数时是分别进行的,是相互独立的。一个函数并不属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。Main函数是系统调用的。

6.函数有两种:⑴  标准函数。标准函数即库函数,它是由系统提供的,用户不必自己定义而直接使用。⑵用户自定义函数,它是用以解决用户专门需要的函数。

7.从函数的形式看,分两类:⑴  无参函数。在调用无参函数时,主调函数不向北调函数传递数据。无参函数一般用来执行指定的一组操作,可以带回或不带回函数值。⑵有参函数。在调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调用函数使用。

 

 

 

无参函数定义的一般形式

类型标示符函数名()

{

声明部分

语句部分

}

    

                   void printstar(){          /*对函数printstar函数的定义*/

printf(“*****************\n”);

}

 

 

 

 

有参函数定义的一般形式

类型标示符函数名(形式参数列表)

{

声明部分

语句部分

}

 int max(int x,int y){

                   Int z;             /*函数的声明部分*/

                   z=x>y?x:y;

                   return(z);

}

         这是一个求xy二者中大者的函数,第一行第一个关键字int标示函数值是整型的。Max是函数名。括号中有连个形式参数xy,他们都是整型的。在调用此函数式,主调函数把实际参数的值传递给被调函数中的形式参数xy。大括号内是函数体,它包括声明部分和语句部分。声明部分包括对函数中用到的变量进行定义以及对要调用的函数进行声明等内容。在函数体的语句中求出z的值,returnz)的作用是将z的值作为函数值带回到主调函数中。Return后面的括号中的值(z)作为函数带回的值(称为函数返回值)。在函数定义时已指定max函数为整型,在函数体中定义z为整型,二者是一致的,将z作为函数max的值带回调用函数。

         如果在定义函数时不指定函数类型,系统会隐含指定函数类型为int型。因此上面定义的max函数左端的int可以省写。

 

 

 

在定义函数时函数名括号中的变量名称为形参;在调用一个函数时,函数名括号中的参数称为实参。

1.       在定义函数中指定的形参,在未出现函数调用时,它并不占内存中的存储单元。只有在发生函数调用时,函数max中的形参才被分配内存单元。调用结束后,形参所占的内存单元也被释放。

2.       实参可以是常量,变量或表达式。但要求他们有确定的值。在调用时将实参的值赋予形参。

3.       在被定义的函数中,必须指定形参的类型。

4.       实参与形参的类型应相同。

5.       实参向形参的数据传递是值传递,单向传递,只由实参传给形参,而不能由形参传回来给实参。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值。

 

 

 

函数的返回值

通过函数调用使主调函数能得到一个确定的值。

1.       函数的返回值是通过函数中的return语句得到的。Return语句将被调用函数的一个确定值带回主调函数中去。

2.       如果需要从被调函数带回一个函数值(供主调函数使用),被调函数中必须包含return语句。如果不需要从北调函数带回函数值可以不要return语句。一个函数中可以有一个以上的return语句,执行到哪一个return语句,那个语句起作用。Return语句后面的括号也可以不要,后面的值可以是一个表达式。

3.       函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型。应当在定义函数时指定函数值的类型。在C语言中,凡是不加类型说明的函数,自动按整型处理。

4.       在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准,函数类型决定函数返回值的类型。

5.       对于不带回值的函数,应当用void定义函数为无类型(或称空类型)。这样,系统就保证不使函数到会任何职,即禁止在调用函数中使用被调函数的返回值。此时在函数体中不得出现return语句。

 

 

函数的调用的一般形式

 函数名(实参表列);

如果是调用无参函数,则实参表列可以没有,但括号不能省略。如果实参表列包含多个实参。则各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配。实参与形参按顺序对应,一一传递数据。

函数调用的方式

1.       函数语句,把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定的操作。

2.       函数表达式,函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。

3.       函数参数,函数调用作为一个函数的实参。

 

 

 

 

 

对北调函数的声明和函数原型

1.       北调函数必须是已经存在的函数(库函数或用户自己定义的函数)。

2.       如果使用库函数,还应该在本文件开头使用#include命令将调用有关库函数时所需要的信息包含到本文件中来。

3.       如果使用用户定义的函数,而该函数的位置在调用它的函数(主调函数)的后面(在同一个文件中),应该在主调函数中对北调函数作声明。

 

 

函数的声明的作用是把函数名,函数参数的个数和参数类型等信息通知编译系统,一遍在于到函数调用时,编译系统能正确识别函数并检查调用是否合法。

 

 

 

在函数声明中也可以不写形参名,而只写形参的类型。编译系统值检查参数个数和参数类型,而不检查参数名。

 

 

函数的定义的作用是对函数功能的确立,包含指定函数名,函数值类型,形参及其类型,函数体等。它是一个完整的独立的函数单位。

 

 

0 0