c语言基础知识回顾4

今天回顾了语言中的指针,想起指针我就一阵头疼,但是指针是c语言学习中非常重要的知识,掌握了指针就能对c语言更进一步的理解。

1.指针是一个存储计算机内存地址的变量,即指针变量里面存放的是内存地址。

  说到指针必须知道*和&两个操作符

  操作符* 根据出现的位置不同,即可以用来声明一个指针变量,也可以用作指针的取值。当用在声明一个变量时,*表示这里声明了一个指针。其他情况用到*表示指针的取值。

  操作符&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可得到该变量的内存地址。

例:

         int   *p;                               /* 声明一个int 指针 */

         int   n=1;                           /*声明一个int 值*/

         p=&n;                               /*为指针分配一个int 值的内存地址*/

         int  m=*p;                        /*对指针进行取值,打印存储在指针地址中的内容*/

        printf("%d\n",m);            /*输出结果*/


2.说起指针就不得不和数组联系在一起,在c语言中数组的指针就是数组的起始地址(也就是第一个元素的地址)。

例a[10]是一个数组,那么a就是数组名,它包含10个int 类型的数组类型,所以a是数组的地址因为它的第一个元素是a[0],所以&a[0]也是该数组的地址。a+i是距数组a的首地址的第i个偏移,所以p=&a[0]与p=a等价,都是把数组a的首地址赋给p,而*(a+i)与a[i]等价,都是取数组a中第i个元素。

注意:

(1)p[i]和a[i]都是代表该数组的第i+1个元素;

(2)p+i和a+i代表了第i个元素地址,可以使用*(p+i)和*(a+i)来引用对象元素;

(3)p+1不是对于指针数量上加一,而是表示从当前的地址位置跳过当前指针指向类型长度的空间。

对于两个指针变量p q,;

(1)q-p,两个相同类型的指针相减,表示他们之间相隔的存储单元的数目。

(2)p+1/p-1,指向下一个存储单元/指向上一个存储单元,其他操作都是非法的。

(3)p

3二维数组的地址关系:

表示形式                                        含义                                               
a 二维数组名,数组首地址
a[0],(a+0),*a 第0行第0列元素地址
a+1 第一行首地址
a[1],*(a+1) 第1行第0列元素地址
a[1]+2,*(a+1)+2,
&a[1][2]
第1行第2列元素地址
*(a[1]+2),
 *(*(a+1)+2,
a[1][2]
第1行第2列元素的值

4.函数指针:存放函数首地址的变量,称为指向函数的指针变量。

和变量的指针一样,函数的指针也必须赋值后才能指向具体函数。由于函数名代表该函数的首地址,所以可以直接用函数名为函数指针赋值。即:函数指针名=函数名

通过函数指针实现函数调用的步骤:

(1)指向函数的指针变量的定义:

      类型(*函数指针变量名)();

(2)指向函数的指针变量的赋值,指向某个函数:

       函数指针变量名=函数名

(3)利用指向函数的指针变量调用函数:

        (*函数指针变量名)(实参表)。

例如:

    函数定义:

     double fun();

    指向函数的指针变量定义:

     double (*f)();

    f指向fun函数

     f=fun;

    用指针变量调用函数:

    (*f)();

说明:

(1)定义函数指针变量时,两组括号()都不能少。如果少了前面一组括号    返回值类型   *函数名();

       就会变成返回值为地址值(指针)的函数。

(2)函数指针变量的类型是被指向的函数函数的类型,即函数返回值类型。

(3)函数指针的赋值,只要给出函数名,不必给出参数。

(4)用指针变量调用函数时,(*函数指针)代替函数名。参数表与使用函数名调用函数一样。

(5)定义的函数指针变量可以用于指向返回值类型相同的同类函数。







你可能感兴趣的:(c语言基础知识回顾4)