포인터와 정적배열의 관계를 이해하면 포인터의 성질을 이해할 수 있다.
포인터와 배열은 매우 비슷하다. 
배열이 편의성기능이 몇가지 추가되어있다.
ex) 배열은 sizeof해보면 배열은 총 Byte가 출력된다. 포인터는 포인터의 Byte가 출력된다.

array변수는 포인터와 비슷하다. 배열의 첫번째 주소를 담고 있다.

	int arr[5] = { 9,7,5,3,1 };
	//배열의 첫번째 주소가 출력된다.
	cout << arr << endl;


확인방법 : de-reference 해보면 배열의 첫번째 데이터가 출력된다.

문제가 되는부분
함수 파라미터로 배열을 넘겨줄때 포인터로 넘어간다.
확인방법 : sizeof()를 활용해보면 포인터의 Byte가 출력된다.

함수안에서 포인터로 직접접근하여 값을 변경할 수 있다.

void printArray(int arr[]) {
	//(생략)...
	//직접접근하여 값변경하기
	*arr = 1000;
}

배열이 struct나 class에 들어가있으면 포인터로 변환되지 않는다.

#include <iostream>

using namespace std;

void printArray(int arr[]) {
	cout << "======" << endl;
	cout << arr << endl;
	cout << *arr << endl;
	cout << sizeof(arr) << endl;

	//직접접근하여 값변경하기
	*arr = 1000;
}

struct A
{
	int arr[3] = { 1,2,3 };
};

void doSomethig(A a) {
	//포인터로 변환되지 않는것을 확인할 수 있다.
	cout << sizeof(a.arr) << endl;
}

int main()
{
	int arr[5] = { 9,7,5,3,1 };

	cout << arr << endl;
	cout << *arr << endl;
	cout << sizeof(arr) << endl;
	//같은 주소를 보고있는지 확인하기
	int *ptr_arr = arr;
	cout << ptr_arr << endl;
	cout << *ptr_arr << endl;
	cout << sizeof(ptr_arr) << endl;

	char name[] = "choi";
	cout << *name << endl;
	printArray(arr);
	printArray(ptr_arr);
	cout << arr[0] << "   " << *arr << endl;
	
	cout << "======" << endl;

	A a;
	cout << a.arr[0] << endl;
	cout << sizeof(a.arr) << endl;
	
	doSomethig(a);

	return 0;
}

 

 

 

배열array 
- 비슷한것이 나열되어 있는것

학생성적을 기록하고 싶은데
학생이 여러명이면?
int형을 학생의 이름으로 여러개 선언하면 기억하기힘들다.

해결책
같은형의 변수를 여러개 불러올수 있다.
배열 사용 : int student[5];
배열은 0부터 시작한다.
생성한 배열보다 큰 배열번호에 입력하면 에러가 난다.

배열 초기화하기
int a[3] = { 1,2,3 };
int a[] = { 1,2,3 };
int a[3];
a[0] = 1; 
위에 방식으로 초기화 할 수 있다.

[]로 선언하는 배열의 크기는 시작할때 정해주어야한다.
사용하고 싶다면 #define를 사용한다.

기본자료형말고 구조체등도 배열로 선언할 수 있다.

#include <iostream>

using namespace std;

//구조체선언
struct Rectangle
{
	int length;
	int width;
};

enum StudentName
{
	Jack,	//0
	Dash,	//1
	Violet,	//2
};

int main() 
{
	//배열만들기
	int a[3] = { 1,2,3 };

	cout << sizeof(a) << endl;
	a[Jack] = 1;
	a[Dash] = 2;
	a[Violet] = 3;

	int sum = 0;
	for (int i = 0; i < sizeof(a) / 4; i++) {
		sum += a[i];
		cout << a[i] << endl;
	}
	cout << sum << endl;

	cout << sizeof(Rectangle) << endl;
	//구조체 배열선언하기
	Rectangle r[10];
	cout << sizeof(r) << endl;
	r[0].length = 1;
	r[0].width = 2;
	
	//cin >> sum;
	//int ab[sum] <-형식은 안됌 사용하고싶다면 매크로 #define을 사용한다. 
	return 0;
}

 

배열의 메모리 알아보기
int형으로 선언할때 배열의 주소는 배열의 첫번째 주소를 가르킨다.
그리고 int형은 4Byte이기때문에 4씩 증가하는걸 볼수 있다.

함수의 파라미터로 배열을 보내면 배열의 주소가 달라진다.
배열의 데이터를 복사해온다.
복사해올때 포인터로 넘어온다. 
파라미터로 넘어온 배열을 sizeof를 해보면 포인터변수의 사이즈가 출력된다.

 

#include <iostream>

using namespace std;

#define NUM 2

void doSomething(int students[]) 
{
	cout << "doSomething" << endl;
	cout << (int)&students << endl;
	//포인터의 사이즈가 출력된다.
	cout << "sizeof: " << sizeof(students) << endl;
	cout << students[0] << endl;
	cout << students[1] << endl;
}

int main()
{
	int a[NUM];

	cout << (int)&a << endl;
	cout << (int)&a[0] << endl;
	cout << (int)&a[1] << endl;
	a[0] = 1;
	a[1] = 2;
	cout << sizeof(a) << endl;

	doSomething(a);

	return 0;
}

배열 반복문 활용

배열은 같은타입의 데이터가 메모리에 일렬로 나열되어있는것이다.
반복문을 활용하면 배열을 사용하기 쉽다.

sizeof로 배열의 크기를 알아볼수 있는데 파라미터로 넘어가면
포인터의 주소만 가르키기때문에 불가능하다.

 

#include <iostream>

using namespace std;

int main()
{
	const int num = 3;
	int a[num] = { 1,50,3 };

	//배열 크기 알아보기
	int a2[] = { 1,50,3 };
	const int num2 = sizeof(a2) / sizeof(int);

	int totalScore = 0;
	int maxScore = 0;

	for (int i = 0; i < num; i++) {
		totalScore += a[i];
		cout << a[i] << endl;
		maxScore = (maxScore < a[i]) ? a[i] : maxScore;
	}

	double avgScore = static_cast<double>(totalScore) / num;
	cout << "avg : " << avgScore << endl;
	cout << "max : " << maxScore << endl;
	return 0;
}

배열이란?


일정한 형태의 모음을 만드는 것이다.

ex)int[] numbers = new int[12];


배 12개 들어가는 박스를 포장한다면?

배[박스] 배박스 = new 배[12]

배가 12개 들어갈 수 있는 박스를 만드는 것으로 생각하면 된다.

[12]

위 형태로 생각하면된다.


다중배열 2차

ex)int[][] numbers = new int[3][12];

배[줄][박스] 배박스 = new 배[3][12]

배 12개 들어있는박스만들고 그 박스를 3줄로 쌓는것이다.

[12]

[12]

[12]

위 형태로 생각하면된다.


다중배열 3차

ex)int[][][] numbers = new int[4][3][12];

배[라인][줄][박스] 배박스 = new 배[4][3][12]

배 12개 들어있는박스만들고 그 박스를 3줄로 쌓아 4라인을 만든다.

| [12] | [12] | [12] | [12] |

| [12] | [12] | [12] | [12] |

| [12] | [12] | [12] | [12] |

위 형태로 생각하면된다.


다중반복문 사용방법은 아래 코드에 표현되어 있다.




배열이란?


배열은 같은 형태의 모음 이라고 생각할 수있다.


ex)int[] numbers = new int[3]; 


즉, 위에 numbers는 int가 3개 들어갈수 있는 것이다.

배열의 시작 숫자 0부터 시작한다.

위처럼 배열 선언한다면 주소값은 0,1,2 세개가 생기게된다.

int[] numbers = new int{1,2,3}; 

형식으로 선언할 수도 있다.


쉽게 말하면 일정한 형태의 모음을 만드는 것으로 보면된다.

ex)

배 12개 들어가는 박스를 포장한다면?

배[박스] 배박스 = new 배[12]

배가 12개 들어갈 수 있는 박스를 만드는 것이다.


반복문인 for문으로 배열의 내용을 확인할 수 있다.


배열 선언 예



+ Recent posts