携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
笔试题5
int main()
{
int a[5][5];
int(*p)[4];
p = a;
printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
return 0;
}
解析
int main()
{
int a[5][5];
int(*p)[4];
//p为int [4] 类型的数组指针
p = a;
//a为首元素地址,第一行的地址
//a为 int [5]数组指针
//将 a 赋值给 p
printf("%p,%d\n", &p[4][2] - &a[4][2],
&p[4][2] - &a[4][2]); // fffffffc -4
// &p[4][2] - &a[4][2] = -4
return 0;
}
笔试题6
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
解析
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* ptr1 = (int*)(&aa + 1);
//&aa+1 跳过一个数组大小,数组指针
// aa+1指向数组的末尾
//(int*)(&aa + 1)转换成int*指针
int* ptr2 = (int*)(*(aa + 1));
//aa+1首元素地址 + 1 指向第二个元素地址
// 而这里的首元素地址就是第一行地址
// 加一后指向第二行地址
//(int*)(*(aa + 1))转换成 int*指针
printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10,5
//ptr1-1数组末尾指针-1 ptr1是int*指针
// 所以减一得到 最后一个元素地址
// 解引用后得到元素 10
//ptr2-1第二行数组地址-1
// 因为prt2是int*指针类型-1 跳过一个int类型
//*(ptr2-1)得到第一行最后一个元素 5
return 0;
}
笔试题7
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
解析
int main()
{
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
//pa++ 后指向char* "at"
printf("%s\n", *pa); // at
return 0;
}
笔试题8
int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp+3);
printf("%s\n", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1);
return 0;
}
解析
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp); //POINT
printf("%s\n", *-- * ++cpp + 3);//ER
printf("%s\n", *cpp[-2] + 3); //ST
printf("%s\n", cpp[-1][-1] + 1);//EW
return 0;
}
C语言指针完结,欢迎大佬的评论,感谢支持,点赞,收藏!