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.指针问题:
其中的+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)
函数指针可以不解引用直接调用也可以解引用。
函数指针的数组:
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);
}