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.當數組作爲函數參數時,這時它的功能等同於指針。

註釋:本次素材和編譯器部分來源於網絡。。。。。

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