数组和指针复习
#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;
 }
