1.第一题是一个输入判断,其中使用到了ASCLL码,和地址有关的东西
#include<stdio.h>
#include<string.h>
struct A{
long a;
int b;
};
int main(){
struct A num ={0x6e694c756f796978};
char ch='0';
for(int i=0;ch;i++){
ch=*((char *)&num+i);
printf("%c",ch);
}
printf("\n");
return 0;
}
我进行了一个修改,用来判断会不会反向(类似今年的题。。。)结果没有,那就说明是正常的正序输入 ,输入的是字符的ASClL码
2.改写程序,在不改变const的情况下使用更多的方法改变b
#include<stdio.h>
int main(){
const int b=10;
/*
*/
return 0;
}
#include <stdio.h>
int main()
{
const int a = 10;
int *p =(int *) &a;
(*p)++;
printf("%d\n", a);
return 0;
}
指针本身是常量的话是不可以被修改的,指针指向的内容是常量也是不可以被修改的。
那么我可以给其地址的地址进行改变,这里要注意把a的地址赋给指针时要进行类型转化,不然会报错。
即可能会说初始化丢失了指针目标类型的限定
3.
struct node {
*(int*)((char*)a+2*sizeof(structn))=100;
};
struct n{
char a;
int b;
};
intmain(intargc,char*argv[]){
struct node a[2]={{1,2,3},{4,5,6}};
*(int *)((char *)a+2*sizeof(struct n))=100;
return 0;
}
程序拥有两个结构体变量, struct node a[2] = {{1,2,3},{4,5,6}};这一句是定义了一个结构体数组,在下一句中生成了48个字节的空间,然后对三十二位以后的a进行修改,使其改变,所以
a中的最后一位发生改变,即变成了{{1,2,3},{4,5,100}}
4.j解释函数调用的问题
#include<stdio.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main(int argc, char* argv[]) {
printf("%s\n", h(f(1,2)));
printf("%s\n", g(f(1,2)));
return 0;
}
这个程序重要的是开始定义的三个宏,即
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
在这里通过分析可以得到,第一个是将后期遇到的类似于f(a,b)这样形式的存在都改成为ab的形式,第二个是说定义一个g(A)这样的存在,只要遇到便将其中数据放出,最后定义了g(a),h(a)两个函数。也是可以得到,在第一个输出时,外部不是g(a)所以将里面的输出,同时因为##的存在,所以将其中所有的符号删除,只输出12,第二个printf里面为第一个相同的情况,但外部为g(x)所以会进行一个修改,按照格式输出所以得到f(1,2)
5.
#include <stdio.h>
#include<string.h>
void reserveworld(char* str,int s,int e) {
while (s < e) {
char c = str[s];
str[s] = str[e];
str[e] = c;
s++;
e--;
}
}
void reserve(char *str,int n) {
int t = 0;
for (int i = 0; i <= n; i++) {
if (str[i] == ' ' || str[i] == '\0') {
reserveworld(str, t, i - 1);
t = i + 1;
}
}
}
int main() {
char str[100] = "";
gets(str);
reserveworld(str, 0, strlen(str)-1);
reserve(str, strlen(str));
printf("%s", str);
return 0;
}