C++/K-MOOC 객체지향프로그래밍(C++기반)

4주차 pointer와 배열(24.12.30)

머슬머슬가이 2025. 4. 23. 23:21

4-1 pointer와 참조자

&연산자의 4가지 기능

  1. 주소 연산자 : 변수 데이터가 저장된 메모리 주소(& 변수명)
  2. 참조자 : 실제 변수이름 대신에 또 다른 이름 선언, 같은 위치의 메모리 위치 참조
  3. int a = 10; int &b = a; //a와 b의 값은 동일한 10
  4. bit연산(AND) : &
  5. 논리연산(AND) : &&

참조자, pointer, 배열

  • 참조자 : 기 선언된 변수의 또 다른 이름
    • & 기호 사용
    • 둘 중 어느 하나라도 데이터가 변하면 동시에 변함
  • pointer : 데이터가 저장된 메모리 주소
    • *기호 사용
    • 메모리 주소가 같으면, 같은 주소를 지칭하는 변수의 데이터는 동시에 변함
  • 배열 : 같은 이름을 갖는 여러 개의 변수를 하나로 통합한 묶음

pointer의 선언 기본형식

int main()
{
	int nData = 100; 
	cout << "address = " << &nData << ", Data = " << nData << endl;

	int* pData1 = &nData; //자료형* 포인터명 = adress
	cout << "address = " << pData1 << ", Data = " << *pData1 << endl;

	int* pData2; //자료형* 포인터명
	pData2 = &nData; //포인터명 = adress
	*pData2 = 200;
	cout << "address = " << pData2 << ", Data = " << *pData2 << endl;

	int* pData3 = new int; //자료형* 포인터명 = new 자료형
	*pData3 = 300;
	cout << "address = " << pData3 << ", Data = " << *pData3 << endl;

	int* pData4 = new int(400);
	cout << "address = " << pData4 << ", Data = " << *pData4 << endl;
}

출력값

 

4-2 배열선언

배열

  • 배열은 같은 이름을 갖는 여러 개의 변수를 하나의 통합된 묶음
  • 배열에서 선언된 개 수만큼의 주 메모리에 자동으로 할당
  • 배열은 원소들로 구성
  • 원소들을 구별하는 일련의 번호(Index)를 사용
  • Index는 0부터 시작
  • 배열은 선언되는 자료형에 따라 할당되는 메모리의 Byte 수 결정

배열선언과 초기화

  • 자료형 변수명[개수];

1차원 배열 데이터 처리

int main()
{
	int nData[Size] = { 3, 6, 2, 5, 4, 1 };
	int nEvenSum = 0, nOddSum = 0;
	int i;
	for (i = 0; i < Size; i++)
	{
		nData[i] = nData[i] + 10;
		cout << "nData[" + to_string(i) + "] = " << nData[i] << endl;
	}
	for (i = 0; i < Size; i++)
	{
		if (nData[i] % 2)
		{
			nOddSum += nData[i];
		}
		else
		{
			nEvenSum += nData[i];
		}
	}
	cout << "짝수 더하기 = " << nEvenSum << endl;
	cout << "홀수 더하기 = " << nOddSum << endl;
}

출력값

정렬 알고리즘(오름차순 정렬)

int main()
{
	int nData[Size] = { 3,6,2,5,4,1 };
	int i, j, nTemp;
	cout << "초기 데이터값 : ";
	for (i = 0; i < Size; i++)
	{
		cout << nData[i] << ", ";
	}
	cout << "\\n";
	for (i = 0; i < Size - 1; i++)
	{
		for (j = i + 1; j < Size; j++)
		{
			if (nData[i] > nData[j])
			{
				nTemp = nData[i];
				nData[i] = nData[j];
				nData[j] = nTemp;
			}
		}
	}
	cout << "오름차순 정렬 : ";
	for (i = 0; i < Size; i++)
	{
		cout << nData[i] << ", ";
	}
}

출력값

2차원 배열선언과 초기화

  • 자료형 배열명[2][3]
    • 크기1 : 행(Row)의 수
    • 크기2 : 열(Column)의 수
    • 기억장소의 총 개수 : 크기1 * 크기2

Range기반 for문

  • 배열 데이터가 차례대로 지정한 변수에 복사
  • 형식
int main()
{
	int nData[] = { 3,6,2,5 };
	
	for (int i = 0; i < 4; i++)
	{
		cout << nData[i];
	}
	cout << "\\n"<< "--------------\\n";
	for (int nValue : nData) 
	{
		cout << nValue; //순차 반복형 : 배열 요소 데이터가 차례대로 복사
	}
	cout << "\\n" << "--------------\\n";
	for (auto nValue : nData)
	{
		cout << nValue; 
	}
	cout << "\\n" << "--------------\\n";
	for (auto& nValue : nData)
	{
		cout << nValue; //순차 참조형 : 배열 요소 데이터가 차례대로 참조자로 이용
	}
	cout << "\\n" << "--------------\\n";
}	

출력값

4-3 배열과 pointer

배열과 pointer

  • 배열로 저장된 데이터 복사할 때 시작 주소 복사하여 효율적으로 메모리 관리
  • 배열을 pointer로 표현하면 1개 차수 감소
int main()
{
	int nArray[5] = { 10, 20, 30, 40, 50 };
	
	cout << "nArray = ";
	for (int i = 0; i < 5; i++)
	{
		cout << nArray[i] << ", ";
	}
	
	cout << "|nnArray[0] 주소 : " << &nArray[0] << endl; //배열이름 = &배열이름[0]
	cout << "nArray 주소 : " << nArray << endl << endl;
	
	cout << "nArray[0] = " << nArray[0] << endl;
	cout << "nArray = " << *nArray << endl << endl; 
	//*배열이름 = 배열이름[0]
	
	cout << "nArray[2] = " << nArray[2] << endl;
	cout << "*(nArray+2) = " << *(nArray + 2) << endl; 
	//*(배열이름 + n) = 배열이름[n]
}

출력값

2차원 배열과 pointer

int main()
{
	int nArray[4][3] = { {10,10,30}, {40,50,60}, {70,80,90}, {100,110,120} };
	cout << "nArray[0][0] 주소 : " << &nArray[0][0] << endl;
	cout << "nArray[0] 주소 : " << nArray[0] << endl;
	cout << "nArray 주소 : " << nArray << endl;
	//배열이름 = &배열이름[0][0] = 배열이름[0]
	cout << "nArray[2][0] 주소 : " << &nArray[2][0] << endl;
	cout << "nArray[2] 주소 : " << nArray[2] << endl << endl;
	
	cout << "nArray[3][1] 주소 : " << nArray[3][1] << endl;
	cout << "*(nArray[3] + 1) 주소 : " << *(nArray[3] + 1) << endl; 
	// *(배열이름[n1]+n2 = 배열이름[n1][n2]
}

출력값

pointer와 배열의 혼합

int main()
{
	const char* pstrData[4] = { "ASAN", "CHEONAN", "SEOUL", "DAEJEON" };
	
	cout << "0행 출력 = " << pstrData[0] << ", " << pstrData << endl;
	cout << "2행 출력 = " << pstrData[2] << ", " << *(pstrData + 2) << endl << endl;
	
	for (int k = 0; k < 4; k++)
	{
		cout << *(pstrData + k) << " = ";
		cout << pstrData[k] << endl;
	}
}

출력값

가상 메모리 구조

동적할당 메모리

  • 할당
    • 일반 변수
      • 자료형* 포인터 변수명 = new 자료형
    • 배열
      • 자료형* 포인터 변수명 = new 자료형[크기]
  • 해제
    • 지역변수로 선언한 경우 }를 만나면 자동해제
    • 임의의 위치에 해제를 원하는 경우
      • 일반변수 : delete 변수명;
      • 배열 : delete[] 변수명;
int main()
{
	int* pA = new int;
	*pA = 100;
	
	auto* pB = new auto(200);
	
	cout << "pA Value : " << *pA << endl;
	cout << "pB Value : " << *pB << endl;
	delete pA, pB;
	
	int* pData = new int[5];
	if (!pData)
	{
		return 0;
	}
	
	for (int i = 0; i < 5; i++) 
	{
		pData[i] = i * 10;
	}
	
	cout << "pData[2] : " << pData[2] << endl;
	delete[] pData;
	
	int* pC = new int[4] {10, 20, 30, 40};
	cout << pC[0] + pC[1] << endl;
	delete[] pC;
	string* pStr = new string[2];
	if (!pStr)
	{
		return 0;
	}
	
	pStr[0] = "Korea is ";
	pStr[1] = "Very Good!";
	
	cout << pStr[0] + pStr[1];
}

출력값