[c++] 배열,포인터
배열
배열(array) 인덱스(index)
배열의 선언
int array[10];
- 자료형,배열명,배열크기
배열의 초기화
- 초기값이 부족한 경우
- 초기값이 일부만 주어질때, 나머지 원소는 0으로 초기화 된다.
- int array[5] = {10,20,30}
- array <- {10,20,30,0,0}
- 배열의 크기가 주어지지 않으면 초기값의 개수만큼 생성된다.
- int array[] = {10,20,30}
동적 배열
- c++에는 더 강력한 배열이 존재
- 실행 시간에 따라 크기를 변경할 수 있는 배열 : 벡터(Vector)
- STL 라이브러리로 제공
다차원 배열
#include <iostream>
using namespace std;
const int ROWS=3;
const int COLS=3;
int main() {
int A[ROWS][COLS] = { { 2,3,0 }, { 8,9,1 }, { 7,0,5 } };
int B[ROWS][COLS] = { { 1,0,0 }, { 1,0,0 }, { 1,0,0 } };
int C[ROWS][COLS];
int r,c;
for(r = 0;r < ROWS; r++)
for(c = 0;c < COLS; c++)
C[r][c] = A[r][c] + B[r][c];
for(r = 0;r < ROWS; r++) {
for(c = 0;c < COLS; c++)
cout << C[r][c] << " ";
cout << endl;
}
return 0;
}
A 배열:
| 2 3 0 |
| 8 9 1 |
| 7 0 5 |
B 배열:
| 1 0 0 |
| 1 0 0 |
| 1 0 0 |
C 배열 (A + B):
| 3 3 0 |
| 9 9 1 |
| 8 0 5 |
포인터(Pointer)
- 주소를 가지고 있는 변수
int i = 10; // 정수형 변수 i 선언
int *p = &i; // 변수 i의 주소가 포인터 p로 대입
간접 참조 연산자
- 포인터가 가리키는 곳의 값을 나타내는 연산자
- 포인터 변수 앞에 붙여 사용
int i = 10;
int* p = &i; // int* p; p = &i;
cout << *p; // 10이 출력된다.
*p = 20;
cout << *p; // 20이 출력된다
포인터 연산 😃
연산 예
#include <iostream>
using namespace std;
int main() {
char* pc;
int* pi;
double* pd;
pc = (char*)10000;
pi = (int*)10000;
pd = (double*)10000;
cout << "증가 전 pc = " << (void*)pc << pi << pd << endl;
pc++;
pi++;
pd++;
cout << "증가 후 pc = " << (void*)pc << pi << pd << endl;
}
증가 전 pc = 0000000000002710 0000000000002710 0000000000002710
증가 후 pc = 0000000000002711 0000000000002714 0000000000002718
배열과 포인터
#include <iostream>
using namespace std;
int main() {
const int STUDENTS = 5;
int grade[STUDENTS] = {10, 20, 30, 40, 50};
//grade는 배열의 첫번째 요소를 가리키는 포인터
//student는 요소수이므로 pend는 배열의 끝을 가리키는 포인터
for (int* p = grade, *pend = grade + STUDENTS; p != pend; p++)
cout << *p << " ";
return 0;
}
배열을 함수로 전달할때
배열 자체를 복사하는 것이 아닌 주소만 전달함
const와 포인터
const 객체에 대한 포인터
const double* p; // double 상수를 가리키는 포인터
double d = 1.23;
p = &d; // 가능!
*p = 3.14; // 컴파일 오류!
포인터 변수를 통한 실제 변수의 값을 변경할 수 없다.
객체를 가리키는 const 포인터
double* const p = &d; // double을 가리키는 포인터 상수
double d = 1.23;
*p = 3.14; //가능!
p = p + 1; //컴파일 오류, p는 변경될 수 없다
포인터가 상수이므로, 포인터가 가리키는 변수는 변경가능, 그러나 포인터의 값은 변경할 수 없다.
const int* p1;
- const int에 대한 포인터
- *p1 = 100; (X) 상수 변수는 바꿀 수 없다.
int* const p2;
- int를 가리키는 p2 포인터가 상수
- p2 = p1; (X) p2 포인터는 상수이므로 변경될 수 없다.
c++에서는 묵시적인 포인터 변환을 허용하지 않는다.
int* pi;
double* pd;
void* vp;
vp = pi;
pd = vp;
error>> void* 에서 double* 로 변환할 수 없습니다.