一、指针变量==存放地址的变量

指针变量==存放地址的变量

二、指针类型——决定指向空间的大小

在这里插入图片描述

ex1、封装一个函数,实现两个数的交换

ex1.c

ex2、指针指向固定的区域

ex2.c

三、通过指针引用数组

在这里插入图片描述

ex3、 要求不管怎么输入五个数,在输出的时候都是由大到小的顺序输出,用函数封装实现

在这里插入图片描述

#include <stdio.h>

void InitNum(int *parr,int len)
{   
    int i;
    puts("请输入5个数:");
    for(i = 0; i < len; i++){
        scanf("%d",parr++);
    }
}

void MaxToMin(int *parr,int len)
{   
    int i,j;
    int tmp;
    for(i = 0; i < len-1; i++){
        for(j = i+1; j < len; j++){
            if(parr[i] < parr[j]){
                tmp = parr[i];
                parr[i] = parr[j];
                parr[j] = tmp;
            }             
        }
    }
    puts("");
}

void printfArr(int *parr,int len)
{   
    int i;
    for(i = 0; i < len; i++){
        printf("%d ",*parr++);
    } 
}

int main()
{  
    int arr[5];
    int *p;
    int len;
    p = arr;         //数组名就是数组的首地址
    //p = arr[0];    //数组的首地址就是首个元素的地址
    len = sizeof(arr)/sizeof(arr[0]);

    InitNum(arr,len);//实际参数,数组的首地址: 名,首个元素的地址
    puts("输入的5个数是:");
    printfArr(arr,len);
    MaxToMin(arr,len);
    puts("从大到小排序为:");
    printfArr(&arr[0],len);

    return 0;
}

ex4、将数组中的n个元素按逆序存放

void initArray(int *parr, int size)
{
	int i;
	for(i=0;i<size;i++){
		printf("请输入第%i个元素的数据:\n",i+1);
		scanf("%d",parr++);
	}
}

void revangeArry(int *parr, int size)
{
	int i,j;
	int tmp;
	
	for(i=0;i<size/2;i++){
			j = size-1-i;
			tmp = parr[i];
			parr[i] = parr[j];
			parr[j] = tmp;
	}
}

void printArray(int *parr, int size)
{
	int i;
	for(i=0;i<size;i++){
		printf("%d ",*parr++);
	}
	putchar('\n');
}

int main()
{
    int arry[5];
	int size = sizeof(arry)/sizeof(arry[0]);
	
	initArray(arry,size);//实际参数,数组的首地址: 名,首个元素的地址
	printArray(&arry[0],size);
	revangeArry(arry,size);
	printArray(&arry[0],size);
    
    return 0;
}

四、二维数组的有关指针

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

五、数组指针( int (*p)[4] )

定义一个指针,指向一个数组!
在这里插入图片描述

ex5、输出二维数组任意行列的数

#include <stdio.h>
/*输出二维数组任意行列的数*/

void InputHangLie(int *pi,int *pj)
{
    printf("输入行列值:\n");
	scanf("%d%d",pi,pj);
	puts("done!");
}

int getTheData(int (*p)[4],int i,int j)
{
    int data;
	data = *(*(p+i)+j);
    //data = p[i][j];
	return data;
	//return p[i][j];
}

int main()
{
    int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}};
    int i,j;
    int data;

    InputHangLie(&i,&j);
    data = getTheData(arr,i,j);
    printf("%d行%d列的值是%d\n",i,j,data);

    return 0;
}

六、函数指针

函数名就是地址
在这里插入图片描述

ex6、输入两个数,再输入1(取大值),2(取小值),或者3(求和),用函数指针

#include <stdio.h>
#include <stdlib.h>

void initNum(int *pdata1, int *pdata2)
{   
    scanf("%d%d",pdata1,pdata2);
}

int getMax(int data1, int data2)
{
	return data1>data2 ? data1:data2;
}

int getMin(int data1, int data2)
{
	return data1<data2 ? data1:data2;
}

int getSum(int data1, int data2)
{
	return data1+data2;
}

int dataHandler(int data1, int data2, int (*pfunc)(int, int ))
{
	int ret;
	ret = (*pfunc)(data1,data2);
	return ret;
}
int main()
{	
	int a ;
	int b ;
	int cmd;
	int ret;

    printf("请输入2个数:\n");
    void (*pinitNum)(int *pdata1, int *pdata2);
    pinitNum = initNum;
    (*pinitNum)(&a,&b);

    //int (*pfunc)(int data1, int data2);
	int (*pfunc)(int , int );
	
	printf("请输入1(取大值),2(取小值),或者3(求和)\n");
	scanf("%d",&cmd);
	switch(cmd){
		case 1:
			pfunc = getMax;
            //ret = (*pfunc)(a,b);
		    break;
		case 2:
			pfunc = getMin;
            //ret = (*pfunc)(a,b);
		    break;
		case 3:
			pfunc = getSum;
            //ret = (*pfunc)(a,b);
		    break;
		default:
			printf("输入错误!@输入1(取大值),2(取小值),或者3(求和)\n");
			exit(-1);//包含头文件#include <stdlib.h>
		    break;
	}
	ret = dataHandler(a,b,pfunc);
	printf("ret = %d\n",ret);
	return 0;
}

七、指针数组( int* p[4] )

在这里插入图片描述在这里插入图片描述

ex7、改写ex6,同时获得最大最小求和的值(函数指针数组)

int getMax(int data1, int data2)
{
	return data1>data2 ? data1:data2;
}

int getMin(int data1, int data2)
{
	return data1<data2 ? data1:data2;
}

int getSum(int data1, int data2)
{
	return data1+data2;
}

int main()
{	
	int a = 10;
	int b = 20;
	int ret;
	
	int (*pfunc[3])(int , int )={getMin,getMax,getSum};//函数指针数组!
	
	for(int i=0;i<3;i++){
		ret = (*pfunc[i])(a,b);
		printf("ret = %d\n",ret);
	}
	
	return 0;
}

八、指针函数

返回指针值的函数
在这里插入图片描述

ex8、要求用户输入学生序号后,输出该学生的全部成绩,用指针函数实现,找出其中有不及格的课程的学生及其学生号

#include <stdio.h>
/*要求用户输入学生序号后,输出该学生的全部成绩,用指针函数实现*/
/*找出其中有不及格的课程的学生及其学生号*/

void getFail(int (*pstu)[4])
{
	for(int i=0;i<3;i++){
		for(int j=0;j<4;j++){
			if(*(*(pstu+i)+j) < 60){
				printf("第%d位第%d门成绩不合格:%d\n",i+1,j+1,*(*(pstu+i)+j));
			}
		}
	}
}

int* getPosPerson(int pos, int (*pstu)[4])//函数指针,返回指针的函数
{
	int *p;
	p = (int *)(pstu+pos);
	return p;
}

int main()
{
    int scores[3][4]={{55,66,77,88},{66,67,68,59},{50,70,78,60}};
	int *ppos;
	int pos;

	printf("请输入你需要看的学生号数:1,2,3\n");
	scanf("%d",&pos);
	
	ppos = getPosPerson(pos-1, scores);//输入0,1,2改为1,2,3
	for(int i=0;i<4;i++){
		printf("%d ",*ppos++);
	}
	putchar('\n');
	printf("================================\n");
	printf("不及格的学生及成绩有:\n");
	getFail(scores);

    return 0;
}

在这里插入图片描述

九、二级(多级)指针

在这里插入图片描述

ex9、改写ex8,要求用户输入学生序号后,输出该学生的全部成绩

在这里插入图片描述

十、总结

在这里插入图片描述

更多推荐