- 什么是指针
每一个变量都有一个具体的地址,地址指向变量单元,因此将地址形象化为指针,意思是通过指针找到地址的内存单元。
2.指针的类型
根据指针的不同类型,指针有以下情况
//定义指针变量 类型名 * 指针变量名 int* char* double* ........
void* 类型的指针 可以接受任意类型的地址 但是该类型不能进行解引用操作,不能+-整数
3.指针打印一维数组
#includeint main(){ int a[10]={0,1,2,3,4,5,6,7,8,9}; int *p=a; //指向数组 int i=0; for(i=0;i<10;i++){ //一维数组打印的两种形式 printf("%d",p[i]); printf("%d",*(p+i)); } return 0; }
4.数组指针
数组指针 int (*p)[10];-------数组指针 p先于*结合,说明p是一个指针,接着指向一个大小为10的数组,所以p是一个数组指针 ps:[]的优先级高于*,所以加上()先让p与*结合 指针数组 int *p[10]----------指针数组----用于存放地址
#includeint main(){ int a=10; int b=20; int c=30; int* arr[3]={&a,&b,&c};//数组指针 int i=0; for(i=0;i<3;i++){ printf("%p ",arr[i]); //不解引用,则打印元素的地址 printf("%d ",*(arr[i])); } return 0; }
5.函数指针(函数指针的数组)
Ps:与数组不同,函数在存储中都是以地址的形式存放的,因此可以不用&
#includevoid menu(){ printf("*********************n"); printf("*** 1.add 2.sub**n"); printf("****3.mul 0.exit*n"); printf("*********************n"); } int add(int x,int y){ return x+y; } int sub(int x,int y){ return x-y; } int mul(int x,int y){ return x*y; } int main(){ int input; int(*parr[5])(int, int)={0,add,sub,mul};//定义指针数组 //有无 & 并不重要,因为函数在数组中的存储形式就是以地址存储的 int x,y; do{ menu(); printf("choice:"); scanf("%d",&input); if(input>=1 && input<=3) { printf("please write two number:"); scanf("%d %d",&x,&y); int ret=parr[input](x,y);// 调用函数 or (*parr[input])(x,y) printf("%dn",ret); } else if(input==0){ printf("exitn"); } else{ printf("trouble choicen"); } }while(input); return 0; }
2.指向函数数组的指针
int(*p)(int,int) 函数指针 int(*parr[])(int,int) 函数指针的数组 int(*(*pparr)[])(int,int)=&parr 指向函数指针数组的指针 //pparr是一个数组指针,类型为 int(*)(int,int)
ps:特殊类型的函数-------qsort 函数 对任意类型的数据排序(升序)
qsort(arr,sz,sizeof(arr[0]),cmp_int)
参数意义
第一个参数:待排序数组的首元素地址
第二个参数:待排序数组的元素个数
第三个参数:待排序数组的每个元素大小--单位是字节
第四个参数:是函数指针,比较两个元素所用函数的地址(自己实现)
函数指针的两个参数:待比较的两个元素的地址(const void*e1,const void*e2)
#includeint cmp_int(const void*e1,const void*e2){//两个整形指针,指向两个整形值 //compare int 比较两个整形值 return *(int*)e1-*(int*)e2; //强制类型转换,转换成int类型 //compare函数的返回值只有三种:>0,<0,=0 } void test1(){ int arr[10]={9,8,7,6,5,4,3,2,1,0}; int sz=sizeof(arr)/sizeof(arr[0]);//求解一个数组元素的个数 qsort(arr,sz,sizeof(arr[0]),cmp_int);//对qsort函数传参 ,第四个为一个compare函数 int i=0; for(i=0;i



