본문 바로가기

C++

[TIL 9장] 이중 포인터 개념, 배열, 디버깅

오늘의 TIL 목차 (22.08. 04)

 

  • 이중 포인터
  • 배열
  • 디버깅

이중 포인터


이중 포인터

포인터 변수의 주소를 저장하기 위한 포인터

 

자료형** 포인터변수명;

int iA = 10; 
int* p = &iA; // 포인터 p는 iA의 주소값을 저장
int** pp = &p; // 이중 포인터 pp는 포인터 p의 주소값을 저장

 

배열의 주소는 16진수이다.

※ *pp = *(&p) = p

: 이중 포인터 pp의 값은 포인터 p주소가 담고 있는 값이기 때문에 0x0 즉, p ( = &iA) 이다.

 

배열


배열

동일한 특성을 가진 데이터들을 규칙적인 메모리 공간에 저장하는 문법

 

자료형		배열의 이름[배열의 개수]	= { } ;
int		   iArray[3] = { 10, 20, 30  };
int		   iArray[5] = {}; // 초기화 값이 선언된 배열의 개수보다 작을 경우 뒤부터 0 자동 초기화
int		   iArray[] = { 2, 4 }; // 초기화 숫자의 개수대로 배열이 생성된다. 비추천 코드
int		   iArray[] = { 0 } ; // 배열의 개수 1개 ( 둘 다 아무것도 없으면 실행 오류 )

■ 기능 / 주의

  • 배열의 최고 인덱스는배열의 개수 -1이다. (인덱스는 0부터 시작)
  • 배열은 연속된 메모리 공간에 저장이 된다. (일반 변수는 변수 사이마다 값이 들어갈 수 없는 띄어쓰기 공간이 존재)
  • 배열은 중괄호식을 이용하여 원소 초기화가 가능하다.
  • 배열은 선언된 개수보다 초기화 값이 적을 경우 뒤쪽부터 자동 0초기화가 진행된다.
  • 배열 선언 시, 초기화 숫자의 개수가 정해지면 그 숫자 개수대로 배열이 생성된다.
  • 배열 선언 시, []연산자 안의 배열의 개수는 반드시 상수로 선언해야 한다.
  • 배열의 이름을 sizeof 연산자로 계산할 경우 배열 전체의 메모리 크기를 반환한다. (자료형 크기 * 배열의 개수)
  • 배열의 원소끼리 연산이 가능하다.
  • 배열은 []연산자 내부에서 연산이 가능하다. ( iArray[2*3] == iArray[6] )
  • 배열의 이름은 배열 전체의 첫 번째 주소(대표주소)이다. (배열 이름 자체가 주소)
  • 배열 이름은 상수로 배열 이름에 직접 증감 연산자를 이용한 주소 이동은 불가능하다. ( 산술 연산자는 가능 )
실행오류

int i = 0, j = 0;
cin >> i >> j;
const int iArrayNum = i*j; // 행 * 열 은 배열의 개수
++iArrayNum; // iArrayNum은 상수이므로 ++ 안됨
int iArray[iArrayNum] = { 0 }; // 해당 배열은 정적 배열, iArrayNum은 동적 변수라 안됨

→ 정적 : 컴파일 타임, 동적 : 런 타임

i , j는 cin으로 입력 받기 때문에 실행한 시점에 값을 받을 수 있는 동적 타입이다. 따라서 정적 배열인 iArrayNum은 컴파일 후 값을 입력 받아 상수로 결정되는 동적 변수 iArrayNum을 상수로 취급하지 않고 오류를 출력한다. 다만, const int iArrayNum는 i*j를 동적타입으로 받았을 뿐 상수이므로 ++iArrayNum은 상수 취급하여 실행 오류를 출력.

■ 예시

const char cTotal = 5;
char cArray[cTotal] = {}; // [] 연산자 안은 무조건 상수
char* p = cArray; // 배열 이름 자체가 주소

for (int i = 0; sizeof(cArray) / sizeof(char) > i; ++i)
{
	p[i] = 65 + i; // 문자형 배열이므로 아스키코드에 의해 A부터 차례로 대입
	cout << cArray[i] << "\t";
}
cout << endl;
cout << cArray[1 * 4] << endl; // cArray[1*4] == cArray[4] 즉, 5번째 원소값 출력 (인덱스 0부터 시작)
cout << cArray[4] - cArray[3 - 1] << endl; // E - C인데 70 - 68 = 2 로 출력

출력결과:
A 	B 	C 	D 	E
E
2

→ 배열의 개수는 sizeof( 배열이름 ) / sizeof (배열의 자료형) 으로 주로 구함, 배열의 개수를 잘못 입력했을 때 선언되지 않은 배열의 공간 부분까지 접근하여 논리적 오류가 발생하는 것을 방지하기 위해 저런 방식으로 사용함. 

 

디버깅


[ 디버깅 ]

: 코드에 문제가 발생했을 때 따로 분리해서 해당 부분의 실행 과정을 자세하게 제공하는 논리적 분석템

■ 단축키

  • F5 : 디버깅
  • Shift + F5 : 디버깅 중단
  • F9 : 디버깅 중단점 삽입 / 삭제
  • F11 : 한줄씩 디버깅 실행