////////————————9.指针和数组笔试题解析

////一维数组,数组名的理解,指针的运算与指针类型的意义

//#include<stdio.h>

//int main()

//{//元素的大小:元素所占内存空间的大小

// int a[] = { 1,2,3,4 };//由初始化内容可知数组元素个数为4字节

// printf("%d\n", sizeof(a));//sizeof(数组名)数组名表示整个数组元素的大小,单位是字节4*4=16字节

// //a不是单独放在sizeof内部,也没有取到地址,所以a就是首元素地址,a+0还是首元素地址,是地址,大小就是4/8个字节

// printf("%d\n", sizeof(a + 0));//a+0:首元素的地址//4字节(32位平台)或8字节(64位平台)

// printf("%d\n", sizeof(*a));//*a:首元素的地址//4字节

// printf("%d\n", sizeof(a + 1));//a:首元素的地址,a+1:第2个元素的大小//4字节(32位平台)或8字节(64位平台)

// printf("%d\n", sizeof(a[1]));//a[1]='2'的地址(第2个元素的大小)//4字节(32位平台)

// printf("%d\n", sizeof(&a));//&a得到的是整个数组的地址//4字节(32位平台)或8字节(64位平台)

// printf("%d\n", sizeof(*&a));//*&a相当于数组名a,计算的是数组的大小//4*4=16字节

// //&a得到的是整个数组的地址,类型为int(*)[4],指针类型决定了我对其进行*操作时有多大权限(访问几个字节),

// // 因为是一个指向整型数组的指针(数组指针),所以*一个指针访问的是一个数组

// printf("%d\n", sizeof(&a + 1));//&a得到的是整个数组的地址,+1,跳过整个数组的大小

// //,&a+1还是地址,大小就是4或8//4字节(32位平台)或8字节(64位平台)

// printf("%d\n", sizeof(&a[0]));//第1个元素的地址大小//4字节(32位平台)或8字节(64位平台)

// printf("%d\n", sizeof(&a[0] + 1));//第2个元素的地址大小//4字节(32位平台)或8字节(64位平台)

//}

//相等关系(依据上题内容)

// int类型的数组中,sizeof求数组的地址,结果是4字节(32位平台)或8字节(64位平台)

// a==&a[0],a+0==&a[0]+0,*a==*&a[0],*a==a[0],*&a==a,&a[0] + 1=&a[1],&和*可以抵消

//  

//  

////字符数组

//#include<stdio.h>

//#include<string.h>

//int main()

//{

// char arr[] = { 'a','b','c','d','e','f' };//6个元素

// printf("%d\n", sizeof(arr));//sizeof(数组名)数组名表示整个数组元素的大小,单位是字节1*6=6字节

// printf("%d\n", sizeof(arr + 0));//首元素地址+0=首元素地址,地址的大小//4字节(32位平台)或8字节(64位平台)

// printf("%d\n", sizeof(*arr));//数组首元素大小//1字节

// printf("%d\n", sizeof(arr[1]));//第2个元素大小//1字节

// printf("%d\n", sizeof(&arr));//数组地址的大小//4字节(32位平台)或8字节(64位平台)

// printf("%d\n", sizeof(&arr + 1));//数组地址的大小(+1跳过一整个数组)//4字节(32位平台)或8字节(64位平台)

// printf("%d\n", sizeof(&arr[0] + 1)); //第2个元素的地址的大小//4字节(32位平台)或8字节(64位平台)

// //(1为整型,arr[0]发生整型提升,计算的是int的大小,结果为4/8)

// return 0;

//}

//#include<stdio.h>

//#include<string.h>

//int main()//strlen的参数是const char*,任何类型传给strlen都要变成const char*类型

//{//数组名没有sizeof和&时,表示首元素地址

// char arr[] = { 'a','b','c','d','e','f' };

// printf("%d\n", strlen(arr));//arr首元素地址//strlen计算长度时,直至遇到'\0'时,才会停止,所以结果为随机值>=6

// printf("%d\n", strlen(arr + 0)); //arr+0=arr首元素地址//strlen计算长度时,直至遇到'\0'时,才会停止(而),所以结果为随机值>=6

// //printf("%d\n", strlen(*arr));//此代码有问题,strlen(*arr)相当于strlen('a')而ASCII值为97,

// //即strlen(97)把97作为地址传给strlen,所以97被视为野指针,因为97并不是我们的地址,

// //printf("%d\n", strlen(arr[1]));//此代码有问题//此代码传的是b,同理为野指针

// //printf("%d\n", strlen(&arr));//&arr取出整个数组的地址,strlen计算长度时,直至遇到'\0'时,才会停止//随机值

// //printf("%d\n", strlen(&arr + 1));//&arr + 1跳过一整个数组为6个字符所以结果-6//随机值-6

// printf("%d\n", strlen(&arr[0] + 1));//arr[0]是第一个元素,+1为第二个元素。 + 1跳过了第一个元素所以结果-1//随机值-1

//}

//  

//#include<stdio.h>

//int main()

//{

// char arr[] = "abcdef";

// printf("%d\n", sizeof(arr));

// printf("%d\n", sizeof(arr + 0));

// printf("%d\n", sizeof(*arr));

// printf("%d\n", sizeof(arr[1]));

// printf("%d\n", sizeof(&arr));

// printf("%d\n", sizeof(&arr + 1));

// printf("%d\n", sizeof(&arr[0] + 1));

// printf("%d\n", strlen(arr));

// printf("%d\n", strlen(arr + 0));

// printf("%d\n", strlen(*arr));

// printf("%d\n", strlen(arr[1]));

// printf("%d\n", strlen(&arr));

// printf("%d\n", strlen(&arr + 1));

// printf("%d\n", strlen(&arr[0] + 1));

//

// return 0;

//}

//  

//#include<stdio.h>

//int main()

//{

// char* p = "abcdef";

// printf("%d\n", sizeof(p));

// printf("%d\n", sizeof(p + 1));

// printf("%d\n", sizeof(*p));

// printf("%d\n", sizeof(p[0]));

// printf("%d\n", sizeof(&p));

// printf("%d\n", sizeof(&p + 1));

// printf("%d\n", sizeof(&p[0] + 1));

// printf("%d\n", strlen(p));

// printf("%d\n", strlen(p + 1));

// printf("%d\n", strlen(*p));

// printf("%d\n", strlen(p[0]));

// printf("%d\n", strlen(&p));

// printf("%d\n", strlen(&p + 1));

// printf("%d\n", strlen(&p[0] + 1));

// return 0;

//}

//  

////二维数组

//#include<stdio.h>

//int main()

//{

// int a[3][4] = { 0 };

// printf("%d\n", sizeof(a));

// printf("%d\n", sizeof(a[0][0]));

// printf("%d\n", sizeof(a[0]));

// printf("%d\n", sizeof(a[0] + 1));

// printf("%d\n", sizeof(*(a[0] + 1)));

// printf("%d\n", sizeof(a + 1));

// printf("%d\n", sizeof(*(a + 1)));

// printf("%d\n", sizeof(&a[0] + 1));

// printf("%d\n", sizeof(*(&a[0] + 1)));

// printf("%d\n", sizeof(*a));

// printf("%d\n", sizeof(a[3]));

// return 0;

//}

//  

////总结:

////数组名的意义:

////1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

////2. & 数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

////3. 除此之外所有的数组名都表示首元素的地址。