1.题1
#include <stdio.h>
int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p = a + 5, *q = NULL;
*q = *(p+5);
printf("%d %d\n", *p, *q);
return 0;
}
上述代码的运行结果是什么呢?
我们来分析一下:我们创建了一个数组,和两个指针变量,分别是a、p、q,我们发现p中保存的是数组下标为5的数据的地址,q中保存的是NULL,*q=*(p+5),看上去没什么问题就是将*(p+5)的结果赋值给*q,但是在这里我们发现q为NULL,这里对NULL进行了解引用,所以该代码运行起来会报错。
2.题2
设有定义 char *p[]={"Shanghai","Beijing","Honkong"}; 则结果为 j 字符的表达式是( )
A: *p[1] +3 B: *(p[1] +3) C: *(p[3] +1) D: p[3][1]
我们来分析一下:这样初始化的结果是将字符串的首元素地址存入到p中,在这里我们的p[1]其实是找到第2个元素,但是第二个元素就是其首元素地址,再加3就是j的地址然后将其解引用拿到的就是j,这里有点类似二维数组的模式。所以应该选B。
3.题3
int a[3][2] = {1, 2, 3, 4, 5, 6}, *p[3];
p[0] = a[1];
如上述代码中我们定义了一些数据,则 *(p[0]+1) 所代表的数组元素是( )
A: a[0][1] B: a[1][0] C: a[1][1] D: a[1][2]
我们来分析一下:我们创建了一个二维数组a,结构为3行2列 ,上述的赋值方法就是按顺序来赋值的,我们又创建了一个指针数组p,a[1]其实为a[1][0],所以p[0]保存的地址为a第二个元素的地址,也就是它的第二个一维数组的地址,所以p[0]+1就是第二个一维数组的第二个元素的地址,我们再将其解引用,所以我们应该选择C。
4.题4
关于指针下列说法正确的是【多选】( )
A: 任何指针都可以转化为void * B: void *可以转化为任何指针
C: 指针的大小为8个字节 D: 指针虽然高效、灵活但可能不安全
其实这一道题主要考的是x86和x64环境下指针的不同,我们知道x64环境下大小为4个字节,x86为8个字节。所以这题就只有C错误。
5.题5
求输出n以内(含n)完全数的个数。完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。 例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。 注意:本题输入含有多组样例。 输入描述:输入一个数字n 输出描述:输出不超过n的完全数的个数。
#include <stdio.h>
#include <math.h>
int is_perfect_num(int num)
{
int sum = 1;
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {//判断是否能够整除i,能整除则i和结果都是约数
sum += i; //与除数相加
if (i != sqrt(num))//防止除数和结果相同的情况下重复相加
sum += num / i; //与相除结果相加
}
}
if (sum == num) return 1;
return 0;
}
int main()
{
int n;
while (~scanf("%d", &n)) {
int count = 0;
for (int i = 2; i <= n; i++) {//对n以内的数字都进行判断是否是完全数,注意1不参与判断
if (is_perfect_num(i)) count++;
}
printf("%d\n", count);
}
return 0;
}
大家可以多思考度多用自己的方式去着写写看看。