글쓴이 글 목록: opener

[C++ 정리] reference(참조) 의 사용 2015-06-12

포인터 변수에 주소값을 입력하기 위해서 &(ampersand)를 사용한 것과 마찬가지로 변수형으로 정의하여 사용할 수 있다.

#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{	
	int number = 100;

	// 참조변수 선언 및 초기화
	// ※ 반드시 변수를 정의할때 초기화해주어야 한다.
	int& referenceVariable = number;
		
	// 참조이기 때문에 같은 메모리를 사용하므로 하나를 변경하면 모두 변경된다고 봐야한다
	referenceVariable = 200;
	cout << "number :: " << number << "\n";
	cout << "reference :: " << referenceVariable << "\n";

	if (referenceVariable == number)
	{
		// referenceVariable는 메모리 상에 존재하지 않지만 number와 동일하다
		cout << "referenceVariable == number :: true \n";
	}

	const int& constVariable = number;
	// [Error] : 상수형으로 선언하면 변경할 수 없다.
	//constVariable = 100;
	// 상수를 변경할 수 없지만 참고하는 값을 변경하면 constVariable도 변경된다.
	number = 300;
	cout << "number :: " << number << "\n";
	cout << "reference :: " << constVariable << "\n";

	return 0;
}
* 참조변수 선언시 반드시 초기화 하여야 한다.
* 참조변수는 메모리상에 존재하지는 않지만 같은 메모리를 사용한다.

[C++ 정리] 구조체 / 공용체 / 열거체 2015-06-12

데이터를 효과적으로 변수에 담기위해 구조체 / 공용체 / 열거체를 사용한다.

#include "stdafx.h"
#include <iostream>

using namespace std;

// 구조체 선언
struct structSample
{
	char name[10];
	int number;
};

// 공용체 선언
union unionSample
{	
	int number1;
	void* number2;
};

// 열거체 선언
enum {GOOGLE, KAKAO, NAVER};

// 구조체 + 열거체
enum PAY_METHOD { GOOGLE_PAY, KAKAO_PAY, NAVER_PAY };
struct userInfo{
	PAY_METHOD payMethod;
	char name[10];
};

int _tmain(int argc, _TCHAR* argv[])
{	
	// Ex1> 구조체 사용
	structSample userA = {"opendocs1", 100};
	cout << "Ex1 :: " << userA.name << " // " << userA.number << "\n";

	// Ex2> 공용체 사용
	unionSample userB;
	// - 모든 멤버가 같은 메모리 공간을 차지하고 있어 한개의 값만 바꿔도 모두 변경된다.
	userB.number1 = 200;
	cout << "Ex2 :: " << userB.number1 << " // " << (int)userB.number2 << "\n";

	// Ex3> 열거체 사용
	// - 전역에서 사용되는 상수를 정의하여 사용할 수 있다.
	userInfo userC = { KAKAO_PAY, "opendocs2" };
	cout << "Ex3 :: " << userC.payMethod << " // " << userC.name << "\n";

	return 0;
}
* 가장 많이 사용되는 구조체는 여러 유형의 데이터를 그룹으로 많들어 한개의 객체처럼인식하고 프로그래밍 할 수 있도록 한다.
* 공용체는 거의 사용되지 않으나 모든 멤버가 같은 메모리 공간을 차지하고 있다는 특징이 있다
* 데이터의 유형을 전역에서 효과적으로 분기하고 명시적인 프로그래밍을 하기위해서 열거체가 사용된다.

[C++ 정리] 포인터 / 배열 / 구조체를 연계한 사용 2015-06-12

프로그래밍시 포인터 / 배열 / 구조체를 연계지어 사용하는 방법에 대하여 정리해보자.

pointer_array_struct

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 = &dot;

	// - 구조체의 맴버에 접근방법은 다음과 같이 두가지다
	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> 구조체에 포함된 포인터를 사용하는 방법