指针
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);
}
通过分析可得
函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,
函数指针可以用来指向一个函数。
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);
}
通过分析可得
函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,
函数指针可以用来指向一个函数。
相关文章推荐
- 关于指针的一些事情
- 关于c语言指针的两处小tip分享
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C语言指针学习经验总结浅谈
- C/C++中指针和引用之相关问题深入研究
- 指针与const限定符的使用分析
- c++ 指针与引用的区别介绍及使用说明
- c++函数中的指针参数与地址参数区别介绍
- javascript function、指针及内置对象
- (C和指针) #if 0/#if 1...#end if
- C++中用指向数组的指针作函数参数
- 关于《C和指针》的学习笔记
- 深入解析C++中的指针数组与指向指针的指针
- 指向类成员函数的指针其实并非指针
- 深入理解void以及void指针的含义
- C/C++指针和取地址的方法