1.voidp:p可以接受任意类型的地址。void类型的指针不能进行解引用操作。

2.指针数组: int p[5];是一个数组,每个元素是int 

数组指针: int (*p)[5]:是一个指针,指向一个5个元素类型是int的数组。

函数指针:void (*p)(int,int):指向一个void类型参数 是(int,int)的函数。

3.

void add(int x, int y) {
	printf("%d\n", x + y);
}
void del(int x, int y) {
	printf("%d\n", x - y);
}
void mul(int x, int y) {
	printf("%d\n", x * y);
}
void div(int x, int y) {
	printf("%d\n", x / y);
}

void Cal(void (*p)(int,int)) {
	int x = 0;
	int y = 0;
	printf("请输入2个数");
	scanf("%d%d", &x,&y);
	p(x,y);
}

int input = 0;
	do
	{
		printf("请输入1个数");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Cal(add);
			break;
		case 2:
			Cal(del);
			break;
		case 3:
			Cal(mul);
			break;
		case 4:
			Cal(div);
			break;
		default:
			printf("输入错误");
			break;
		}
	} while (input);

4.学习库函数qsort(数组地址,数组大小,数组元素大小,cmp(比较函数))排序任意数组类型。

!!注意cmp比较函数是规定写法:int cmp(const void* e1,const void* e2)。

例子qsort排序结构体:

typedef struct stuent
{
	char name[20];
	int age;
}stu;

int cmp(const void* e1, const void* e2) {
	return  ((stu*)e1)->age - ((stu*)e2)->age;
}


----------main

stu s[3] = { {"张三",22},{"李四",21},{"王五",20} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]),cmp);
for (int i = 0; i < sz; i++)
{
	printf("%s", s[i].name);
	printf("%d\n", s[i].age);

}

5.二维数组的指针问题:

关于指针:_指针数组


6.指针问题:

关于指针:_指针数组_02

其中的+0x1相当于p+1就是指针走几个指针类型的数据。


7.const intp:意思是修饰的P是常量   int *const p:意思是修饰的指针p是常量。

8.一个指针问题

char a[] = "asdfgh";
char b[] = "asdfgh";
const char* c = "abcdef";//常量字符串
const char* d = "abcdef";
if (a == b)//答案是哈哈
printf("呵呵");
else
printf("哈哈");
if (c == b)//答案是呵呵 因为b c指向的同一个地址
printf("呵呵");
else
printf("哈哈");

9.指针数组.int* arr[10];这是一个数组,每个元素是int * 类型

数组指针: int (*p)[5]=&arr(注意这里必须取得是数组的整个地址):这是一个指针,指向的是一个5个元素每个元素类型是int的数组。

//数组指针
char* arr[5];
char* (*pa)[5] = &arr;
int brr[6];
int(*pb)[6] = &brr;
//所以pb里面放的是整个数组的地址

10.二维数组传参传的是第一行数组的整个地址:

int arr[3][5]={{1,2,3,4,5},{6,7,8,910},{11,12,13,14,15}},所以传的是{1,2,3,4,5}的整个地址。参数接受就应该写int (*p)[5];是一个指针 指向一个5个元素的int数组。

11.关于函数地址:&function 和function是一样的都是函数的地址。

int add(int x,int y) {}

//函数指针
int (*p)(int, int) =add//存放函数地址的指针
  //使用方法(*p)(2,3)

 

关于指针:_指针数组_03

关于指针:_函数指针_04

函数指针可以不解引用直接调用也可以解引用。

函数指针的数组:

void add(int x, int y) {
	printf("%d\n", x + y);
}
void del(int x, int y) {
	printf("%d\n", x - y);
}
void mul(int x, int y) {
	printf("%d\n", x * y);
}
void div(int x, int y) {
	printf("%d\n", x / y);
}

//函数指针数组
void (*fc[4])(int, int) = { add,del,mul,div };
for (int i = 0; i < 4; i++)
{
	fc[i](2,3);
}