1.
#define N_VALUES 5
int main() {
float values[N_VALUES];
float* vp;
//指针加减整数,指针的关系运算
for (vp = &values[0];vp < &values[N_VALUES];) {
*vp++ = 0;
}
}
2.
//代码1
(*(void(*)())0)();
//代码2
void (*signal(int,void(*)(int)))(int);
//代码2可以简化:
typedef void(*pfun_t)(int);
pfun_t signal(int,pfun_t);
代码1
类型放括号里-->强制类型转换
把0强制类型转换成:void(*)()函数指针类型---0就是一个函数的地址。这里:函数名为0的调用。
代码2
signal是一个函数名,函数参数为int型和函数指针类型,函数返回的也是函数指针类型。代码2是一个函数声明。函数指针指向是int,返回是void。
3
能把函数处理结果的二个数据返回给主函数。在下面的方法中不正确的是(a)
Areturn这两个数
B形参用数组
C形参用二个指针
D用两个全局变量
4
//输出一个整数二进制的奇数位与偶数位。不懂交换奇数位偶数位
void my_print(int m) {
int i = 0;
printf("奇数位:\n");
for (i = 30;i >= 0;i -= 2) {
printf("%d", (m >> i) & 1);
}
printf("\n");
printf("偶数位:\n");
for (i = 31;i >= 1;i -= 2) {
printf("%d", (m >> i) & 1);
}
}
int main() {
int m = 0;
printf("请输入一个整数");
scanf("%d", &m);
my_print(m);
return 0;
}
5
//递归,输入非负整数,返回组成它的数字之和
int Digtongji(int num) {
if (num > 9) {
return Digtongji(num / 10) + num % 10;
}
else {
return num;
}
}
int main() {
unsigned int num = 0;
scanf("%d", &num);
int ret = Digtongji(num);
printf("%d", ret);
return 0;
}
6
//计算n的k次方
double Jisuan(int n, int k) {
if (k < 0) {
return (1.0) / Jisuan(n, -k);
}
else if (k == 0) {
return 1;
}
else {
return n * Jisuan(n, k - 1);
}
}
int main() {
int n = 0;
int k = 0;
scanf("%d%d", &n,&k);
double ret = Jisuan(n,k);
printf("%lf", ret);
return 0;
}
7
关于const
int main() {
const int num = 10;
int n = 100;
int* const p = #
*p = 20;
//p = &n;//err
printf("%d", num);
return 0;
}
int main() {
const int num = 10;
int n = 100;
const int* p = #
//*p = 20;//err
p = &n;
printf("%d", num);
return 0;
}
总结:
- const放在指针变量*左边时,修饰得是*p,不能通过*p改变*p(num)的值。(*p=0错,p=&n对)
- const放在指针变量*右边时,修饰得是p本身,p不能被改变了。(*p=0对,p=&n错)
8
int main() {
char a = -128;
printf("a=%u\n", a);
return 0;
}
结果:
用二进制的补码进行理解
9
关于函数指针
void Print(char* str) {
printf("%s\n", str);
}
int main() {
void(*p)(char*) = Print;
(*p)("hello world!");
//(p)("hello world!");//也可以
return 0;
}
结果:
hello world!
10
struct Text
{
int Num;
char* pcName;
short sData;
char cha[2];
short sBa[4];
}*p;
//让p的值为100000.假设Text类型的变量大小是20个字节。问输出多少。
int main() {
p = (struct Text*)0x100000;
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
}
理解:
这里+0x1==+1;
输出1: 跳过一个结构体类型。数值上加20,而内存为十六进制
输出2:无符号整型+1就是单纯+1
输出3:加了一个指针变量的大小。4/8。这里为4