- 什么是指针
? ? ? 每一个变量都有一个具体的地址,地址指向变量单元,因此将地址形象化为指针,意思是通过指针找到地址的内存单元。
? ? ? 2.指针的类型
根据指针的不同类型,指针有以下情况
//定义指针变量
类型名 * 指针变量名
int*
char*
double* ........
void* 类型的指针 可以接受任意类型的地址
但是该类型不能进行解引用操作,不能+-整数
3.指针打印一维数组?
#include<stdio.h>
int 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]----------指针数组----用于存放地址
#include<stdio.h>
int 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:与数组不同,函数在存储中都是以地址的形式存放的,因此可以不用&
#include<stdio.h>
void 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("%d\n",ret);
}
else if(input==0){
printf("exit\n");
}
else{
printf("trouble choice\n");
}
}while(input);/*do...while语句是先执行一次之后再执行判断,判断的值为真时,继续执行do的内容,如果判断的值为假,就不再执行。
值为真的意思是值while()括号中的表达式的最终的值为非零值即为真,如果为零,则表示为假。*/
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)
#include<stdio.h>
int 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<sz;i++){
printf("%d",arr[i]);
}
}
int main(){
test1();
return 0;
}
|