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바이트입니다.long
64비트 시스템용으로 코드가 컴파일되었을 때는 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
'source' 카테고리의 다른 글
Can I comment out a line in a .git/config file? (0) | 2023.06.26 |
---|---|
"gitrm --dll x" vs "git reset head --x"? (0) | 2023.06.26 |
Sublime Text를 Git의 기본 편집기로 만들려면 어떻게 해야 합니까? (0) | 2023.06.26 |
What's the difference between "squash" and "fixup" in Git/Git Extension? (0) | 2023.06.26 |
Spring Boot에서 Heroku Postgres에 연결 (0) | 2023.06.26 |