转自:http://blog.youkuaiyun.com/xhz1234/article/category/864687
以下代码输出什么?
- #include <stdlib.h>
- #include <stdio.h>
- int main(void)
- {
- int a[5] = {1,2,3,4,5};
- int *p = (int*)(&a+1);
- printf("%d, %d\n", *(a+1), *(p-1));
- return 0;
- }
答案:2,5
解析:&a其实是代表数组的地址,&a+1则是地址加上数组的长度
而a代表数组首元素的地址,a+1相当与地址加上一个数组元素的长度
(注:数组的地址和数组首元素的地址是相同的)
昨天晚上笔试,遇到一个题,虽然做对了,但是不知原因,请高人详解。
#include <stdlib.h>
#include <stdio.h>
union{
int n;
char bchar[4];
}UN;
int main(void)
{
UN.bchar[0] = 0;
UN.bchar[1] = 1;
printf("%d\n", UN.n);
return 0;
}
结果为256.当讲UN.bchar[1]改为2,则结果为512。结果依次递增(是256的整数倍)。
为什么是这样啊。
我知道在一个共用体中只有最后一个被赋值的内部变量才是有效的。
上述结果如何解释呢?
共用体(union)是一种数据格式,他能够存储不同类型的数据,但是只能同时存储其中一种类型的数据。共用体类型在有的书中亦译为联合体类型。
结构体(struct)可以同时存储int,long和double等,而共用体只能能存储int, long ,或double.
union on
{
int int_val;
long long_val;
double double_val;
};
可以使用on
on
pail.int_val=15;
cout << pail.int_val;
pail.double_val = 1.38;
vout << pail.double_val;
上述例子,pail有时是int,有时是double型。成员变量标识了变量的容量。
由于共用体每次只能存储一个值,因此它必须有足够的空间来存储最大的成员,所以它使用的是最大成员的长度,上例中则使用了double类型
使用类型,当一个栏目要存储两种不同的类型时。如商品id,可能是纯数字,也肯能是字符描述的,在此使用共用体能够节省空间。
匿名共用体
struct widget
{
char brand[20];
int type;
union
{
long id_num;
char id_char[20];
};
};
...
widget prize;
...
if(prize.type == 1)
cin >> prize.id_num;
else
cin >> prize.id_char[20];
...
今天遇到了一个笔试题,题目如下
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
下面这个程序写的很漂亮,请注意体会!!!!
- /*
- 请编写函数:
- unsigned int reverse_bites(unsigned int value);
- 这个函数的返回值是把value的二进制位模式从左到右交换一次后的值。例如,在32位机器上,25这个值包含下列各个位:
- 00000000000000000000000000011001
- 函数的返回值应该是2,550,136,832,它的二进制位模式是:
- 10011000000000000000000000000000
- 编写函数时要注意不要让它依赖于你的机器上整型值的长度。
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- size_t reverse_bites(size_t value);
- int main(void)
- {
- int input;
- printf("Please input a number\n");
- scanf("%d", &input);
- printf("The result after reverse is %d\n", reverse_bites(input));
- system("pause");
- return 0;
- }
- size_t reverse_bites(size_t value)
- {
- int answer = 0;
- for(int i = 1; i != 0; i <<= 1)
- {
- answer <<= 1;
- if(value & 1)
- answer |= 1;
- value >>= 1;
- }
- return answer;
- }