#include<stdio.h> intmain() { int a = 10; int b = 20; int c = 30; int d = 40; int* arr[4] = {&a,&b,&c,&d}; int i = 0; for (i = 0; i<4; i++) { printf("%d ",*(arr[i])); } return0; }
打印的结果是10 20 30 40
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include<stdio.h> intmain() { int arr1[] = {1,2,3,4,5}; int arr2[] = {2,3,4,5,6}; int arr3[] = {3,4,5,6,7}; int* parr[] = {arr1,arr2,arr3}; int i = 0; for (i=0; i<3; i++) { int j = 0; for (j = 0; j<5; j++) { printf("%d ",*(parr[i]+j)); } printf("\n"); } return0; }
打印的结果是: 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7
数组指针
数组指针本质是指针。 int *p = NULL; p是整型指针 - 指向整型的指针 - 可以存放整型的地址 char * pc = NULL; pc是字符指针 - 指向字符的指针 - 可以存放字符的地址
int arr[5]; arr是一个5个元素的整型数组 int *parr1[10];parr1是一个数组,数组有10个元素,每个元素的类型是int*,parr是指针数组 int (*parr2)[10];parr2是一个指针,该指针指向一个数组,数组有10个元素,每个元素的类型是int,parr2是数组指针 int (*parr3[10])[5];parr3是一个数组,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素是int
#include<stdio.h> intAdd(int x,int y) { int z = 0; z = x + y; return z; } intmain() { int a = 20; int b = 10; printf("%p\n",&Add); printf("%p\n",Add);//&函数名和函数名都是函数的地址. int (*pa)(int,int) = Add;//函数指针,把函数的地址存到pa里 printf("%d\n",(*pa)(2,3));//打印的结果是5,证明pa中存的是函数的地址 }
intAdd(int x,int y) { return x + y; } intSub(int x,int y) { return x - y; } intMul(int x,int y) { return x * y; } intDiv(int x,int y) { return x / y; } intXOR(int x,int y) { return x ^ y; }
intmain() { int x = 0; int y = 0; int input = 0; //pfArr是函数指针数组 - 叫转移表 int (*pfArr[6])(int,int) = {0,Add,Sub,Mul,Div,XOR}; do { menu(); printf("请选择:->"); scanf("%d",&input); if (input >= 1 && input <= 5) { printf("请输入两个操作数:->"); scanf("%d%d",&x,&y); int ret = pfArr[input](x,y); printf("%d\n",ret); } elseif(input == 0){ printf("退出\n"); }else { printf("选择错误\n"); } } while (input); }
intAdd(int x,int y) { return x + y; } intSub(int x,int y) { return x - y; } intMul(int x,int y) { return x * y; } intDiv(int x,int y) { return x / y; } intXOR(int x,int y) { return x ^ y; }
voidCalc(int (*pf)(int,int))//回调函数 { int x = 0; int y = 0; printf("请输入两个操作数:->"); scanf("%d%d",&x,&y); printf("%d\n",pf(x,y)); }
intmain() { int x = 0; int y = 0; int input = 0; do { menu(); printf("请选择:->"); scanf("%d",&input); switch (input) { case1: printf("加法:"); Calc(Add); break; case2: printf("减法:"); Calc(Sub); break; case3: printf("乘法:"); Calc(Mul); break; case4: printf("除法:"); Calc(Div); break; case5: printf("XOR:"); Calc(XOR); break; case0: printf("退出\n"); break; default: printf("输入非法\n"); break; } } while (input); }
指向函数指针数组的指针
1 2 3 4 5 6 7 8 9 10 11 12 13
intmain() { int arr[10] = {0}; int (*p)[10] = &arr;//取出数组的地址
int (*pf)(int,int);//函数指针 int (*pfArr[4])(int,int);//pfArr是一个数组,函数指针的数组 //pfArr是一个指向[函数指针数组]的指针 int (*(*PPfArr)[4])(int,int) = &pfArr; //ppfArr是一个数组指针,指针指向的数组有4个元素 //指向数组的每个元素的类型是一个函数指针int(*)(int,int) return0; }