IT 프로그래밍/C++

[따배시 6.9] 포인터 연산과 배열 인덱싱

기술1 2024. 3. 29. 12:17
반응형

포인터 자체의 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안에 내용물을 출력하거나 사용할 때 포인터 연산을 사용할 수 있다는 것을 볼 수 있었습니다.

반응형