#include <stdio.h>
#include <string.h>
//void Swap(char* buf1, char* buf2, int width)
//{
// int i = 0;
// for (i = 0; i < width; i++)
// {
// if ((char*)buf1 - (char*)buf2 > 0)
// {
// char tmp = *buf1;
// *buf1 = *buf2;
// *buf2 = tmp;
// buf1++;
// buf2++;
// }
// }
//}
//
//void bubble_sort(void* base, int sz, int width,int (*cmp)(void* e1,void* e2))
//{
// int i = 0;
// for (i = 0; i < sz - 1; i++)
// {
// int j = 0;
// for (j = 0; j < sz - 1 - i; j++)
// {
// if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
// {
// //交换
// Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
// }
// }
// }
//
//}
//int cmp_int(const void* e1, const void* e2)
//{
// return *(int*)e1 - *(int*)e2;
//}
//void test()
//{
// int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// bubble_sort(arr, sz, sizeof arr[0], cmp_int);
// for (int i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//int main()
//{
// test();
// return 0;
//}
//一维数组
int main()
{
//数组名是首元素的地址,除了以下两个之外
//1.sizeof(数组名)-数组名表示整个数组
//2.&数组名 - 数组名表示整个数组
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));//16,sizeof(数组名)-计算的是数组的总大小-单位是字节
printf("%d\n", sizeof(a + 0));//4/8-数组名这里表示首元素的值,a+0还是首元素地址,地址的大小就是4/8字节
printf("%d\n", sizeof(*a));//4-数组名表示首元素地址,*a就是首元素,sizeof(*a)就是4
printf("%d\n", sizeof(a + 1));//4/8-数组名表示首元素的值,a+1第2个元素的地址,地址的大小就是4/8个字节
printf("%d\n", sizeof(a[1]));//4/8 第二个元素的大小
printf("%d\n", sizeof(&a));//4/8-&a取出的是数组的地址,但是数组的地址那也是地址,地址的大小就是4/8个字节
printf("%d\n", sizeof(*&a));//16-&a是数组的地址,数组的地址解引用访问的数组,sizeof计算的就是数组的大小,单位是字节
printf("%d\n", sizeof(&a + 1));//4/8,&a是数组的地址,&a+1虽然跳过整个数组,但还是地址,所以是4/8个字节
printf("%d\n", sizeof(&a[0]));//4/8,&a[0]是第一个元素的地址
printf("%d\n", sizeof(&a[0] + 1));//4/8 &a[0]+1是第二个元素的地址
//字符数组
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));//sizeof计算的是数组大小,6*1=6个字节
printf("%d\n", sizeof(arr + 0));//4/8 arr是首元素的地址, arr+0还是首元素的地址,地址的大小是4/8个字节
printf("%d\n", sizeof(*arr));//1 arr是首元素的地址,*arr就是首元素,首元素是字符大小是一个字节
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//&arr虽然是数组的地址,但还是地址,地址大小是4/8个字节
printf("%d\n", sizeof(&arr + 1));//&arr+1是跳过整个数组后的地址,地址大小是4/8个字节
printf("%d\n", sizeof(&arr[0] + 1));//4/8 第二个元素的地址
printf("%d\n", strlen(arr));//随机值
printf("%d\n", strlen(arr + 0));//随机值
printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));//随机值
printf("%d\n", strlen(&arr + 1));//随机值-6
printf("%d\n", strlen(&arr[0] + 1));//随机值-1aA
return 0;
}