C语言复习第三档!!!(数组+指针+函数)

接着昨天的数组和指针。。。。。。。

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 = &pi;
   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.当数组作为函数参数时,这时它的功能等同于指针。

注释:本次素材和编译器部分来源于网络。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章