C语言-----指针

  1. 什么是指针

      每一个变量都有一个具体的地址,地址指向变量单元,因此将地址形象化为指针,意思是通过指针找到地址的内存单元。

      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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值