指针和数组笔试题解析
1、一维数组
int a[] = {1, 2, 3, 4};
printf("%d\n",sizeof(a)); //16,整个数组,大小为16个字节
printf("%d\n",sizeof(a+0)); //4,首元素的地址,地址即指针,指针大小为4个字节
printf("%d\n",sizeof(*a)); //4,首元素,为int类型,大小为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,第二个元素的地址
2、字符数组
char arr[] = {'a','b','c','d','e','f'};
//字符数组初始化时为写入'\0',所以不包括'\0'
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,第二个元素的地址
//strlen() 直到遇到'\0'停止,所求字符串长度不包括'\0'
//strlen(const char*)
printf("%d\n", strlen(arr)); //随机值,设为10
printf("%d\n", strlen(arr+0)); //随机值10
printf("%d\n", strlen(*arr)); //ERROR,类型不匹配
printf("%d\n", strlen(arr[1])); //ERROR,类型不匹配
printf("%d\n", strlen(&arr)); //随机值10,Warning(此处为数组指针类型)
printf("%d\n", strlen(&arr+1)); //随机值4
printf("%d\n", strlen(&arr[0]+1)); //随机值9
char arr[] = "abcdef";
//字符串在字符常量区自动写入'\0'
printf("%d\n", sizeof(arr)); //7
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("%d\n", strlen(arr)); //6
printf("%d\n", strlen(arr+0)); //6
printf("%d\n", strlen(*arr)); //ERROR
printf("%d\n", strlen(arr[1])); //ERROR
printf("%d\n", strlen(&arr)); //6,Warning
printf("%d\n", strlen(&arr+1)); //随机值
printf("%d\n", strlen(&arr[0]+1)); //5
char *p = "abcdef";
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])); //4
printf("%d\n", sizeof(&p)); //4,p变量的地址
printf("%d\n", sizeof(&p+1)); //4,下一个指针的地址
printf("%d\n", sizeof(&p[0]+1)); //4
printf("%d\n", strlen(p)); //6
printf("%d\n", strlen(p+1)); //5
printf("%d\n", strlen(*p)); //ERROR
printf("%d\n", strlen(p[0])); //ERROR
printf("%d\n", strlen(&p)); //ERROR,p的地址,为二级指针
printf("%d\n", strlen(&p+1)); //ERROR,下一个指针的地址,为二级指针
printf("%d\n", strlen(&p[0]+1)); //5
3、二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48
printf("%d\n",sizeof(a[0][0])); //4,第一个int类型的变量
printf("%d\n",sizeof(a[0])); //16,可将a[0]类似看作数组名,a[0]中包括4个int类型的变量
printf("%d\n",sizeof(a[0]+1)); //4,a[0][1]的地址
printf("%d\n",sizeof(*(a[0]+1))); //4,a[0][1]的内容
printf("%d\n",sizeof(a+1)); //4,类似于a[1][0]的地址
printf("%d\n",sizeof(*(a+1))); /16,a[1]的内容
printf("%d\n",sizeof(&a[0]+1)); //4,&a[0]为数组指针,加1为a[1]的地址
printf("%d\n",sizeof(*(&a[0]+1))); //16,a[1]的内容
printf("%d\n",sizeof(*a)); //16,a[0]的内容
printf("%d\n",sizeof(a[3])); //16,虽然数组下标越界,但不会报错。
//允许读取超出范围的下一个元素,但不允许写入。