接着昨天的数组和指针。。。。。。。
4.数组、函数和指针:
数组指针(也称行指针):指向数组的指针,例如:int(*p)[10];
#include <stdio.h>
int main(void)
{
int (*p)[3];
int i;
int a[3] = {0,1,2};
for(i = 0;i<3;i++)
{
p = a;//p = &a[0];首先它是一个指针,它用指向一个数组,该数组有3个元素;
printf("a[%d] value:%d\n",i,a[i]);
printf("*p[%d] value:%d\n",i,(*p)[i]);
printf("a[%d] address:%p\n",i,&a[i]);
printf("*p[%d] address:%p\n",i,p);
p++;
}
return 0;
}
//在linux下用gcc编译不出来,换了个编译器就好了;相必是gcc要求太严格或版本不支持。。。
//用其他编译器显示的数组的三个元素和数组的头元素的地址
函数指针:指向函数的指针,例如:int(*p)(int);
通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。
函数指针可以像一般函数一样,用于调用函数、传递参数。
#include <stdio.h>
int max(int x, int y)
{
return x > y ? x : y;
}
int main(void)
{
int (* p)(int, int) = max; /* p 是函数指针 ,这里也可以写成是int (* p)(int, int) = &max;*/
int a = 5, b = 6, c = 7, d;
d = p(p(a, b), c); /* 与直接调用函数等价,d = max(max(a, b), c) */
printf("最大的数字是: %d\n", d);
return 0;
}
指针数组:包含指针的数组,如:int *p[10];
#include <stdio.h>
int main(void)
{
int *p[3];//定义指针数组
int i;
int a[3] = {0,1,2};
for(i = 0;i<3;i++)
{
p[i] = &a[i];
printf("a[%d] value:%d\n",i,a[i]);
printf("a[%d] address:%p\n",i,&a[i]);
printf("*p[%d] value:%d\n",i,*p[i]);
printf("*p[%d] address:%p\n",i,p[i]);
}
return 0;
}
运行结果:
指针函数:返回指针的函数,int *p(int);
#include <stdio.h>
int *findmax( int *px, int *py, int *pmax );
int main()
{
int max, x, y;
scanf("%d %d", &x, &y);
printf("指针函数的返回值:%d\n", *findmax( &x, &y, &max ));
return 0;
}
int *findmax( int *px, int *py, int *pmax )
{
if(*px>*py)
*pmax=*px;
else
*pmax=*py;
return pmax;//指针函数返回类型是某一类型的指针,返回的是指针地址!
}
函数指针数组:由函数指针构成的数组,例如:int(*p[10])(int);
稍微厉害的同学其实看到这里就懂了,说白了就是(指针)数组,这个数组里面的元素是一个个的函数->函数指针+数组
这里给出网上的一个例子:
就是上面指针函数例子改进一下,思路一样的
#include <stdio.h>
//先定义几个简单的函数。。
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a / b;
}
int main(){
int x, y;
int input=0;
int ret = 0;
int(*p[4])(int x, int y) = { add, sub, mul, div }; //函数指针+数组
printf("选择操作(0~4):>") ;
scanf("%d",&input);
printf("输入2个操作数:>");
scanf("%d %d",&x,&y);
ret = (*p[input])(x, y); //类似数组那样调用就可以了
printf( "ret = %d\n", ret);
return 0;
}
5.多级指针:一个指针的内容是另外一个指针的地址;
如:int i = 100;int*pi = &i;int **ppi = π
//pi:一级指针,它的内容就是变量i的地址;
//ppi:二级指针,它的内容就是变量pi的地址
如上面 i= 100;*pi = 100;**ppi = 100;
#include <stdio.h>
int main(void)
{
int i = 100;
int*pi = &i;
int **ppi = π
printf("*pi address:%p\n",pi);
printf("*pi value:%d\n",*pi);
printf("**ppi address of address:%p\n",ppi);
printf("**ppi address:%p\n",*ppi);
printf("**ppi value:%d\n",**ppi);
return 0;
}
运行结果:
6.数组与指针的异同:
不同:
相同:
1.我们可以把表达式中的数组名看成是指针;
2.数组的下标可以看成是指针的偏移量;
3.当数组作为函数参数时,这时它的功能等同于指针。
注释:本次素材和编译器部分来源于网络。。。。。