二进制翻转、结构体指针
试写一个函数,传入一个参数unsigned char num,把num按位进行整个数值翻转。规则:使用位运算,不能另外使用变量存储,写出最优的方案。例:num二进制为10010111; 翻转后 num二进制是11101001
unsigned char reverseBitsChar(unsigned char ch)
{
ch = (ch & 0x55) << 1 | (ch >> 1) & 0x55;
ch = (ch & 0x33) << 2 | (ch >> 2) & 0x33;
ch = (ch & 0x0F) << 4 | (ch >> 4) & 0x0F;
return ch;
}
#include<stdio.h>
struct st
{
int n;
int *m;
}*p;
void main()
{
int d[5]={10,20,30,40,50};
struct st arr[5]= {100,d,200,d+1,300,d+2,400,d+3,500,d+4};
p=arr;
printf("%d\t",++p->n);
printf("%d\t",(++p)->n);
printf("%d\n",++(*p->m));
}
A.101 200 21
B.101 20 30
C.200 101 21
D.101 101 10
/***********************************************************************
keys:结构体指针p指向结构体数组arr,结构体数组中有5个结构体,其中,成员d为数组d中“10”这个成员的地址,成员d+1是数组d中“20”这个成员的地址,成员d+2是数组d中“30”这个成员的地址,成员d+3是数组d中“40”这个成员的地址,成员d+4是数组d中“50”这个成员的地址。
++p->n :指针p得到地址下面的值也就是100,前缀++之后,得到101。由于结构体内有2个元素,所以*m指向的是成员“d”。
(++p)->n :指针p先++,偏移一个单位,此时,p指向成员“200”的地址,再得到地址下面的值也就是200。
++(*p->m) :*p->m得到的是成员“d+1”这个地址下的值为20,由于前++,所以等于21。
选择选项A.
**********************************************************************/
以下说法正确的是:A
A.字符串至少占用1个字节
B.空串不占用内存
C.在char *p = NULL 中,p被称为空指针,不占用内存
D.在char *s[ ] = "apple" 中,s里面存放了字符串"apple",占用了6个字节(含'\0')
keys:
在char *s[ ] = "apple"中,s是一个字符指针数组,s里面存放的是字符串"apple"的首字符'a'的地址,而不是直接存放整个字符串"apple"。整个字符串"apple"实际是存放在其他内存区域中的。