目录
0.复习
1.笔试题1
2.笔试题2
3.笔试题3
4.笔试题4
5.笔试题5
0.复习
在做笔试题之前,我们首先复习一下数组名的理解
数组名的所有情况:
1.&数组名,取出的是整个数组的地址
2.sizeof(数组名),这里的数组名表示整个数组,这里的数组名必须单独出现
3.其余所有情况都为首元素地址
其次我们复习一下 sizeof 和 strlen 的知识
sizeof测量字节大小
strlen测量字符串长度,直到 '\0' 停止
1.笔试题1
//笔试题1
int a[] = { 1,2,3,4 };
printf("%zd\n", sizeof(a));
//a表示整个数组,sizeof测量整个数组,打印16
printf("%zd\n", sizeof(a + 0));
//a是数组首元素地址,地址加0,还是首元素地址,是地址就打印4/8
printf("%zd\n", sizeof(*a));
//首元素地址解引用=1,打印4
printf("%zd\n", sizeof(a+1));
//首元素地址加1,跳过1个sizeof(int),但是是地址,是地址就打印4/8
printf("%zd\n", sizeof(a[1]));
//首元素,打印4
printf("%zd\n", sizeof(&a));
//取出整个元素地址,整个元素地址为首元素地址,是地址就打印4/8
printf("%zd\n", sizeof(*&a));
//取出整个元素地址,解引用为整个数组,16
printf("%zd\n", sizeof(&a+1));
//是地址,打印4/8
printf("%zd\n", sizeof(&a[0]));
//取出首元素地址,是地址就打印4/8
printf("%zd\n", sizeof(&a[0] + 1));
//取出首元素+1个sizeof(int)的地址,是地址就打印4/8
sizeof(地址),是地址就打印 4/8
2.笔试题2
//笔试题2
char arr[] = { 'a','b','c','d','e','f' };
printf("%zd\n", sizeof(arr));
//传递的是整个数组,打印6
printf("%zd\n", sizeof(arr+0));
//传递首元素地址,加0还是地址,是地址就打印4/8
printf("%zd\n", sizeof(*arr));
//传递的是首元素,首元素地址解引用 = 'a',打印1
printf("%zd\n", sizeof(arr[1]));
//首元素,打印1
printf("%zd\n", sizeof(&arr));
//传递的是整个数组的地址,是地址就打印4/8
printf("%zd\n", sizeof(&arr+1));
//传递的是地址,是地址就打印4/8
printf("%zd\n", sizeof(&arr[0]+1));
//传递的是首元素的地址加1,指向的是第二个元素的地址,是地址就打印4/8
3.笔试题3
知识:strlen接受的参数是字符型地址
字符串都是从哪个地址开始数
//笔试题3
char arr[] = { 'a','b','c','d','e','f' };
printf("%zd\n", strlen(arr));
//传递的是首元素的地址,从a开始数,没有'\0'打印随机值
printf("%zd\n", strlen(arr+0));
//传递的是首元素地址,从a开始数,没有'\0'打印随机值
printf("%zd\n", strlen(*arr));
//传递的是字符a,错误传递,strlen接受的参数是地址,报错
printf("%zd\n", strlen(arr[1]));
//传递的是字符a,strlen接受的参数是地址,报错
printf("%zd\n", strlen(&arr));
//传递的是整个元素的地址,也就是从a开始数,没有'\0'打印随机值
printf("%zd\n", strlen(&arr+1));
//传递的是整个元素的地址加1,跳过了整个数组的地址,没有'\0'打印随机值
printf("%zd\n", strlen(&arr[0]+1));
//传递的是首元素地址加1,所以传递的是b的地址,从b开始数,没有'\0'打印随机值
4.笔试题4
//笔试题4
char arr[] = { "abcdef" };
printf("%zd\n", strlen(arr));
//传递的是首元素的地址,从首元素地址开始数,打印6
printf("%zd\n", strlen(arr+0));
//从首元素地址开始数打印6
printf("%zd\n", strlen(*arr));
//传递的不是地址,报错
printf("%zd\n", strlen(arr[1]));
//传递的不是地址,报错
printf("%zd\n", strlen(&arr));
//从首元素开始数,打印6
printf("%zd\n", strlen(&arr+1));
//跳过一整个数组,打印随机数
printf("%zd\n", strlen(&arr[0]+1));
//从第二个元素的地址开始数,打印5
5.笔试题5
//笔试题5
char arr[] = { "abcdef" };
printf("%zd\n", sizeof(arr));
//传递的是整个数组,但是字符串带 '\0' ,打印7!!!
printf("%zd\n", sizeof(arr+0));
//传递的是首元素地址,是地址就打印4/8
printf("%zd\n", sizeof(*arr));
//传递的是首元素,打印1
printf("%zd\n", sizeof(arr[1]));
//打印1
printf("%zd\n", sizeof(&arr));
//传递的是整个元素的地址,是地址就打印4/8
printf("%zd\n", sizeof(&arr+1));
//传递的是跳过整个元素的地址,是地址就打印4/8
printf("%zd\n", sizeof(&arr[0]+1));
//传递的是首元素地址加1,就是第二个元素的地址,是地址就打印4/8