Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Yejom's Dev Log

[C++ 입문] 3. pointer, dynamic array 본문

Smart Factory Bootcamp

[C++ 입문] 3. pointer, dynamic array

Yejom 2024. 4. 26. 20:02
  • 포인터(pointer)

: 메모리의 주소를 가진 변수

(메모리 공간에 값이 아니라 주소값을 저장함 - > 주소값을 통해서 다른 주소에 있는 값을 가져옴.)

 

- C++의 강점, 중요해서 대체 안됨

- * (아스트리크)을 이용해 선언

int *p;
int n = 10;
p = &n; //p에 n의 메모리 주소를 저장함.

cout << p << endl;
// p에는 n의 주소값이 저장돼있음 => 00000000 형태의 주소값 출력
cout << *p << endl;
// *p는 주소값에 저장되어 있는 실제 값에 접근 => 10 출력
  • Call by Value
void changeValue(int x) // x = 10;
{ 
	// 공간 1
	x = 20;
} // 여기서 나가는 순간, 메모리는 지워짐.
 
 // 공간 3

int main() 
{
 	// 공간 2
	int x = 10;
	cout << " x before function call : " << x << endl;
	changeValue(x);
	cout << " x after function call : " << x << endl;

}

위 코드 실행 결과 (포인터를 사용하는 이유)

int x 가 이름은 같지만, 완전히 다른 공간에서 존재함.

 

배열은 그 자체로 포인터 (정수는 아님 => &n) 

 

arr[n] == *(arr+n)   이 성립


  • 동적 배열(dynamic array)

dynamic하다 ~= 런타임 

: 시스템이 작동하고 나서 생성되는 배열

int n2;
cout << "숫자를 입력하세요 : ";
cin >> n2;

int *arr = new int[n2];
// 1. 동적 메모리를 가리키는 포인터 선언
// 2. new 라는 키워드를 사용해서 동적 배열 선언

 

  • 2차원 동적 배열
#include <iostream>
#include <string>
using namespace std;

int main() {

	int n3 = 5;

	// 동적 배열 선언 & 할당
	int** arr2 = new int* [n3];

	for (int i = 0; i < n3; i++) {

		arr2[i] = new int[n3];

	}
    
    // arr2[n3] : { 주소값, 주소값, 주소값, 주소값, 주소값 };
	// arr2[0] : { 값, 값, 값, 값, 값 };
	// arr2[1] : { 값, 값, 값, 값, 값 };
	// ...

	//arr2[n3][n3] = {
	//{ 값, 값, 값, 값, 값 },
	//{ 값, 값, 값, 값, 값 },
	//{ 값, 값, 값, 값, 값 },
	//{ 값, 값, 값, 값, 값 },
	//{ 값, 값, 값, 값, 값 }
	//}
    
	// 동적 배열 해제(반납)
    // delete만 적으면 포인터만 삭제됨. => delete[]
	for (int i = 0; i < n3; i++) {
		delete[] arr2[i];
	}
	delete[] arr2;
}

  • 2차원 동적 배열 실습(행렬의 합)
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
	int row = 0 , column = 0 , input;

	cout << "행과 열의 수를 입력하세요 : " << endl;
	
	// 행과 열의 수 입력 받기
	cin >> row >> column;

	// 2차원 동적 배열 선언 
	int** matrix = new int* [row];

	for (int i = 0; i < row; i++) {

		matrix[i] = new int[column];

	}
	
	// 입력값을 배열에 추가
	cout << endl << "행렬 원소를 입력하세요 : " << endl;

	for (int i = 0; i < row; i++) {
		cout << endl;

		for (int j = 0; j < column; j++) {
			cin >> input;
			matrix[i][j] = input;
		}
	}

	// *** 각 행과 열의 합을 저장할 1차원 배열 선언 ***
	int *sum_row = new int[row];
	int *sum_column = new int[column];

	// 각 행의 합 구하기
	cout << endl << "각 행의 합 :" << endl;

	for (int i = 0; i < row; i++) {
		
		sum_row[i] = 0;

		for (int j = 0; j < column; j++) {
			
			sum_row[i] += matrix[i][j];
		}
		cout << "행 " << i + 1 << ": " << sum_row[i] << endl;
	}

	// 각 열의 합 구하기
	cout << endl << "각 열의 합 :" << endl;

	for (int j = 0; j < column; j++) {
	
		sum_column[j] = 0;
		for (int i = 0; i < row; i++) {
			
			sum_column[j] += matrix[i][j];
		}
		cout << "열 " << j + 1 << ": " << sum_column[j] << endl;
	}

	// 배열 해제 !!!
	for (int i = 0; i < row; i++) {
		delete[] matrix[i];
	}
	delete[] matrix;

	delete[] sum_row;
	delete[] sum_column;

}

★ 코드 짤 때 주의
 1. 예외 처리 : 사용자가 곱게 숫자만 입력하진 않음 ,,

ex) isdigit(), isalpha() 함수 활용해서 자료형 확인할 수 있음.

	// 1글자만 판단
	string name = "me2ro5ng*";

	for(int i = 0; i < name.length(); i++)
	{
		isdigit(name[i]); // 이게 숫자야? => 문자나 특수문자는 0
		isalpha(name[i]); // 이게 문자야? => 숫자나 특수문자는 0
		cout << name[i] << " : " << isdigit(name[i]) << endl;
		//isdigit();
		//isalpha();
	}
}


 2. 학습을 목표로 한 주석 상세히 (혹시나 누군가가 열어서 확인할 수도 있으니)