「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」。
题目四:
int main()
{
int a[3][2] = { (0,1),(2,3),(4,5) };
int* p;
p = a[0];
printf("%d", p[0]);
return 0;
}
解析:
逗号表达式,结果是最后一个表达式结果 - (0,1)结果为1,(2,3)结果为3,(4,5)结果为5
后几位自动用0补齐
答案:1
题目五:
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;
}
解析:
p[4][2] = (*(p + 4) + 2)
+4 — 跳过4个整型
地址 - 地址 = 两个地址之间的元素个数
答案:FFFFFFFC -4
题目六:
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\n", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
解析:
aa[1] - 第二行首元素地址
答案:10,5
几个相等的表达方式:
int arr[10] = { 1,2,3,4,5 };
int* p = arr;
*(p + 2) == p[2] == * (arr + 2) == arr[2]
题目七:
int main()
{
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
解析:
char* p = "abcdef";//字符指针,把常量字符串首字符的地址a放到p中
pa++指向第二个元素
答案:at
题目八:*
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;
}
解析:
printf中的++是真实存在的(前后有关联关系,cpp在+的时候在发生变化)
*cpp[-2]+3 == * *(cpp+(-2)) +3
cpp[-1][-1]+1 == *( *(cpp-1) -1 ) +1
答案:POINT, ER, ST, EW
题目九:
int main()
{
unsigned long pulArray[] = { 6,7,8,9,10 };
unsigned long* pulPtr;
pulPtr = pulArray;
*(pulPtr + 3) += 3;
printf("%d,%d\n", *pulPtr, *(pulPtr + 3));
return 0;
}
答案:6,12
题目十:
下面关于指针运算说法镇古鳄的是:()
A.整型指针+1,指针偏移一个字节
B.指针-指针得到的是指针与指针的字节个数
C.整型指针解引用操作访问四个字节
D.指针不能比较大小
答案:C
解析:
A.指针偏移一个整型大小
B.得到的是指针与指针之间的元素个数
D.指针可以比较大小