오늘은 1차원 배열과 포인터 / 2차원 배열과 포인터에 대해 공부했습니다.
C++하이킹 책을보며 공부했습니다.
배열의 주소값을 알고 싶으면 &를 붙이면 된다.
배열 원소의 주소 알아보기
#include<iostream>
using namespace std;
void main(){
int a[5] = { 10,20,30,40,50 };
int i;
cout << "원소의 값을 출력\n";
for (i = 0; i < 5; i++) {
cout << a[i] << "\t";
}
cout << "\n";
cout << "원소의 주소값 반환\n";
for (i = 0; i < 5; i++) {
cout << &a[i] << "\t";
}
cout << "\n";
}

배열명만 기술하면 C++컴파일러는 배열의 시작 주소값 즉 , 포인터로 해석
a==&a[0];
배열명의 값을 출력하기
#include<iostream>
using namespace std;
void main(){
int a[5] = { 10,20,30,40,50 };
cout << "a:" << a << "\n";
cout << "&a[0]" << &a[0] << "\n";
}

이처럼 배열의 첨자가 i인 원소의 주소sms a[i]앞에 &연산자를 붙일 수도 있지만 a+i 와 같이 배열명에 i를 더해 구할 수도 있다.
배열명과 +연산자의 관계 알아보기
#include<iostream>
using namespace std;
void main(){
int a[5] = { 10,20,30,40,50 };
cout << "a:" << a << "\t &a[0] : "<<&a[0]<<endl;
cout << "a+1:" << a+1 << "\t &a[0] : " << &a[1] << endl;
cout << "a+2:" << a+2 << "\t &a[0] : " << &a[2] << endl;
cout << "a+3:" << a+3 << "\t &a[0] : " << &a[3] << endl;
cout << "a+4:" << a+4 << "\t &a[0] : " << &a[4] << endl;
}

배열명에 +연산을 해서 값을 구한 주소에 * 연산자를 붙여 배열의 각 원소값을 출력하는 프로그램이다.
#include<iostream>
using namespace std;
void main(){
int a[5] = { 10,20,30,40,50 };
cout << "a[0] : " << a[0] << "\t *a : " << *a << endl;
cout << "a[1] : " << a[1] << "\t *a+1 : " << *a + 1 << endl;
cout << "a[1] : " << a[1] << "\t a(a+1) :" << *(a + 1) << endl;
}

*a+1은 먼저 *a로 10이나오고 플러스 1을해서11이나옴
포인터 형태로 배열의 원소값 출력하기
#include<iostream>
using namespace std;
void main(){
int a[5] = { 10,20,30,40,50 };
int i;
for (i = 0; i < 5; i++) {
cout << "a+1 : " << a + i << "\t &a[i] : " << &a[i] << "\n";
}
cout << "----------------------------------------------\n";
for (i = 0; i < 5; i++) {
cout << "*(a+1) : " << *(a + i) << "\t\t a[i] : " << a[i] << "\n";
}
}

배열과 포인터 변수의 관계 알아보기
#include<iostream>
using namespace std;
void main(){
int a[5] = { 10,20,30,40,50 };
int* p;
p = a;
cout << "\n *p : " << *p;
cout << "\t a[0] : " << a[0];
cout << "\n *(p+1) : " << *(p + 1);
cout << "\t a[1] : " << a[1];
cout << "\n *(p+2) : " << *(p + 2);
cout << "\t a[2] : " << a[2];
cout << endl;
}

포인터의 포인터 기본형식
자료형 **포인터 변수명;
2차원 포인터 변수는 1차원 포인터의 주소값을 저장한다.
즉 2차원 포인터 변수는 1차원 포인터를 가르킨다.
2차원 포인터 사용하기
#include<iostream>
using namespace std;
void main(){
int a = 5;
int* p;
int** pp;
p = &a;
pp = &p;
cout << " p : " << p << "\t &a : " << &a << endl;
cout << " *p : " << *p << "\t a : " << a << endl;
cout << " pp : " << pp << "\t &p : " << &p << endl;
cout << "*pp : " << *pp << "\t p : " << p << endl;
cout << "**pp : " << **pp << "\t *p : " << *p << endl;
}

1차원 포인터를 저장하는 포인터 배열
#include<iostream>
using namespace std;
void main() {
int a = 10, b = 20, c = 30;
int* p[3] = { &a,&b,&c }; //포인터 배열에 변수의 주소를 저장해 둔다.
//배열 원소에 *연산자로 정수값을 얻어온다.
cout << "\n *p[0] : " << *p[0];
cout << "\t *p[1] : " << *p[1];
cout << "\t *p[2] : " << *p[2];
//*연산자 대신 []로 정수값을 얻어온다.
cout << "\n p[0][0] : " << p[0][0];
cout << "\t p[1][0] : " << p[1][0];
cout << "\t p[2][0] : " << p[2][0];
cout << "\n";
}

위에 소스와 같이 *p[0]와 같은 포인터 표현을 p[0][0]으로 표현할 수 있다.
포인터 배열에 1차원 배열의 주소값 저장하기
#include<iostream>
using namespace std;
void main() {
int a[5] = { 10,20,30,40,50 };
int b[5] = { 60,70,80,90,100 };
int c[5] = { 110,120,130,140,150 };
int* p[3] = { a,b,c };
cout << ">>각 1차원 배열의 첫번재 원소 출력<<\n";
cout << p[0][0] << "\t" << p[1][0] << "\t" << p[2][0] << "\n\n";
cout << ">>각 1차원 배열의 두번째 원소 출력<<\n";
cout << p[0][1] << "\t" << p[1][1] << "\t" << p[2][1] << "\n";
}

2차원 배열의 주소값 출력하기
2차원 배열의 주소값을 알고 싶으면 &연산자를 사용하면 된다.
#include<iostream>
using namespace std;
#define ROW 3
#define COL 4
void main() {
int a[ROW][COL] = { {90,85,95,100},
{75,95,80,90},
{90,80,70,60} };
cout << "2차원 배열에 저장된 원소들의 주소\n";
cout << "-----------------------------------------";
for (int r = 0; r < ROW; r++) {
cout << "\n" << r << "행 ";
for (int c = 0; c < COL; c++) {
cout << "\t" << &a[r][c]; //배열의 주소값 출력
}
}
cout << "\n";
}

2차원 배열에 행만 지정해서 출력하기
#include<iostream>
using namespace std;
#define ROW 3
#define COL 4
void main() {
int a[ROW][COL] = { {90,85,95,100},
{75,95,80,90},
{90,80,70,60} };
cout << "2차원 배열의 각 행의 첫번째 열의주소\n";
cout << "-----------------------------------------";
for (int r = 0; r < ROW; r++) {
cout << "\n" << r << "행";
cout << "\ta[" << r << "]=" << a[r];
cout << "\t &a[" << r << "][0]=" << &a[r][0];
}
cout << "\n\n각 행이 첫번재 열에 위치한 원소\n";
cout << "-----------------------------------------\n";
cout << "*a[0]=" << *a[0] << "\t*a[1]=" << *a[1] << "\t*a[2]=" << *a[2] << "\n";
}

2차원 배열명ㅇ의 의미 파악하기
#include<iostream>
using namespace std;
#define ROW 3
#define COL 4
void main() {
int a[ROW][COL] = { {90,85,95,100},
{75,95,80,90},
{90,80,70,60} };
cout << "a : " << a << endl;
cout << "*a : " << *a << endl;
cout << "**a : " << **a << endl;
cout << "------------------------------\n";
cout << "a+1 : " << a + 1 << endl;
cout << "a+2 : " << a + 2 << endl;
//a+1,a+2는 행단위로 주소를 계산한다.
}

배열의 원소를 포인터 연산자를 이용해서 출력하기
#include<iostream>
using namespace std;
#define ROW 3
#define COL 4
void main() {
int a[ROW][COL] = { {90,85,95,100},
{75,95,80,90},
{90,80,70,60} };
for (int r=0; r < ROW; r++) {
for (int c=0; c < COL; c++) {
cout << "*(a(a+" << r << ")+" << c << ")):" << *(*(a + r) + c) << "\t";
}
cout << "\n";
}
}

2차원 배열의 주소를 저장할 포인터 변수의 선언은 반드시 한 행에 포함된 열의 개수를 명시해야한다.
#include<iostream>
using namespace std;
#define ROW 3
#define COL 4
void main() {
int a[ROW][COL] = { {90,85,95,100},
{75,95,80,90},
{90,80,70,60} };
int r, c;
//int **p; //잘못된 변수 선언
int (*p)[4]; //올바른 변수 선언
p = a;
for (r = 0; r < ROW; r++) {
for (c = 0; c < COL; c++) {
cout << "*(*(a+" << r << ")+" << c << ")):" << *(*(p + r) + c) << "\t";
}
cout << "\n";
}
}

이상으로 포스팅 마무리하겠습니다.
'C#' 카테고리의 다른 글
| [C++문법공부]C++ 문법(헤더파일 iostream / std 네임스페이스 / cout 출력문 / 출력문에서 엔터키(endl,\n) 배우기-1 (0) | 2026.01.13 |
|---|---|
| [자료구조/C++]백준 10828 스택 풀기 (0) | 2026.01.09 |
| [C++] C++문법 공부하기 포인터고급부분/const 예약어-2 (0) | 2026.01.04 |
| [C++] C++문법 공부하기 포인터고급부분/const 예약어-1 (1) | 2026.01.01 |
| [C++문법] C++ 구조체 / 구조체 포인터 /공용체와열거형/typedef 공부하기 -2 (0) | 2025.12.30 |