您的位置:首页 > 其它

指针

2013-11-05 21:15 197 查看
[b]指针
 
Int p;    //这是一个普通的整型变量[/b]
Int *p;   //从右往左,首先从p处开始,先与*结合,说明p是一个指针,然后再与int结合,说明指针所指向的内容的类型是int型,所以p是一个返回整型数据的指针
Int p[3];//首先从p开始,与[
]结合,说明p是一个数组,然后与int结合,说明数组里的元素是整型的,所以p是一个由整型数据类型组成的数组

Int *p[3]; //首先从p开始,先与[ ]结合,因为优先级比*高,所以p是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int结合,说明指针所指向的内容的类型是整型,所以p是一个由返回整型数据的指针所组成的数组
Int (*p)[3]; //首先从p出开始,先与*结合,说明p是一个指针,然后再与[
]结合,说明指针所指向的内容是一个数组,然后再与int结合,说明数组里的元素是整型的。所以p是一个指向由整型数据组成的数组的指针

Int **p; //首先从p开始,先与*结合,说明p是一个指针,然后再与*结合,说明指针说指向的内容是指针,然后再与int集合,说明该指针说指向的元素是整型数据。
Int p(int);//从p处起,先与( )结合,说明p是一个函数,然后进入(
)里分析,说明该函数有一个整型变量的参数,然后再与外面的int结合,说明函数的返回值是一个整型数据

Int (*p)(int);//从p处开始,先与指针结合,说明p是一个指针,然后与(
)结合,说明指针指向的是一个函数,然后再与( )里的int结合,说明函数有一个int型的参数,再与最外层的int结合,说明函数的返回类型是整型,所以p是一个指向有一个整型参数且返回类型为整数类型的函数的指针

1、细说指针
指针是一个特殊的变量,它里面存储的数据被解释成为内存里的一个地址。要搞清楚一个指针需要搞清楚指针的四个方面:指针的类型、指针所指向的类型、指针的值或者指针所指向的内存区、指针本身所占据的内存区。
 
指针的值是指针本身存储的数值,这个值被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址都是32位长。指针所指向的内存就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。
 
指针本身占了多大的内存?用sizeof函数,在32位平台里,指针本身占据了4个字节的长度。
 
两个指针不能执行加法运算,是非法操作,因为相加后得到的结果指向一个不可知的地方,没有意义。两个指针可以进行减法运算,但类型必须相同,一般用在数组方面。
 
&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址,就是a的地址。
*p的运算结果p所指向的东西,类型是p指向的类型,占用的地址是p所存储的地址。
Int *p;p++;p+=2;这类运算意味着给指针持有的地址值增加了该类型两个对象的长度。假设一个char是一个字节,一个int是4个字节,double是8个字节,指针加2是给持有的地址值增加2、8、还是16,完全取决于指针的类型是char、int、还是double。指针算数运算的典型用法是遍历一个数组。

2、       指针数组和数组指针
数组指针定义为int (*p)
;
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说p的步长是n。也就是说p+1时,p要跨过n歌整型数据的长度。
如果是二维数组赋给一个指针。
Int a[3][4]; int (*p)[4];p=a;p++;
这个语句是a的首地址赋给p,p++后,p跨过了行a[0][
]指向了a[1][ ]
 
指针数组定义是int *p

[ ]的优先级高,先与p结合为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。在这里p+1是错误的,这样赋值也是错误的,如:p=a;因为p是一个不可知的表示,只存在p[0],p[1]…而且它们分别是指针变量可以用来存放变量地址。
 
数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形石存储在内存中,占有多个指针的内存空间。

3、指针函数与函数指针

【函数指针】

       在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。

1.函数指针定义

函数类型 (*指针变量名)(形参列表);

“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定义函数指针时请注意:

    

函数指针和它指向的函数的参数个数和类型都应该是—致的;

函数指针的类型和函数的返回值类型也必须是一致的。

2.函数指针的赋值

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

例如,

int func(int x);   /* 声明一个函数 */

int (*f) (int x);    /* 声明一个函数指针 */

f=func;            /* 将func函数的首地址赋给指针f */

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

3.通过函数指针调用函数

函数指针是通过函数名及有关参数进行调用的。

与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf就等价于它所指的变量f。同样地,*f是指向函数func(x)的指针,则*f就代表它所指向的函数func。所以在执行了f=func;之后,(*f)和func代表同一函数。

由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。现在我们就讨论如何用函数指针调用函数,它应执行下面三步:

首先,要说明函数指针变量。

例如:int (*f)(int x);

其次,要对函数指针变量赋值。

例如: f=func;    (func(x)必须先要有定义)

最后,要用 (*指针变量)(参数表);调用函数。

例如:    (*f)(x);(x必须先赋值)

【例】任意输入n个数,找出其中最大数,并且输出最大数值。

main()

{

        int f();

        int i,a,b;

        int (*p)();    /* 定义函数指针 */

        scanf("%d",&a);

        p=f;            /* 给函数指针p赋值,使它指向函数f */

        for(i=1;i<9;i++)

        {

                scanf("%d",&b);

                a=(*p)(a,b);    /* 通过指针p调用函数f */

        }

        printf("The Max Number is:%d",a)

}

f(int x,int y)

{

    int z;

    z=(x>y)?x:y;

    return(z);

}

运行结果为:

343 -45 4389 4235 1 -534 988 555 789↙

The Max Number is:4389

【指针函数】

一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。

        返回指针的函数,一般定义格式为:

        类型标识符    *函数名(参数表)

int *f(x,y);

其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。

如:char *ch();表示的就是一个返回字符型指针的函数,请看下面的例题:

【例】将字符串1(str1)复制到字符串2(str2),并输出字符串2.

#include "stdio.h"

main()

{

    char *ch(char *,char *);

    char str1[]="I am glad to meet you!";

    char str2[]="Welcom to study C!";

    printf("%s",ch(str1,str2));

}

char *ch(char *str1,char *str2)

{

    int i;

    char *p;

    p=str2

    

    if(*str2==NULL) exit(-1);

    do

    {

        *str2=*str1;

        str1++;

        str2++;

    }while(*str1!=NULL);

    return(p);

}

通过分析可得

函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,

函数指针可以用来指向一个函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针