//数组变量是特殊的指针
//数组变量本身就表达地址,对a[]来说,int *p=a 是ok的
//但数组单元是变量,需要&
//const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。
//const int *p=&a——>常量指针——指针的指向可以改,但指针指向的值不能改,指到别的地方去它就管不着啦
//int *const p=&a——>指针常量——指针指向的值可以改,但指针的指向不能改
//为什么要用到指针呢,因为有的时候函数需要要返回多个值,但return只能返回一个
#include<stdio.h> #include<stdlib.h> //函数声明 void minmax(int *a,int len,int *max,int *min); int main() { //常量指针 int q=1,b=1,c=2; const int *zz=&q; printf("%p\n %d\n",zz,*zz); zz=&b; printf("%p\n %d\n",zz,*zz); zz=&c; printf("%p\n %d\n",zz,*zz); printf("\n"); //指针常量 int r=1,g=1,v=2; int * const zza=&r; printf("%p\n %d\n",zz,*zz); *zza=20; printf("%p\n %d\n",zz,*zz); printf("\n"); //初始化 int a[]={1,2,3,4,5,7,8,13,17,55,77,521}; int min,max; printf("main sizeof(a)=%lu\n",sizeof(a)); printf("a=%p\n",a); minmax(a,sizeof(a)/sizeof(a[0]),&min,&max); printf("min=%d,max=%d\n",min,max); //一些小测试 int *p=&min; printf("*p=%d\n",*p); //数组和指针可以相互转换 printf("p[0]=%d\n",p[0]); //在函数中,a[0]=25 printf("*a=%d\n",*a); system("pause"); return 0; } //*a和a[]是等价的(在参数表中) //值传递还是值传递,只不过传进去的是地址 //函数定义 void minmax(int *a,int len,int *max,int *min)//这里的指针指代了数组a,后面对a也能正常调用 { int i; printf("minmax sizeof(a)=%lu\n",sizeof(a)); printf("minmax a=%p\n",a); a[0]=25; *min=*max=a[0]; for(i=1;i<len;i++) { if(a[i]<*min) *min=a[i]; if(a[i]>*max) *max=a[i]; } }