본문 바로가기
Language/C++

[C++_제 11장] 포인터와 동적 메모리 관리

by 전전긍긍 2022. 5. 11.

본 포스팅은 C++로 시작하는 객체지향 프로그래밍 책을 바탕으로 작성하였습니다.

C++로 시작하는 객체지향 프로그래밍

『C++로 시작하는 객체지향 프로그래밍』은 구문보다는 문제 해결에 중점을 두는 문제 구동 방식을 사용한 프로그래밍에 대해 가르치고 있다. 여러 가지 상황에서 문제를 야기한 개념을 사용함

book.naver.com


key point

포인터의 기본 사항

포인터(pointer) : 데이터 값이 저장된 변수의 메모리 주소를 저장한다.
포인터 변수(pointer variable) : 포인터의 값으로 메모리 주소를 저장하기 위해 선언된다.
 
*(애스터리스크) : 1) 포인터로 선언할 때 2) 역참조 연산자(또는 간접 연산자 indirection operator)
&(앰퍼샌드) : 주소 연산자(address operator). 변수의 주소를 반환
 

const

상수 포인터 : 상수는 메모리 위치를 가리키지만, 메모리 위치에 저장된 실제 값은 변경될 수 없다.
상수 데이터 : 포인터는 상수가 아니라 포인터가 가리키는 데이터가 상수가 된다.

배열과 포인터

배열은 실제로 (상수) 포인터이다.
int list[6] = {11, 12, 13, 14, 15, 16]; 이렇게 선언되었다면,
(list + i) -> 주소 / *(list + i) -> 값 이다. 
즉, 배열에서는 역참조 연산자를 사용하여 배열 내의 요소에 접근할 수 있다.

- list + 1은 1이 더해지는게 아니라 sizeof(int)만큼 더해진다.
- *(list + i)와 *list + i는 엄연히 다르다. 역참조 연산자(*)가 +보다 우선순위가 높기 때문이다.

인덱스를 갖는 포인터

- 배열의 주소를 포인터에 대입하기 위해서 주소 연산자(&)를 사용하지 않는다는 점을 주의할 것. 왜냐하면 배열의 이름은 이미 배열의 시작 주소이기 때문이다. 
 

함수 호출에서 포인터 인수 전달

값에 의한 전달 VS 참조에 의한 전달
포인터는 주소가 전달되어 값에 의한 전달에서도 참조되기 때문에 교환이 된다.

함수에서 배열 매개변수는 항상 포인터 매개변수를 사용하는 것으로 대체될 수 있다.
아래 함수에서 printArray함수는 상수 데이터를 갖는 배열 매개변수를 선언한다. 이는 배열의 내용이 변경되지 않게 해준다.

 
 
 
 


프로그래밍 실습 (코드는 더보기에서 확인)

11.4 (배열 평균) 다음 헤더를 사용하여 배열의 평균을 반환하는 두 개의 오버로딩 함수를 작성하여라. 사용자로부터 10개의 double 값을 입력받고, 이 함수를 호출하여 평균값을 화면에 출력하는 테스트 프로그램을 작성하여라.

더보기
#include <iostream>
using namespace std;

int average(const int* array, int size);
double average(const double* array, int size);

int main() {
	const int SIZE = 10;
	double list[SIZE];
	for (int i = 0; i < SIZE; i++) {
		cin >> list[i];
	}
	cout << average(list, SIZE);

	return 0;
}

int average(const int* array, int size) {
	int sum = 0;
	for (int i = 0; i < size; i++) {
		sum += *(array + i);
	}
	return sum / size;
}

double average(const double* array, int size) {
	int sum = 0;
	for (int i = 0; i < size; i++) {
		sum += array[i];
	}
	return sum / size;
}

 
 
 
 
 
 
 
 
 
 
 

'Language > C++' 카테고리의 다른 글

[C++_제 10장] 객체지향 개념  (0) 2022.05.07
[C++_백준] 10828, 10845  (0) 2022.03.16
[C++_제 9장] 객체와 클래스  (0) 2022.03.10
[C++_백준] 16430, 15740, 15964  (0) 2022.02.12
[C++_백준] while문 (10952, 10951, 1110)  (0) 2022.02.08