指针相关博客
第一题
- 下列for循环的循环体执行次数为()
cpp
for(int i = 10, j = 1; i = j = 0; ++i, --j)
A:0
B:1
C:无限
D:以上都不对
答案及解析 A
for循环的判断条件是 i = j = 0;赋值语句做判断条件,赋值表达式结果为右操作数的值,所以右操作数为0,整个结果就是0,0为假,非0为真,那执行次数就是0
第二题
- 对于下面 **char (*p)[16]**的声明描述正确的一项是()
A:p是长度为16的字符指针数组B:p是包含16个字符的字符串
C:p是指向长度为16的字符数组的指针
D:p是长度为16的字符数组
答案及解析 C
首先*会先和p结合形成指针,指针的类型是char [16],是一个长度16的字符数组,所以这是一个指向长度为16的字符数组的指针。
第三题
- 有以下程序,程序运行后的输出结果是()
cpp
void ss (char *s,char t)
{
while (*s)
{
if(*s == t)
*s = t - 'a' + 'A';
s++;
}
}
int main()
{
char str1[100] = "abcddfefdbd", c = 'd';
ss(str1, c);
printf ("%s\n", str1);
}
A:ABCDDEFEDBD
B:abcDDfefDbD
C:abcAAfefAbA
D:Abcddfefdbd
答案及解析 B
本题中ss函数的功能就是将字符串中的d都变成大写的,所以选B
第四题
- 有以下语句定义,则选项中表达式错误的是()
cpp
int x = 5;
const int *const p = &x;
int *const q = &x;
int const *next = &x;
const int *j = &x;
A:*p = 1;
B:q++;
C:next++;
D:( *j )++;
答案及解析 ABD
const 在 * 左侧,指针指向的内容不可以修改;
const 在 * 右侧,指针本身不可修改
第五题
- 有以下程序输出结果是( )
cpp
#include <stdio.h>
int main()
{
int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
int(*p)[4] = a, i, j, k = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
k = k + *(*(p + i) + j);
printf("%d", k);
return 0;
}
A:40
B:60
C:80
D:100
答案及解析 B
首先一个二维数组和一个数组指针如下图:
第一次循环:k = k + *(*(p + i) + j); i = 0;j = 0;k = 0
k = k + **p
p = a ,a 是二维数组名,代表的是第一行的地址,也就是&a[0]
p = &a[0],所以*p = *&a[0] = a[0]
a[0]是二维数组的行,代表的是每行的首元素地址,就是&a[0][0],
*p = &a[0][0];
**p = *&a[0][0] = a[0][0] = 1;
k = k + 1 = 1
第二次循环:k = k + *(*(p + i) + j);i = 0;j = 1;k = 1k = k + *( *p + 1)
*p = &a[0][0]
k = k + *( &a[0][0] + 1) = k + *&a[0] [1] = k + a[0][1] = 4
k = 4
第三次循环:k = k + *(*(p + i) + j);i = 1;j = 0;k = 4;k = k + *(*(p + 1) + 0) = k + *(*(p + 1)) = 12
第四次循环:k = k + *(*(p + i) + j);i = 1;j = 1;k = 13
k = k + *(*(p + 1) + 1) = 23
第五次循环:k = k + *(*(p + i) + j);i = 2;j = 0;k = 24
k = k + *(*(p + 2)) = 40
第六次循环:k = k + *(*(p + i) + j);i = 2;j = 1;k = 41
k = k + *(*(p + 2) + 1) = k + 19 = 60;