상세 컨텐츠

본문 제목

배열과 포인터

c++

by 래모 2021. 1. 17. 23:25

본문

배열

  • 같은 종류의 대량의 데이터를 효율적이고 간편하게 처리할 수 있음
  • 배열의 크기는 상수여야함
  • 배열의 크기로 값이 변할 수 있는 변수를 줄 수 없음
float cost[12]; // 12개의 float형 값을 가진는 배열 cost
char name[50]; // 50개의 char형 값을 가지는 배열 name
char src[10], dst[10]; // 2개의 문자형 배열 src와 dst를 동시에 선언
int index, days[7]; // 일반 변수 index와 배열 days를 동시에 선언
int a[3] = {1,2,3};
int b[3];
b[0] = 1; // 첫 번째 요소의 값은 0
int c[3] = {0}; //코드 한 줄로 배열 내 모든 요소를 0으로 초기화
int d[] = {1,2,3,4}; // 컴파일러가 자동으로 크기 4인 배열 생성

 

배열과 함수

:배열을 함수로 전달할 때는 배열의 원본이 매개 변수를 통해 전달

#include <iostream>
using namespace std;

int get_average(int scores[], int size) // 매개 변수로 배열을 선언하는 경우 배열의 크기를 지정하지 않아도 됨(실제로 배열이 생성되는 것이 아니기 때문)
{
	...
}

int main(){
    int scores[5];
    get_average(scores, 5);//배열의 이름으로 
}

*주의*

  - 함수 안에서 배열 요소를 변경한다면 원본 배열 자체가 변경됨

 

원본 배열의 변경을 금지하는 법

: const지정자를 배열 매개 변수 앞에 붙임

int get_average(const int scores[], int size)
{
	...
    scores[0]=1; // 컴파일 오류
}

 

2차원 배열

int s[3][5] = { //[행의 개수][열의 개수]
	{0,1,2,3,4}, // 첫 번째 행의 요소들의 초기값
    {10,11,12,13,14}, // 두 번째 행의 요소들의 초기값
    {20,21,22,23,24} // 세 번째 행의 요소들의 초기값
};

 

s[0][0] s[0][1] s[0][2] s[0][3] s[0][4]
s[1][0] s[1][1] s[1][2] s[1][3] s[1][4]
s[2][0] s[2][1] s[2][2] s[2][3] s[2][4]

*2차원 배열을 함수로 전달할 땐 행의 크기는 적지 않아도 되지만 열의 개수는 반드시 적어야 함*

 

포인터

  • 메모리의 주소를 가지고 있는 변수
int *p = &number; //정수를 가리키는 포인터 p에 변수number의 주소를 저장한다.
*연산자 &연산자
포인터를 통하여 변수를 간접 참조할 때 사용 변수의 주소를 구하여 포인터에 대입할 때 사용

 

*포인터를 초기화하지 않고 사용한다면 많은 오류를 야기할 수 있으므로 포인터가 아무것도 가리키고 있지 않을 때는 NULL로 설정하는 것이 바람직함*

 

포인터와 함수

함수 호출 시 인수 전달 방식

  • 값에 의한 호출: 복사본이 전달 (원본 변수 변경x)
  • 참조에 의한 호출: 원본이 전달(원본 변수 변경o) <= 포인터를 통해 가능
#include <iostream>
using namespace std;

int main()
{
    int a = 1, b = 2;
    swap(&a, &b); // 변수의 값이 아닌 변수의 주소 전달
    cout << a << " " << b << endl;
}

void swap(int *px, int *py)
{
    int tmp;
    
    tmp = *px;
    *px = *py;
    *py = tmp;
}

 

배열과 포인터

=> 배열의 이름이 포인터

#include <iostream>
using namespace std;


void sub(int b[], int size) { // 포인터 b를 통하여 원본 배열 변경 가능
    *b=3; // 배열의 첫 번째 요소 변경
    *(b+1)=4; // 배열의 두 번째 요소 변경
}

int main() {
	int a[2] = {1,2};
	sub(a,2);
    for(int i = 0; i < 2; i++){
    	cout << a[i] << endl; // 3과 4가 출력
    }
}

아래의 두 가지 방법은 완전히 동일함

void sub(int b[], int size) {
    b[0] = 3;
    b[1] = 4;
}
void sub (int *b, int size) {
    b[0] = 3;
    b[1] = 4;
}

 

 

 

관련문제 

백준 10809번 

www.acmicpc.net/problem/10809

'c++' 카테고리의 다른 글

[c++]클래스와 상속  (0) 2021.01.26
[c++]생성자와 소멸자  (0) 2021.01.20
클래스의 기초  (0) 2021.01.20

관련글 더보기