포인터 자체의 sizeof는 4바이트입니다. x64는 8바이트
#include <iostream>
using namespace std;
struct MyStruct
{
int array[5] = { 9, 7, 5, 3, 1 };
};
int main()
{
MyStruct ms;
cout << ms.array[0] << endl;
return 0;
}
포인터는 메모리에 주소를 복사하는 것입니다.
포인터 연산과 배열의 인덱싱 몇번째 값을 가져오는지 어떻게 연결되는지 알아보겠습니다.
배열 주소 찾기 (포인터 x)
#include <iostream>
using namespace std;
int main()
{
int array[] = { 9, 7, 5, 3, 1 };
cout << array[0] << " " << (uintptr_t) & array[0] << endl;
cout << array[1] << " " << (uintptr_t) & array[1] << endl;
cout << array[2] << " " << (uintptr_t) & array[2] << endl;
cout << array[3] << " " << (uintptr_t) & array[3] << endl;
return 0;
}
먼저 포인터를 사용하지 않고 배열의 주소를 찾는 방식입니다.
`uintptr_t`는 C 언어에서 정의된 데이터 형식입니다. 이 형식은 부호 없는 정수로, 포인터나 메모리 주소를 나타내는 데 사용됩니다.
포인터를 다룰 때, 그 값이 음수가 아니라는 것을 보장하기 위해 `uintptr_t`를 사용할 수 있습니다. 이 형식은 시스템의 워드 크기에 맞게 정의됩니다. 예를 들어, 32비트 아키텍처에서는 32비트 부호 없는 정수로 정의되며, 64비트 아키텍처에서는 64비트 부호 없는 정수로 정의됩니다.
`uintptr_t`는 주로 포인터 산술이나 메모리 주소와 관련된 다른 연산에서 사용됩니다. 주소를 정수 형식으로 캐스팅하거나, 포인터 산술 연산을 수행하고 그 결과를 정수로 다루고 싶을 때 유용합니다. 이를 통해 포인터와 정수 간 변환을 명시적으로 처리할 수 있습니다.
이런 식으로 나오게 됩니다.
#include <iostream>
using namespace std;
int main()
{
int array[] = { 9, 7, 5, 3, 1 };
int* ptr = array;
for (int i = 0; i < 5; ++i)
{
cout << *(ptr + i) << " "<< (uintptr_t)(ptr + i) << endl;
}
return 0;
}
이걸 해보면 아까와 똑같은 값이 나오는 것을 보실 수 있습니다. 아까는 실수로 1에 대한 주소값을 안 넣어줬지만 이거는 1까지 넣어주었습니다. 이런식으로 *를 써서 *(ptr + i)를 사용함으로써 계속해서 나오는 것을 볼 수 있습니다.
포인터를 통해서 for문을 통해 array값을 쭉 도는 것을 볼 수 있습니다.
char name[] = "Jack Jack";
const int n_name = sizeof(name) / sizeof(name[0]);
이거는 여담으로 원소의 개수를 구하는 것인데요. 전체의 sizeof에다가 한 원소의 sizeof를 나누면 전체의 원소의 갯수가 나오게 됩니다.
#include <iostream>
using namespace std;
int main()
{
char name[] = "Jack Jack";
const int n_name = sizeof(name) / sizeof(name[0]);
char* ptr = name;
for (int i = 0; i < n_name; ++i)
{
cout << *(ptr + i);
}
return 0;
}
해당 코딩은 포인터를 통해 char name에 있는 jack jack을 한바퀴 도는 것을 볼 수 있습니다. 이런 식으로 하면 정상적으로 Jack Jack이 출력되게 됩니다.
포인터 연산이 array 인덱싱에 사용되는 경우를 보았으며 array안에 내용물을 출력하거나 사용할 때 포인터 연산을 사용할 수 있다는 것을 볼 수 있었습니다.
'IT 프로그래밍 > C++' 카테고리의 다른 글
[따배시 6.11] 메모리 동적할당 new와 delete (1) | 2024.03.29 |
---|---|
[따배시 6.10] C언어 스타일의 문자열 심볼릭 상수, 포인터 사용의 유의점 (0) | 2024.03.29 |
C++ [포인터 개념 정리] (0) | 2024.03.26 |
벡터의 순회 (0) | 2024.03.25 |
vector insert, erase 정리 (0) | 2024.03.25 |