2011-01-27 3 views

답변

14

C의 모든 변수를 감안할 때, 당신은 "주소의"연산자 &를 사용하여 주소를 얻을 수

printf("%p\n", &x); // Print address of x 

정수 값의 개별 비트에 액세스하려면 비트 단위로 시프트 연산자와 비트 AND를 사용하여 원하는 비트를 적절한 위치로 이동 한 다음 다른 비트를 마스크 아웃 할 수 있습니다. 예를 들어, LSB 자리에 다섯 번째 비트를 떠나, x의 5 비트, 당신은이 숫자 4 개 비트를 아래로 이동

int x; 
int fifthBit = (x >> 4) & 0x1; 

쓸 수 있습니다 얻을 수 있습니다. 이 값과 1을 결합하면 (가장 낮은 지점에 1 비트가 있고 다른 모든 곳에 0 비트가 있음) 다른 비트를 마스크 아웃하여 값을 반환합니다. 예를 들어 : 이것은 나를 위해 일한

int x = 31; // 11111 
prtinf("%d\n", (x >> 4) & 0x1); // Prints 1 
+2

을 할 수 없었다 +1 충실한 조언이든 아니든간에 "포인터에 관해 읽는 것"보다 훨씬 도움이됩니다. –

+0

것은 사용자가 주소를 제공한다는 것입니다 ... 배열로 가져올 계획 이었지만 그걸 알아낼 수 없었습니다. – Buckeye

+0

@ TipiTip- 사용자가 지정한 임의의 메모리 주소를 읽을 수 없습니다. 만약 그렇다면 OS가 프로그램을 거의 죽일 것입니다. 이것이 안전하다고 생각하는 이유가 있다면'char * rawMemoryPtr = (char *) myIntegerAddress; '라고 쓰면 원시 메모리에 대한 포인터의 위치를 ​​포함하는 정수를 타입 변환 할 수 있습니다. – templatetypedef

0

, 등)

// uses :: head 
    // ---------------------------------------------- 
    #include <stdio.h> 
    // ---------------------------------------------- 


    // func :: main 
    // ---------------------------------------------- 
    int main() 
    { 
     void *fooz = "bar"; 
     char addr[64]; 

     sprintf(addr, "%p", &fooz); 

     // do some stuff with `addr`, or not :) 
     puts(addr); 

     return 0; 
    } 
    // ---------------------------------------------- 

인쇄 무엇인가 : ~> 0x7ffdfb91d698

관련 문제