포인터와 정적배열의 관계를 이해하면 포인터의 성질을 이해할 수 있다.
포인터와 배열은 매우 비슷하다. 
배열이 편의성기능이 몇가지 추가되어있다.
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;
}

 

 

 

순서를 맞춰주는것을 정렬이라한다.
논리적으로 생각해보고 펜으로도 써보자.

 

기본적인 선택정렬을 알아보자.
목표 : 배열에서 가장 큰수와 작은수의 자리를 바꾼다.

 

#include <iostream>

using namespace std;

int main()
{
	const int length = 5;

	int aArr[length] = { 3,5,2,1,4 };
	/*
	정렬순서
	3,5,2,1,4
	1,5,2,3,4
	1,2,5,3,4
	1,2,3,5,4
	1,2,3,4,5
	*/
	for (int i = 0; i < length-1; i++) {
		int temp = 0;
		int arr = i;
		for (int s = 0; s < length - i; s++) {
			cout << aArr[arr] << " > " << aArr[s + i] << endl;
			if (aArr[arr] > aArr[s + i]) {
				arr = s + i;
				
			}
		}
		{
			temp = aArr[arr];
			aArr[arr] = aArr[i];
			aArr[i] = temp;
		}
	}

	cout << "sort" << endl;
	for (int i = 0; i < length; i++) {
		cout << aArr[i] << endl;
	}

	return 0;
}

기본적인 버블정렬을 알아보자.
목표 : 배열의 데이터를 순차적으로 비교하여 
앞데이터가 다음배열보다 클경우 자리를 바꾼다.

 

#include <iostream>

using namespace std;

int main() {

	int len = 5;
	int a[] = { 5,2,3,4,1 };

	for (int i = 0; i < len-1; i++) {
		for (int s = 0; s < len - (i+1); s++) {
			//cout << "s : " << s << " a[s+1] : " << a[s + 1] << endl;
			if (a[s] > a[s + 1]) {
				int temp = a[s + 1];
				a[s + 1] = a[s];
				a[s] = temp;
			}//end of if
		}//end of for s
	}//end of for i
	for (int i = 0; i < len; i++) {
		cout << a[i] << endl;
	}
	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;
}

함수

- 함수는 입력을 받아 처리한 뒤에 출력하는 구조를 가진다.

+ 입력 -> 함수(값처리) -> 출력

- 함수는 특정한 기능에 대한 소스코드가 반복되는 것을 감소하게해준다.

- 함수를 만들어 묶어놓은것을 라이브러리라고 한다.(패키지형태)


- 함수의 형태는 다음과 같다.

+ 매개변수,return 값은 없을 수 있다.(void)

반환자료형 함수명(매개변수){

return 반활할 값;

}


실습내용 - mian함수에서 add 함수를 이용하여 출력하기

실습결과



재귀함수

- 재귀함수란 자기 자신을 포함하는 함수

- 기본적으로 자기 자신을 계속불러낸다.

- 따라서 반드시 재귀 종료 조건이 필요하다.


실습내용 - 숫자 입력시 자기 자신을 1이 될때까지 자기자신을 호출한다.



실습결과

아래 결과에서 보면 factorial 함수가 자기 자신을 계속 호출하는 것을 볼수 있다.

따라서 5 * 4 * 3 * 2 * 1이 실행된다.


함수정리

- C언어는 함수로 시작해서 함수로 끝난다.

- 재귀함수는 반복적으로 자기 자신을 불러내므로 

  경우에따라 무한루프가 일어날 수 있어 조심해야한다..

배열

- 변수가 여러개 필요할때 사용하기 유용하다.

- 배열을 사용안할시 int a,int b,int c...형식으로 해야한다.

- 간단하게 동일한 자료형을 여러개 담을수 있는것을 배열이라고 한다.

- 배열은 인덱스,데이터 조합이다.

+ 인덱스는 0부터 시작하고, 데이터는 입력된 값이다.

- 배열 선언 방법

+ 자료형 배열명[배열의 크기] = {초기화 값};

- INT_MIN은 #include <limits.h>로 사용한다.

- INT_MIN은 최대값을 구하기위해 자주 사용하는 상수이다(int형 최솟값 반환).

- 반대로 INT_MAX도 있다.


문자열과 배열

- 원시적인 C언어는 기본적으로 자체적인 문자열 자료형을 제공하지 않는다.

- C언어는 문자(char)를 여러 개 묶어 놓는 형태로 문자열을 표현한다.

+ char a[20] = "TEST";


실습내용

실습결과


배열이란?


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

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