試寫一個函式,傳入一個引數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"實際是存放在其他記憶體區域中的。