vlambda博客
学习文章列表

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 &num; //错误写法

}

int* returnTempNum2(int num)

{

return &num;

}

//封装一个函数为一级指针变量申请内存

//堆内存是允许返回的

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;

}




我知道你在看

C语言程序11:指针终级篇




新浪微博:@秀米XIUMI