1. 下面代码的输出是什么?试着解释原因,说出你的理解
struct A {
long a;
int b;
};
int main(int argc, char* argv[])
{
struct A num = {0x6e694c756f796978,0x7875};
char ch = '0';
for(int i = 0; ch; i++)
{
ch = *((char *)&num + i);
printf("%c",ch);
}
printf("\n");
return 0;
}
2. 改写代码,在不改变 const 的情况下尝试使用更多的方法改变b的值。
int main(int argc, char* argv[])
{
const int b = 10;
// 自行添加语句,改变变量b的值
return 0;
}
解答:
#1
int *p;
p=&b;
*p=15;
3.哪些元素被改变了,说说原因。
struct node {
char a;
int b;
short c;
};
struct n {
char a;
int b;
};
int main(int argc, char* argv[])
{
struct node a[2] = {{1,2,3},{4,5,6}};
*(int *)((char *)a + 2 * sizeof(struct n)) = 100;
return 0;
}
解答:sizeof(struct n)=5
双重指针a相当于取a[0][0]地址
解后地址后该位置的数据要等于100
4. 解释以下代码的输出结果。
void func(char* a)
{
printf("%lu\n", sizeof(a)) ;
printf("%lu\n", strlen(a)) ;
}
int main(int argc, char* argv[])
{
char a[] = "hello world";
char* b = "hello world";
printf("%s", b);
func(a);
printf("%lu\n", sizeof(a));
printf("%lu\n", strlen(a));
return 0;
}
输出为:hello world:输出该字符串 8 11 12
sizeof:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。strlen:遍历数组或指针返回字符串长度
5.解释以下的输出结果。
#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;
}
解答:
a