source

c/c++에서 포인터의 주소를 얻는 방법은 무엇입니까?

ittop 2023. 6. 26. 23:11
반응형

c/c++에서 포인터의 주소를 얻는 방법은 무엇입니까?

c/c++에서 포인터의 주소를 얻는 방법은 무엇입니까?

예: 아래 코드가 있습니다.

int a =10;
int *p = &a;

포인터의 주소를 가져오려면 어떻게 해야 합니까?p이제 p의 주소를 출력하고 싶은데 어떻게 해야 하나요?

print("%s", ??) 나는 무엇을 건네주나요?

pdo의 주소를 가져오는 방법:

int **pp = &p;

계속할 수 있습니다.

int ***ppp = &pp;
int ****pppp = &ppp;
...

또는 C++11에서만 다음을 수행할 수 있습니다.

auto pp = std::addressof(p);

주소를 C로 인쇄하려면 대부분의 컴파일러가 지원합니다.%p따라서 다음과 같은 작업을 수행할 수 있습니다.

printf("addr: %p", pp);

그렇지 않으면 캐스트해야 합니다(32비트 플랫폼 필요).

printf("addr: 0x%u", (unsigned)pp);

C++에서는 다음을 수행할 수 있습니다.

cout << "addr: " << pp;
int a = 10;

의 주소를 가져오려면 다음을 수행합니다.&a(주소:a를 반환합니다.int*(int로 이동)

int *p = &a;

그런 다음 a의 주소를 저장합니다.p유형의int*.

마지막으로, 만약 당신이 한다면,&p의 주소를 알 수 있습니다.p유형의int**즉, int에 대한 포인터:

int** p_ptr = &p;

방금 당신의 편집을 보았습니다.

포인터의 주소를 인쇄하려면 변환해야 합니다.

printf("address of pointer is: 0x%0X\n", (unsigned)&p);
printf("address of pointer to pointer is: 0x%0X\n", (unsigned)&p_ptr);

또는 만약 당신의 printf가 그것을 지원한다면,%p:

printf("address of pointer is: %p\n", p);
printf("address of pointer to pointer is: %p\n", p_ptr);

&a의 주소를 제공합니다.a-&p의 주소를 제공합니다.p.

int * * p_to_p = &p;

다음 C 소스를 사용하는 경우:

int a = 10;
int * ptr = &a;

사용

printf("The address of ptr is %p\n", (void *) &ptr);

주소를 인쇄하다ptr.

변환 지정자p포인터의 을 인쇄할 수 있는 유일한 변환 지정자이며 이를 사용하도록 정의됩니다.void*입력된 포인터만 있습니다.

시작:

p

void * pointer 인수는 16진수로 인쇄됩니다(%#x 또는 %#lx인 경우).

사용할 수 있습니다.%p형식적인항상 포인터를 던지는 것이 최선의 방법입니다.void*인쇄 전에

C 표준은 다음과 같습니다.

인수는 void에 대한 포인터여야 합니다.포인터의 값은 구현 정의된 방식으로 일련의 인쇄 문자로 변환됩니다.

방법은 다음과 같습니다.

printf("%p", (void*)p);

C에서 %p를 사용할 수 있습니다.

C에서:

printf("%p",p)

C++에서:

cout<<"Address of pointer p is: "<<p

당신은 이것을 사용할 수 있습니다.

주식회사

int a =10;
int *p = &a;     
int **pp = &p;
printf("%u",&p);

C++로

cout<<p;

C++에서는 다음을 수행할 수 있습니다.

// Declaration and assign variable a
int a = 7;
// Declaration pointer b
int* b;
// Assign address of variable a to pointer b
b = &a;

// Declaration pointer c
int** c;
// Assign address of pointer b to pointer c
c = &b;

std::cout << "a: " << a << "\n";       // Print value of variable a
std::cout << "&a: " << &a << "\n";     // Print address of variable a

std::cout << "" << "" << "\n";

std::cout << "b: " << b << "\n";       // Print address of variable a
std::cout << "*b: " << *b << "\n";     // Print value of variable a
std::cout << "&b: " << &b << "\n";     // Print address of pointer b

std::cout << "" << "" << "\n";

std::cout << "c: " << c << "\n";       // Print address of pointer b
std::cout << "**c: " << **c << "\n";   // Print value of variable a
std::cout << "*c: " << *c << "\n";     // Print address of variable a
std::cout << "&c: " << &c << "\n";     // Print address of pointer c

먼저 포인터가 복잡하지 않다는 것을 이해해야 합니다.포인터가 변수의 주소를 표시하고 있습니다.

예:

int a = 10;
int *p = &a;  // This means giving a pointer of variable "a" to int pointer variable "p"

그리고 "포인터는 주소입니다"와 "주소는 숫자 값입니다"를 이해해야 합니다.따라서 변수의 주소를 정수로 얻을 수 있습니다.

int a = 10;
unsigned long address = (unsigned long)&a;

// comparison
printf("%p\n", &a);
printf("%ld\n", address);

출력이 아래에 있습니다.

0x7fff1216619c
7fff1216619c

참고:

64비트 컴퓨터를 사용하면 아래와 같이 포인터를 얻을 수 없습니다.

int a = 10;
unsigned int address = (unsigned int)&a;

64비트 시스템에서 포인터는 8바이트(64비트)이지만 int는 4바이트이기 때문입니다.따라서 8바이트 메모리 주소를 4바이트 변수에 지정할 수 없습니다.

사용해야 합니다.long long또는long변수의 주소를 가져옵니다.

  • long long는 항상 8바이트입니다.
  • long는 32비트 시스템용으로 코드가 컴파일되었을 때 4바이트입니다.
  • long64비트 시스템용으로 코드가 컴파일되었을 때는 8바이트입니다.

은 따서다사야합니다해용을음을 사용해야 .long포인터를 수신합니다.

Linux 터미널에서 이러한 코드를 컴파일하려고 하면 다음과 같은 오류가 발생할 수 있습니다.

인수 유형 int를 예상합니다.

왜냐하면, 당신이 메모리 주소를 얻으려고 할 때.printf을 로지할수없으로 할 수 .%d비디오에 나온 것처럼.그것 대신에, 그것을 넣으려고 노력하세요.%p.

예:

// this might works fine since the out put is an integer as its expected.
printf("%d\n", *p); 

// but to get the address:
printf("%p\n", p); 

위의 답변을 바탕으로 포인터를 개인 변수로 사용한 경우 다음과 같은 더 나은 함수를 만들 수 있습니다.

private int* p;

public int** GetP() { return &p; }

그런 다음 이를 사용할 때 클래스에 대한 포인터를 만듭니다.

DummyClass* p_dummyClass = new DummyClass;

사용 사례 시나리오에서는 다음을 수행합니다.

p_dummyClass -> GetP();

(할당 해제하는 것을 잊지 마십시오)

static inline unsigned long get_address(void *input){
    unsigned long ret;
    __asm__(
      ".intel_syntax noprefix;"
      "mov rax, %1;"
      "mov %0, rax;"
      ".att_syntax;"
      : "=r"(ret)
      : "r"(input));
      return ret;
}

언급URL : https://stackoverflow.com/questions/22250067/how-to-get-address-of-a-pointer-in-c-c

반응형