接着昨天的數組和指針。。。。。。。
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.當數組作爲函數參數時,這時它的功能等同於指針。
註釋:本次素材和編譯器部分來源於網絡。。。。。