指针和数组的笔试题
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
3.除此之外,所有的数组名都表示首元素的地址
4.sizeof():求数据类型或者表达式的长度的运算符(以字节为单位)
5.strlen():求字符串的长度,以‘\0’作为结束标志符
1.一维数组
//1.一维数组
//(1)sizeof(): 判断数据类型或者表达式长度的运算符(以字节为单位)
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]));//a[1] == *(a + 1) 4
printf("%d\n", sizeof(&a));// 16 &a:整个数组的地址
printf("%d\n",sizeof(&a + 1));// 16
printf("%d\n",sizeof(&a[0])); //4
printf("%d\n",sizeof(&a[0] + 1)); //8
return 0;
}
strlen():
2.字符数组
//2.字符数组
int main(){
//sizeof()
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)); //6
printf("%d\n", sizeof(arr[1])); //1 arr[1] 等价于 *(arr + 1)
printf("%d\n", sizeof(&arr)); //4
printf("%d\n",sizeof(&arr + 1)); //4
printf("%d\n", sizeof(&arr[0] + 1));//4
//strlen():求字符串的长度,以‘\0’作为结束标志符
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)); //上面的随机值 - 1
return 0;
}
3.字符串数组
//3.字符串数组
int main(){
char arr[] = "abcdef";
//sizeof
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 arr[1] 等价于 *(arr + 1)
printf("%d\n", sizeof(&arr)); // 4 数组指针
printf("%d\n", sizeof(&arr + 1)); //4
printf("%d\n", sizeof(&arr[0] + 1)); //4
//strlen
printf("%d\n",strlen(arr)); //6
printf("%d\n",strlen(arr + 0)); //6
/** 编译报错 :传入的变量类型不匹配
printf("%d\n",strlen(*arr));//*arr ——(char)
printf("%d\n", strlen(arr[1]));//arr[1]——char
printf("%d\n", strelen(&arr)); //&arr——数组指针
printf("%d\n", strlen(&arr + 1));
*/
printf("%d\n",strlen(&arr[0] + 1)); //5
return 0;
}
4.指针
//4. 指针
/*
char *p p + 1:加了1个字节
int *p p + 1:加了4 个字节
char **p p + 1 :加了4个字节大小
即加的是 * 前面的类型的大小
*/
int main(){
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])); // 1
printf("%d\n", sizeof(&p)); //4 &p——char**
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));
printf("%d\n",strlen(p[0]));
printf("%d\n",strlen(&p)); &p——char**
printf("%d\n", strlen(&p + 1));
*/
printf("%d\n", strlen(&p[0] + 1)); //5
return 0;
}
5.二维数组
//5. 二维数组
int main(){
int a[3][4] = { 0 };
printf("%d\n", sizeof(a)); //48 a的类型——int(*p)[4]——数组指针
printf("%d\n",sizeof(a[0][0])); //4 a[0]是第0行的数组名——a[0]的类型是int *
printf("%d\n", sizeof(a[0])); //16
printf("%d\n", sizeof(a[0] + 1)); //4
printf("%d\n", sizeof(*a[0] + 1)); //4
printf("%d\n", sizeof(a + 1)); //4
printf("%d\n", sizeof(*(a + 1))); //16
printf("%d\n",sizeof(&a[0] + 1)); //4 int **
printf("%d\n", sizeof(*(&a[0] + 1))); //16
printf("%d\n",sizeof(*a)); //16
return 0;
}
6.笔试题
int main(){
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1); //数组指针 + 1:加整个数组的大小
printf("%d %d", *(a + 1), *(ptr - 1));
return 0;
}
.
7.笔试题
int main(){
int a[4] = { 1, 2, 3, 4 };
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf("%x ,%x",ptr1[-1],*ptr2);
return 0;
}