#include <stdio.h>
#include<stdlib.h>
#include<assert.h>
/*int add(int x, int y);
void print(char*str);
int main() {
//int (*p)(int, int) = add;
//printf("%d", (*p)(2, 3));
void (*p)(char*) = print;
(*p)('dasdas');
return 0;
}
int add(int x,int y) {
return x + y;
}
void print(char*str)
{
printf("%s", str);
}*/
void print(int(*p)[5], int x, int y);
int add(int x, int y);
void print1(const char* str);
int sub(int x, int y);
int main() {
//指针数组
/*/int arr1[] = {1, 3, 3};
int arr2[] = { 1,2,3};
int* a[] = { arr1,arr2 };
int i = 0;
for ( i = 0; i < 2; i++)
{
int j = 0;
for ( j = 0; j < 3; j++)
{
printf("%d", *(a[i] + j));
}
}*/
//数组指针 存放数组的地址
int arr[10] = { 1,2,3,3,4,5,6,78,9,3 };
int (*pa)[10] = &arr;
int* arr1[10];
int* (*p)[10] = &arr1;
int i = 0;
for ( i = 0; i <10; i++)
{
printf("%d", *(*pa+i));
}
int arr3[3][5] = { {1,2,3,4,5},{1,2,3,45,5},{0,1,2,3,4} };
print(arr3, 3, 5);
//函数指针:指向函数的指针
int (*fun)(int, int) = add;
printf("%d", (*fun)(2, 3));
void (*fu)(const char*) = print1;
(*fu)("s");
//(*(void (*)())0)(): 把0强制类型转换成:void(*)()函数的指针类型 0就是一哥函数的地址
//调用0地址处的该函数
//<c陷阱和缺陷>
//void (* signal(int,void(*)(int)))(int)
//等于 typeof void(* pfun)(int)
//pfun siganl(int,pfun)
//siganl 是一个函数声明
//siganl函数的参数有两个 一个是int 一个是函数指针 该函数指针的函数参数是int 返回类型是void
//siganl函数的返回类型也是一个函数指针 该指针的参数是int返回类型是void
int* brr[2];
int (*paa[2])(int, int) = { add,sub };
int i1 = 0;
for ( i1 = 0; i1< 2; i1++)
{
printf("%d", paa[i1](1, 2));
printf("\n");
}
return 0;
}
void print1(const char* str) {
printf("%s", str);
}
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x -y;
}
void print(int(*p)[5], int x, int y)
{
int i = 0;
for ( i = 0; i < x; i++)
{
int j = 0;
for ( j = 0; j < y; j++)
{
printf("%d", *(*(p + i) + j));
printf("%d", (*(p + i))[j]);
printf("%d", p[i][j]);
printf("%d", *(p[i] + j));
}
printf("\n");
// int arr[5]: 一个5个元素的整形数组
// int *arr[8]: 一个数组有8个元素,每个元素的类型是int* *arr是指针数组;
// int (*p)[2]:一个指针指向了一个数组,数组有2个元素每个元素的类型的int (*p)是数组指针
// int (*p[2])[8] 该数组有2个元素,每个元素是一个数组指针改
}
}