포인터도 연산이 가능할까?
#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;
}