#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
//int main()
//{
// int a = 10;
// int* pa = &a;
// //char* pc = &a; //有警告
//
// char ch = 'w';
// void* p = &a;
// //*p=2; p++; //err
// //void* 类型的指针可以接收任意类型的地址
// //void* 类型的指针不可以进行解引用操作,也不能进行+ -整数的操作
// p = &ch;
// return 0;
//}
//数组名是首元素的地址
//1.sizeof(数组名)--数组名表示整个数组
//2.&数组名-- 数组名表示整个数组
//地址的大小是不分贵贱的,地址的大小是:4/8
//整形数组:
//int main()
//{
// int a[] = { 1,2,3,4 };
// printf("%d\n", sizeof(a)); //16
// printf("%d\n", sizeof(a+0)); //4
// printf("%d\n", sizeof(*a)); //4
// printf("%d\n", sizeof(a+1)); //4
// printf("%d\n", sizeof(a[1])); //4
// printf("%d\n", sizeof(&a)); //4
// printf("%d\n", sizeof(*&a)); //16
// printf("%d\n", sizeof(&a+1)); //4
// printf("%d\n", sizeof(&a[0])); //4
// printf("%d\n", sizeof(&a[0]+1)); //4
// return 0;
//}
//字符数组(1):
//int main()
//{
// char arr[] = { 'a','b','c','d','e','f' };
// printf("%d\n", sizeof(arr)); //6
// printf("%d\n", sizeof(arr+0)); //4
// printf("%d\n", sizeof(*arr)); //1
// printf("%d\n", sizeof(arr[1])); //1
// printf("%d\n", sizeof(&arr)); //4
// printf("%d\n", sizeof(&arr+1)); //4
// printf("%d\n", sizeof(&arr[0]+1)); //4
//
// printf("\n%d\n",strlen(arr)); //随机值
// printf("%d\n", strlen(arr+0)); //随机值
// //printf("%d\n", strlen(*arr)); //程序错误:传过去的是a--97
// //printf("%d\n", strlen(arr[1])); //程序错误:传过去的是b--98
// printf("%d\n", strlen(&arr)); //随机值
// printf("%d\n", strlen(&arr+1)); //随机值-6
// printf("%d\n", strlen(&arr[0]+1)); //随机值-1
// return 0;
//}
//字符数组(2):
//int main()
//{
// char arr[] = "abcdef";
// printf("%d\n", sizeof(arr)); //7
// printf("%d\n", sizeof(arr+1)); //4
// printf("%d\n", sizeof(*arr)); //1
// printf("%d\n", sizeof(arr[1])); //1
// printf("%d\n", sizeof(&arr)); //4
// printf("%d\n", sizeof(&arr+1)); //4
// printf("%d\n", sizeof(&arr[0]+1)); //4
//
//
// printf("\n%d\n", strlen(arr)); //6
// printf("%d\n", strlen(arr+1)); //5
// //printf("%d\n", strlen(*arr)); //程序错误:传过去的是a--97
// //printf("%d\n", strlen(arr[1])); //程序错误:传过去的是b--98
// printf("%d\n", strlen(&arr)); //6
// printf("%d\n", strlen(&arr+1)); //随机值
// printf("%d\n", strlen(&arr[0]+1)); //5
// return 0;
//}
//字符数组(3):
//int main()
//{
// char* p = "abcdef"; //p存放的是a的地址
// printf("%d\n", sizeof(p)); //4
// printf("%d\n", sizeof(p+1)); //4
// printf("%d\n", sizeof(*p)); //1
// printf("%d\n", sizeof(p[0])); //1
// printf("%d\n", sizeof(&p)); //4
// printf("%d\n", sizeof(&p+1)); //4
// printf("%d\n", sizeof(&p[0]+1)); //4
//
// printf("\n%d\n", strlen(p)); //6
// printf("%d\n", strlen(p+1)); //5
// //printf("%d\n", strlen(*p)); //程序错误:传过去的是a--97
// //printf("%d\n", strlen(p[0])); //程序错误:传过去的是a--97
// printf("%d\n", strlen(&p)); //随机值
// printf("%d\n", strlen(&p+1)); //随机值
// printf("%d\n", strlen(&p[0]+1)); //5
// return 0;
//}
//二维数组:
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a)); //48
printf("%d\n", sizeof(a[0][0])); //4
printf("%d\n", sizeof(a[0])); //16 :第一行的数组名
printf("%d\n", sizeof(a[0]+1)); //4 :a[0]其实是第一行第一个元素的地址,所以a[0]+1是第一行第二个元素的地址
printf("%d\n", sizeof(*(a[0]+1))); //4 :是第一行第二个元素的大小
printf("%d\n", sizeof(a+1)); //4 :a是二维数组的数组名,a+1是第二行的地址,地址只能是4/8个字节,
printf("%d\n", sizeof(*(a+1))); //16:对第二行地址解引用,就是第二行数组的大小
printf("%d\n", sizeof(&a[0]+1)); //4: 对第一行数组名解引用,变成第一行地址,再+1变成第二行的地址
printf("%d\n", sizeof(*(&a[0]+1))); //16:对第二行的地址解引用,就是第二行数组的大小
printf("%d\n", sizeof(*a)); //16:a是首元素地址,*a就是第一行
printf("%d\n", sizeof(a[3])); //16:sizeof不访问其内部,所以a[3]与a[0] 结果一样
return 0;
}