(C++) 6.7 포인터의 연산과 인덱싱

이준우·2021년 10월 19일
0

포인터도 연산이 가능할까?

#include <iostream>

using namespace std;

int main()
{
	int value = 7;
	int *ptr = &value;

	cout << ptr << endl;
	cout << uintptr_t(ptr) << endl;
	cout << uintptr_t(ptr + 1) << endl;

	return 0;
}

output : 0075F968
	 7731560
	 7731564

포인터 연산에 1을 더하면 주소에서 4 byte가 더해진 꼴을 갖는다. 즉 포인터 변수에 1을 더해주면 메모리 하나가 증가하는 형식이 되어버리는 셈이다.

#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;
}

output : 9 20314788
	 7 20314792
	 5 20314796
	 3 20314800

배열을 사용하여 만들어도 포인터와 똑같다. 이건 포인터를 설명할 때 했었으니, 이젠 확실히 이해가 갈 것이라 생각한다.

#include <iostream>

using namespace std;

int main()
{
	int array[] = { 9, 7, 5, 3, 1 };
	int *ptr = array;

	cout << &ptr << endl;
	cout << ptr << endl;
	cout << array << endl;

	for (int i = 0; i < 5; ++i)
	{
		cout << "배열 : " << array[i] << " " << (uintptr_t)&array[i] << endl;


		cout << "포인터 : " << *(ptr + i) << " " << (uintptr_t)(ptr + i) << endl;
	}
	

	return 0;
}

output : 00CFFC54
	 00CFFC60
	 00CFFC60
	 배열   	: 9 13630560
	 포인터  : 9 13630560
	 배열   	: 7 13630564
	 포인터  : 7 13630564
	 배열   	: 5 13630568
	 포인터  : 5 13630568
	 배열   	: 3 13630572
	 포인터  : 3 13630572
	 배열   	: 1 13630576
	 포인터  : 1 13630576

계속해서 반복하지만 포인터 변수의 주소와 배열의 주소가 다른 것을 확인하라!

또 하나의 예제를 보자!

#include <iostream>

using namespace std;

int main()
{
	char name[] = "Jun Woo";

	const int n_name = sizeof(name) / sizeof(char);

	for (int i = 0; i < n_name; ++i)
	{
		//cout << *(name + i) << endl;
		cout << *(name + i) << endl;
	}

	return 0;
}

output : J
	 u
	 n

	 W
	 o
	 o

자세히 안보이지만 마지막에 null값도 출력된다. 배열로 선언한 것을 포인터 연산자를 이용해 출력해보았지만 정상적으로 출력되는 것을 볼 수 있다. 배열과 포인터는 같다는 것을 증명한 셈. name은 배열이지만 J에 해당하는 주소를 갖고 있고 이 주소에 1씩 더해가는 코드이니 문자가 하나씩 출력되는 것을 볼 수 있다.

문제!

while 문과 break 문을 사용하여 마지막에 null character은 사용하지 않도록 문자열을 출력하는 프로그램을 구현하라. (++ 증감연산자와 포인터를 사용하여 구현하라.)

#include <iostream>

using namespace std;

int main()
{
	char name[] = "Jun Woo";

	const int n_name = sizeof(name) / sizeof(char);

	char *ptr = name;

	while (true)
	{
		cout << *ptr << endl;
		++ptr;
		
		if (*ptr == '\0')
			break;
	}

	return 0;
}
profile
꿈꾸는 CV

0개의 댓글