Notice
Recent Posts
Recent Comments
Link
Yejom's Dev Log
[C++ 입문] 3. pointer, dynamic array 본문
- 포인터(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. 학습을 목표로 한 주석 상세히 (혹시나 누군가가 열어서 확인할 수도 있으니)
'Smart Factory Bootcamp' 카테고리의 다른 글
[C++ 입문] 5. list, string (0) | 2024.04.30 |
---|---|
[C++ 입문] 4. vector, execution time (0) | 2024.04.26 |
[C++ 입문] 2. loop, function, array (0) | 2024.04.24 |
[C++ 입문] 1. variable, operator, condition (0) | 2024.04.24 |
[GitHub] Remote, Clone, Push (0) | 2024.04.24 |