努力学习,让C语言融进你我的生活~
提示:以下是本篇文章正文内容,下面包含测试题及答案
答:内存的地址。
答:是的,指针变量只能存放地址。
答:一个。只有a是指针变量,b和c是普通整型变量。
答:语法错误。int *a,*b,*c才是定义了三个指针变量。
A. 1 个 32 位整数:1735159650e
B. 2 个 16 位整数:26476 和 28514
C. 4 个字符:glob
D. 浮点数:1.116533 * 10^24
答:全都是正确答案。
解释:不能简单地通过检查内存中的一个值来判断它的类型。其实它还可以被解释为机器指令!内存中存放的值不是 0 就是 1,如何解释,主要看定义。如果你看不到定义(你在逆向破解一个程序),那么为了判断值的类型,你必须观察程序中这个值的使用方式(如果使用整型算术指令,这个值就被解释为整数;如果使用浮点型指令,它就是浮点数)。
include <stdio.h>
int main()
{
printf("%p\n", &110);
return 0;
}
答:这样做不可取!
解释:事实上这涉及到左值和右值的问题,取址操作符(&)的作用对象应该是一个左值(lvalue),而常数是右值(rvalue)。左值用于识别或定位存储位置的标识符,左值同时还必须是可改变的。右值可以理解为 readable value,即任何可读取的值。
#include
int main()
{
int a, b;
b = 110;
a = &b;
printf("%d\n", *a);
return 0;
}
答:虽然说在我们的操作系统里:sizeof(int) == sizeof(*int) 说明存放指针变量和存放整型变量所需的存储空间是一样的。但这并不说明他们就可以互相取代。这种做法编译器并不会认可,它会毫不犹豫给你直接报错:
#include
int main()
{
int *a;
printf("%p\n", a);
return 0;
}
答:虽然我们声明了一个指针变量 a,但并未对它进行初始化,这是非常危险的行为!因为我们没办法预测这个指针变量的值会被初始化为什么,它只是恰好内存中存在的“随机值”。
#include
int main()
{
int a = 110;
int *b = &a;
*b = *b - 10;
printf("a = %d\n", a);
return 0;
}
答:打印结果是100。
解释:定义指针变量 b 的时候,存放的是变量 a 的地址。在此之后,*b 即对变量 a 的间接访问(通过地址访问 a 变量)。所以 *b = *b - 10; 相当于 a = a - 10; 也就是说,通过指针对一个变量间接访问,你可以理解为把它作为那个变量本身使唤(即 *b == a)。
#include "stdio.h"
int main()
{
int count = 3;
int num[count];
int i, j;
printf("请输入三个数:");
scanf("%d %d %d",&num[0],&num[1],&num[2]);
for(i=0; i<(count-1); i++)
{
for(j=i+1; j<count; j++)
{
if(num[i] >= num[j])
{
num[i] ^= num[j];
num[j] ^= num[i];
num[i] ^= num[j];
}
}
}
printf("%d <= %d <= %d\n",num[0],num[1],num[2]);
return 0;
}
方法2:
#include
int main(void)
{
int a, b, c, t;
printf("请输入三个数:");
scanf("%d%d%d", &a, &b, &c);
int *pa = &a;
int *pb = &b;
int *pc = &c;
if (a > b)
{
t = *pa;
*pa = *pb;
*pb = t;
}
if (a > c)
{
t = *pa;
*pa = *pc;
*pc = t;
}
if (b > c)
{
t = *pb;
*pb = *pc;
*pc = t;
}
printf("%d <= %d <= %d\n", *pa, *pb, *pc);
printf("%d <= %d <= %d\n", a, b, c);
return 0;
}
要求:用户输入某个整数,验证该数是否符合尼科彻斯定理,并将对应的式子打印出来。
程序实现如下图:
答案:
#include
int main()
{
int i, j, n, cubed, sum = 0;
printf("请输入一个整数:");
scanf("%d", &n);
cubed = n * n * n;
for (i = 1; i < cubed; i += 2)
{
for (j = i; j < cubed; j += 2)
{
sum += j;
if (sum == cubed)
{
if (j - i > 4)
{
printf("%d = %d + %d ... + %d\n", cubed, i, i+2, j);
}
else
{
printf("%d = %d + %d + %d\n", cubed, i, i+2, i+4);
}
goto FINDIT;
}
if (sum > cubed)
{
sum = 0;
break;
}
}
}
FINDIT:
return 0;
}
附加要求:有些用户可能不希望看到打印一丢丢式子,所以是否打印应该让用户确定(提示 -> 用二维数组先保存结果)。
答案:
#include
#include
int main()
{
int i, j, n, count, cubed, sum = 0;
bool result = true; // 用于存放验证结果
char answer;
printf("请输入一个整数:");
scanf("%d", &count);
int array[count][4];
// 变长数组无法再定义是初始化,只能手动了...
for (n = 3; n <= count; n++)
{
// 初始化第一列,因为后边用于验证
array[n][0] = 0;
}
for (n = 3; n <= count; n++)
{
cubed = n * n * n;
for (i = 1; i < cubed; i += 2)
{
for (j = i; j < cubed; j += 2)
{
sum += j;
if (sum == cubed)
{
array[n][0] = cubed;
array[n][1] = i;
array[n][2] = i + 2;
array[n][3] = j;
goto FINDIT;
}
if (sum > cubed)
{
sum = 0;
break;
}
}
}
FINDIT:
; // 空语句
}
// 检查
for (n = 3; n <= count; n++)
{
if (array[n][0] == 0)
{
result = false;
break;
}
}
if (result)
{
printf("经验证,3 ~ %d 之间所有的整数均符合尼科彻斯定理!\n\n", count);
printf("是否打印所有式子(y/n):");
getchar();
scanf("%c", &answer);
}
else
{
printf("验证失败:整数 %d 无法找到对应的连续奇数!\n");
}
if (answer == 'y')
{
// 打印
for (n = 3; n <= count; n++)
{
if (array[n][3] - array[n][1] > 4)
{
printf("%d^3 == %d == %d + %d +... + %d\n", n, array[n][0], array[n][1], array[n][2], array[n][3]);
}
else
{
printf("%d^3 == %d == %d + %d + %d\n", n, array[n][0], array[n][1], array[n][2], array[n][3]);
}
}
}
return 0;
}