C语言程序11:指针终级篇
指针高级
导读
一、指针函数 ;函数是放在后面,是以函数为主体(即函数里面会用到指针,除了参数,还有返回值)
//用到了指针的函数称之为指针函数。
#include <stdio.h>
#include <stdlib.h>
void Swap(int a, int b) //int a=实参1 ,int b=实参2
{
int temp = a;
a = b;
b = temp;
}
//址传递
void Swap2(int *a, int *b) //int *a=&a ,int *b=&b
{
int temp = *a;
*a = *b;
*b = temp;
}
/*
在函数中:
*/
//封装一个函数为一级指针变量申请内存(即修改指针变量的值)
void myMalloc(int **pArray,int num)
{
*pArray = (int *)malloc(sizeof(int)*num);
//本质就是修改指针变量的值
}
//函数参数传入数组
//封装操作数组的函数的时候,需要尺寸(数组的长度)
void printArray1D(int *array /*int array[]*/, int arrayNum)//arrayNum:数组长度
{
for (int i = 0; i < arrayNum; i++)
{
printf("%d\t", array[i]);
}
}
void printArray2D( int(*array)[2] /*int array[][2]*/, int row,int cols)// int row,int cols:行和列
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d\t", array[i][j]);
}
printf("\n");
}
}
int returnNum(int num)
{
return num;
}
int* returnArray(int *array)//返回是形参的值,只是说这个值是一个指针
{
array[1] = 1001;
}
void returnVoid()
{
return;//无返回数据,或者不写
}
int* returnTempNum()
{
int num = 1;
return # //错误写法
}
int* returnTempNum2(int num)
{
return #
}
//封装一个函数为一级指针变量申请内存
//堆内存是允许返回的
int* myMalloc2(int num)
{
int *pArray = (int *)malloc(sizeof(int)*num);
return pArray; //返回的也是值
}
int main()
{
int a = 1;
int b = 2;
Swap(a, b);
printf("a=%d\t,b=%d\n", a, b);
//“函数”:“int *”与“int”的间接级别不同
//传参的类型不一致
Swap2(&a, &b);
printf("a=%d\t,b=%d\n", a, b);
int *pArray = NULL;
myMalloc(&pArray, 2);
pArray[0] = 1;
pArray[1] = 2;
int array1D[3] = { 1, 2, 3 };
printArray1D(array1D,3);
printf("\n");
int array2D[2][2] = { 1, 2, 3, 4 };
printArray2D(array2D, 2, 2);
int *p = returnArray(array1D);
printArray1D(p,3);
printf("\n");
int *pNum = returnTempNum();
printf("pNum=%d\n", *pNum); //1
printf("pNum=%d\n", *pNum);//-2
int *ppArray = myMalloc2(1);
ppArray[0] = 1002;
printf("%d\n", ppArray[0]);
free(ppArray);
ppArray = NULL;
system("pause");
return 0;
}
二、typedef的用法
#include <stdio.h>
#include <stdlib.h>
//typedef1.基本用法
typedef int INT;//为int起别名INT
//2.为数组起别名
typedef int 数组[3]; //int array[3] //int array2[2][3]
typedef int 二维数组[2][3];
//3.结构体中
typedef struct student
{
int age;
}STU,*LPSTU,ARRAY[3];
/*
typedef struct student STU;
typedef struct student *LPSTU;
typedef struct student ARRAY[3];
*/
int main()
{
INT iNum1 = 1;
int iNum2 = 2;
数组 array; //array长度为3的数组
数组 array2[2]; //array2 [2][3]
二维数组 array2D; //array2D就是一个二维数组
system("pause");
struct student student2;
STU studentOne;
LPSTU pSu; //不用写*
struct student* ppStu;
ARRAY stuArray;
struct student stuArray2[3];
return 0;
}
三、函数指针:(指向函数的指针)
#include <stdio.h>
#include <stdlib.h>
/*
函数指针 : 指针指向函数
<1>.学会函数指针的定义
1.1 普通方式
No.1 用(*变量名)替换函数名
No.2 去掉形参即可
1.2 typedef
<2>.学会函数指针的使用
2.1 学会赋值操作
直接用函数名去赋值
2.2 学会通过函数指针去调用函数
2.2.1 不带*调用
2.2.2 带*号调用
2.3 以后可能见到函数指针的地方
NO.1 面试题
No.2 函数指针当做函数参数
*/
int Max(int a, int b)
{
int Max = a;
if (Max < b)
Max = b;
return Max;
}
int Min(int a, int b)
{
return a < b ? a : b;
}
void print(int num)
{
printf("%d\n", num);
}
int main()
{
//定义语法:1.基本方法 NULL可以初始化任何指针
int(*p)(int, int) = NULL;
void(*pF)(int) = NULL;
//通过2.typdef定义
typedef int(*函数指针)(int, int);
//类型 变量名
函数指针 pp = NULL; //和p的一样的函数指针
p = Max;//类型一致的函数都可以赋值给函数指针
//怎么通过函数指针调用函数
printf("Max=%d\n", p(1, 2));//直接使用
printf("Max=%d\n", (*p)(1, 2)); //满足指针的基本用法去使用
pF = print;
pF(p(1, 2));
system("pause");
return 0;
}
四、函数指针充当函数参数
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int Max(int a, int b)
{
return a > b ? a : b;
}
int Sum(int a, int b)
{
return a + b;
}
//No.2 函数指针当做函数参数
//以函数指针为参数的函数
//直接的写法
void print(int(*pFunction)(int, int), int a, int b)//int a, int b:为了便于前面指针的调用
{
printf("%d\n", pFunction(a, b));
}
//typedef写法
typedef int(*函数指针)(int a, int b);
int printInfo(函数指针 指针名, int a, int b)
{
printf("%d", 指针名(a, b));
return 指针名(a, b);
}
/*
2.3 以后可能见到函数指针的地方
NO.1 面试题
No.2 函数指针当做函数参数
*/
//typdef辅助定义返回函数指针函数
函数指针 returnFunction(函数指针 指针名)
{
return 指针名;
}
int main()
{
//回调函数
print(Max, 1, 2);
print(Sum, 1, 2);
void(*p)(int(*)(int, int), int, int) = print;
p(Max, 1, 2);
p(Sum, 1, 2);
/*
一下定义时什么东西
void (*p)(int(*)(int, int), int, int)
1.用函数名替换(*p)
void 函数名(int(*)(int, int), int, int)
2.()中相应参数补上名字
void 函数名(int(*p)(int, int), int a, int b)
*/
//3.当函数指针充当返回值
//通过typedef辅助
returnFunction(Max)(1,2);
函数指针 pReturn = returnFunction(Max);
pReturn(1, 2);
system("pause");
return 0;
}
五、万能指针充当函数指针
#include <stdio.h>
#include <stdlib.h>
/*
1.void *类型的指针使用前必须强制转换
(目标类型)变量名
2.只要清楚类型其实void*类型函数指针很简单
3.必须要用*指针名方式去使用
*加指针名的方式调用
*/
void print()
{
printf("ILoveyou!");
}
int main()
{
void *pVoid = print; //原来是void类型!
//指针类型:去掉变量
//求类型: void(*)()
(*(void(*)())pVoid)();
printf("\n");
//1.指针的类型:void(*)()
//2.强制转换:(void(*)())pVoid
//3.函数指针调用: (*函数指针)()
typedef void(*TYPE)();
(*(TYPE)pVoid)();
printf("\n");
int a = 1;
void *pInt = &a;
printf("%d\n", *(int *)pInt);
system("pause");
return 0;
}
我知道你在看哟
新浪微博:@秀米XIUMI