二进制翻转、结构体指针

试写一个函数,传入一个参数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"实际是存放在其他内存区域中的。

posted @ 2024-06-13 21:28  WJnuHhail  阅读(6)  评论(0编辑  收藏  举报