프로그래밍시 포인터 / 배열 / 구조체를 연계지어 사용하는 방법에 대하여 정리해보자.
Ex1,2>에 대한 그림설명
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
const int arraySize = 10;
int numberArray[arraySize];
int* pointer;
/*
- 테스트를 위해 1~10의 값을 넣는다.
*/
for (int i = 0; i < arraySize; i++)
{
numberArray[i] = i + 1;
}
// 8번째 배열의 주소를 얻어온다.
pointer = &numberArray[7];
cout << "numberArray[7] :: " << *pointer << "\n\n";
// Ex1> 배열의 주소를 가진 포인터는 +1 / -1 연산으로 배열의 어느 원소는 쉽게 접근이 가능하다.
cout << "numberArray[0] :: " << *(pointer - 7) << "\n";
cout << "numberArray[1] :: " << *(pointer - 6) << "\n";
cout << "numberArray[2] :: " << *(pointer - 5) << "\n";
cout << "numberArray[3] :: " << *(pointer - 4) << "\n";
cout << "numberArray[4] :: " << *(pointer - 3) << "\n";
cout << "numberArray[5] :: " << *(pointer - 2) << "\n";
cout << "numberArray[6] :: " << *(pointer - 1) << "\n";
cout << "numberArray[7] :: " << *pointer << "\n";
cout << "numberArray[8] :: " << *(pointer + 1) << "\n";
cout << "numberArray[9] :: " << *(pointer + 2) << "\n\n";
// Ex2> 포인터에 1을 더했지만 주소는 배열의 단위인 int(4byte) 만큼 더해진것을 확인할 수 있다.
cout << "numberArray[7] ADDR :: " << pointer << "\n";
cout << "numberArray[8] ADDR :: " << pointer + 1 << "\n\n";
// Ex3> 정의된 배열 변수는 첫번째원소의 주소와 같다
cout << "numberArray == &numberArray[0] ? :: " << (numberArray == &numberArray[0] ? "true" : "false") << "\n\n";
// Ex4> 배열 포인터 정의
// - int*를 arraySize만큼 갖는 배열 4byte X 10 = 40byte
int* pointerArray1[arraySize];
cout << "arrayPointer Define1 :: " << sizeof(pointerArray1) << "\n";
// - arraySize만큼 갖는 배열의 포인터 4byte
int (*pointerArray2)[arraySize];
pointerArray2 = &numberArray;
cout << "arrayPointer Define2 :: " << sizeof(pointerArray2) << "\n";
for (int i = 0; i < arraySize; i++)
{
cout << "arrayPointer access :: " << (*pointerArray2)[i] << "\n";
}
cout << "\n";
// Ex5> 구조체 포인터 정의
struct dotStruct{
int x;
int y;
};
dotStruct dot = { 100, 200 };
dotStruct* pointerDot;
pointerDot = ˙
// - 구조체의 맴버에 접근방법은 다음과 같이 두가지다
cout << pointerDot->x << "\n";
cout << (*pointerDot).x << "\n\n";
// Ex5> 구조체에 포함된 포인터
struct userStruct{
char name[10];
userStruct* user;
};
userStruct users[6] = {
{ "AAAA", &users[1] },
{ "BBBB", &users[2] },
{ "CCCC", &users[3] }
};
// 또는 다음과 같이 정의
//userStruct users[3];
strcpy_s(users[3].name, "DDDD");
users[3].user = &users[4];
strcpy_s(users[4].name, "EEEE");
users[4].user = &users[5];
strcpy_s(users[5].name, "FFFF");
users[5].user = &users[0];
// ※ users[0].name = "AAAA"는 에러이다. &name[0] = "AAAA" 하는 것과 같다.
// strcpy(users[0].name, "AAAA");
// - 구조체에 포함된 포인터에 접근방법은 다음과 같다
cout << "struct pointer :: " << users[0].user->user->user->user->user->user->user->name << "\n";
cout << "struct pointer :: " << (*users[0].user).name << "\n";
return 0;
}
* Ex1,2> 배열을 포인터로 접근하는 방법
* Ex3> 정의된 배열변수는 첫번째 원소의 주소와 같다.
* Ex4> 유형별 배열 포인터를 정의하는 방법
* Ex5> 구조체를 포인터에 담고 사용하는 방법
* Ex6> 구조체에 포함된 포인터를 사용하는 방법