4-1 pointer와 참조자
&연산자의 4가지 기능
- 주소 연산자 : 변수 데이터가 저장된 메모리 주소(& 변수명)
- 참조자 : 실제 변수이름 대신에 또 다른 이름 선언, 같은 위치의 메모리 위치 참조
- int a = 10; int &b = a; //a와 b의 값은 동일한 10
- bit연산(AND) : &
- 논리연산(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];
}
출력값
'C++ > K-MOOC 객체지향프로그래밍(C++기반)' 카테고리의 다른 글
5주차 구조체와 함수(24.12.31) (0) | 2025.04.30 |
---|---|
3주차 조건문과 반복문(24.12.27) (1) | 2025.04.20 |
2주차 데이터 처리와 연산(24.12.26) (1) | 2025.04.17 |
1주차 과목소개와 프로그래밍 언어 구성 요소(24.12.25) (0) | 2025.04.17 |