[C++] 1차원 배열과 포인터 / 2차원배열과 2차원포인터 공부하기
본문 바로가기

C#

[C++] 1차원 배열과 포인터 / 2차원배열과 2차원포인터 공부하기

728x90
반응형

오늘은 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";
}
}

 

 

이상으로 포스팅 마무리하겠습니다.

 
반응형