笔试题
1
:
int
main
()
{
int
a
[
5
]
=
{
1
,
2
,
3
,
4
,
5
};
int *
ptr
=
(
int *
)(
&
a
+
1
);
printf
(
"%d,%d"
,
*
(
a
+
1
),
*
(
ptr
-
1
));
return
0
;
}
//
程序的结果是什么?
a是数组名代表首元素地址,a+1即a[1]是第二个元素
&a+1表示跳过整个数组指向数组后面的地址,如图![](https://i-blog.csdnimg.cn/blog_migrate/3c2eba1f882930fda1ed483e0b8614cb.png)
所以*(prt-1)即arr[4]。
笔试题2
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
;
}
prt1[-1]即*(prt-1),和上题一样
a是首元素地址,强制类型转换位整形,整形加1,跳过一个字节,在强制类型转换为指针,指针四个字节,即被红色方块圈主的是ptr2,如图,以%x(16进制)方式打印应该是02 00 00 00,第一个0省略。
![](https://i-blog.csdnimg.cn/blog_migrate/75dc5dd2431aa303bdc0012d1c4bc445.png)
注:虽然数据在内存中是以2进制方式存储的,但在展示时以16进制方式展示
笔试题3
#include <stdio.h>
int
main
()
{
int
a
[
3
][
2
]
=
{ (
0
,
1
), (
2
,
3
), (
4
,
5
) };
int *
p
;
p
=
a
[
0
];
printf
(
"%d"
,
p
[
0
]);
return
0
;
}
这里要注意 上式和int a[3][2] = { {0, 1}, {2, 3}, {4, 5} };的区别
int a[3][2] = { (0, 1), (2, 3), (4, 5) };中的(0, 1)和(2, 3)和(4, 5)其实时三个逗号表达式,
即 int a[3][2] = { 1, 3, 5 };
所以p[0]即a[0][0]。
笔试题4
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(*p)[4]表示数组指针,p可以指向有四个int型元素的数组。
地址相减算出的是中间的元素个数
地址在内存中由低到高
&p[4][2] - &a[4][2]以%d打印应该是-4,以%p打印,则是-4的补码转换的16进制数
笔试题5
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
;
}
![](https://i-blog.csdnimg.cn/blog_migrate/2b60c8f154fcea375ac3b257d0f7fc3e.png)
笔试题6
#include <stdio.h>
int
main
()
{
char *
a
[]
=
{
"work"
,
"at"
,
"alibaba"
};
char**
pa
=
a
;
pa
++
;
printf
(
"%s\n"
,
*
pa
);
return
0
;
}
![](https://i-blog.csdnimg.cn/blog_migrate/d3f841e4cd2fae99c7c3e78f4f1a09d5.png)
笔试题7
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
;
}
注意优先级*--*++cpp+3是(*(--(*(++cpp))))+3
注意cpp[-2]并不会改变cpp的指向,所以cpp[-2]指向的是cp首元素的地址,但cpp仍然指向cp[-2];
黑色是开始-->红色-->粉色-->蓝色-->紫色
![](https://i-blog.csdnimg.cn/blog_migrate/cbae9e7bdc6db6b68285cff6a12b8348.png)