////////————————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. 除此之外所有的数组名都表示首元素的地址。
标签:arr,字节,30,C语言,初学,数组,printf,sizeof,strlen From: https://blog.51cto.com/KKhahaha/8862490