#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//int main()
//{
// int a = 0;
// int* pa = &a;//pa是指针变量
// *pa = 20;
// printf("%d\n", a);
//
// char ch = 'w';
// char* pc = &ch; //指针类型的意义:1.决定了指针+1或-1的操作时,会跳过几个字节
// // 2.决定了解引用操作时的权限
//
//
// //数组名:
// //1.数组名在大部分情况下表示:数组首元素的地址
// //但是有两个例外:下面两种情况数组名表示整个数组
// // a) sizeof(数组名)
// // b) &数组名
// //2.&数组名:取出的是数组的地址
//
// int arr[10] = { 1,2,3 };
// int (*parr)[10] = &arr;//parr就是数组指针:指向数组的指针
//
// return 0;
//}
//函数指针
//函数也是有地址的
//int Add(int x, int y)
//{
// return x + y;
//}
//
//int main()
//{
// printf("%p\n", &Add);
//
// int (*pf)(int, int) = &Add;
// //函数的地址存放到函数指针变量中
// //int sum = (*pf)(2, 3);
// int sum = pf(2, 3);
// printf("%d\n", sum);
//
// return 0;
//}
//函数指针数组:
//int (*pfArr[4])(int, int);
//pfArr数组的每个元素类型是int(*)(int, int)
//函数指针实现回调函数:
//通过函数指针调用的函数就是回调函数
//qsort - 使用冒泡排序的思想,模拟实现了qsort函数
//1.qsort怎么使用
//2.知道qsort怎么使用回调函数实现的通用排序
//
//数组名的理解
//指针的运算和指针类型的意义
//
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16
//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
printf("%d\n", sizeof(a + 0));//4或8
//a不是单独存放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址
//是地址,大小就是4或8个字节
printf("%d\n", sizeof(*a));//4
//*a中的a是数组的首元素地址,*a就是对首元素的地址解引用,找到的就是首元素
//首元素的大小就是4个字节
printf("%d\n", sizeof(a + 1));//4或8
//这里的a是数组首元素的地址
//a+1是第二个元素的地址
//sizeof(a+1)就是地址的大小
printf("%d\n", sizeof(a[1]));//4
//计算的是第二个元素的大小
printf("%d\n", sizeof(&a));//4或8
//&a取出的是数组的地址,数组的地址,也就是个地址
//是地址,大小就是4或8个字节
printf("%d\n", sizeof(*&a));//16
//*和&抵消了,*&a就相当于a
//&a得到的是数组的地址,类型是int(*)[4],是一种数组指针
//数组指针解引用找到的是数组
printf("%d\n", sizeof(&a + 1));//4或8
//&a取出的是数组的地址,类型是int(*)[4]
//&a+1是从数组a的地址向后跳过了一个有4个整型元素的数组的大小
//还是一个地址,大小就是4或8个字节
printf("%d\n", sizeof(&a[0]));//4或8
//&a[0]就是第一个元素的地址
//计算的就是地址的大小
printf("%d\n", sizeof(&a[0] + 1));//4或8
//&a[0]+1是第二个元素的地址
//大小是4或8个字节
return 0;
}