본문 바로가기
Study/C++

[C++] 포인터, 함수

by Jamie Lim 2020. 4. 7.

< 포인터 >

1. 메모리 & 주소

   - 프로그램에서 사용된 변수나 배열은 모두 메모리에 존재함

   - 메모리의 각 자리에는 주소가 할당 됨

int a = 10;

int b = 20;

int c = 30;

int d = 40;

 

* 변수들이 선언된 선언된 순서대로 메모리에 쌓임

* 자료형 int는 4바이트임으로 메모리 주소가 4씩 벌어져있음

 


2. 포인터

   - 메모리에 있는 데이터 주소를 가리킴

   - 주소를 담는 그릇

   - 포인터 초기화 방법

< 기본 형식 예시 >

방법 1

int a = 10;
int *ptr;
ptr = &a;


방법 2

int a = 10;
int *ptr = &a;

 

* 변수를 선언하고 포인터를 선언한뒤 그 포인터 변수에 초기화 해줌

 

* "&변수"는 변수의 주소를 알려줌

 

  - 포인터 사용 방법

< 기본 형태 예시 > 

int i = 10;
int *ptr;

ptr = &i;  // 주소 100이라고 가정

cout << ptr;    // i의 주소 출력 (100)
cout << *ptr;   // i의 값이 출력 (10)
cout << i;      // i의 값이 출력 (10)
cout << &i;     // i의 주소 출력 (100)

int j = *ptr;  // j에 *ptr의 값인 10이 들어감

*ptr = 50;  // i의 값도 같이 50으로 변함
ptr = 70;   // 에러발생 -> ptr은 주소임, 주소를 맘대로 70으로 바꿀 수 없음

* 포인터 선언문의 *(애스터리스크)와 포인터 실행문의 *(애스터리스크)는 다른 의미!

  선언문의 * : 포인터 변수임을 알려줌

  실행문의 * : 지정된 주소에 있는 값을 액세스(접근)할 수 있게 해주는 연산자, 실제 주소에 할당괸 값 출력

                  ( = 참조 연산자)

 

* "*ptr"을 이용해서 i의 값을 바꿀 수 있음 -> 주소의 값을 바꾸기에 i또한 그 주소를 가리키기에 값이 같이 바뀜

 

*  j에 *ptr을 넣으면 주소가 가르키고 있는 값인 10이 저장이 됨, j는 주소와 전혀 연관은 없음!

 

* ptr앞에 *가 없다면 주소임으로 값을 바꾸려고 했을 때 에러가 발생함

 


3. 포인터와 배열

< 기본 형태 예시 >

int arr[3] = { 1, 2, 3 };
int *ptr;

ptr = &arr[0];   // 배열의 주소는 배열의 시작 주소임
ptr = &arr;      // 배열의 이름은 배열의 시작 주소임, 위 코드와 같은 의미

* 배열을 선언한 뒤, 포인터에 배열을 초기화 해줌

 

* 배열은 시작 주소를 넣어주면 배열의 나머지 항목들은 알아서 순차적으로 나열이 됨

 

* 배열의 시작 주소 "&arr[0]"과 "arr"은 같은 의미임

 

cout << prt;         // ptr의 주소 / arr[0]의 주소, 100이라 가정
cout << *ptr;        // arr[0]의 값 = 1
cout << ptr + 1;     // arr[1]의 주소, 104
cout << *(ptr + 2);  // arr[2]의 값 = 3
cout << *ptr + 1;    // arr[0] + 1으로 해석되므로 1 + 1 = 2
cout << ptr[2];      // arr[2]가 출력됨 = 3

* 만약 arr[0]인 1이 100 번지 주소라면 arr[1]은 104 번지, arr[2]은 108 번지다 (int이므로 4)

 

* 포인터 ptr은 배열의 시작 주소를 받음, ptr에 +n을 하면 n+1번째 주소를 가리키게 됨

 

* 값을 출력할 때 ( )로 지정해주지 않으면 *가 붙어있는 ptr만 포인터로 읽어 arr[0]에 +1이 됨

 

* 만약 포인터 ptr을 배열처럼 다루면 *을 붙이지 않아도 그에 해당하는 값이 출력됨

 

 


< 함수 >

1. 함수란?

   - 프로그램 소스 코드에서 일정한 동작을 수행하는 코드

   - 호출을 통해서 코드를 실행시키고 리턴으로 값을 넘겨줌

   - 같은 작업을 반복할 때 유용함 -> 코드를 일일이 치지않아도 함수만 부르면 됨

   - main함수 밖에 함수를 선언함

< 기본 형태 >

반환값의데이터형식 함수이름 (인자 (필수는 아님)) {

    실행할 코드
    result 반환 값;  // 없어도 됨
    
}


< 예시 - 두 수 더하기 >

int hap (int a, int b) {

    int result = a, b;
    cout << a << " + " << b << " = " << result;
    return result;
    
}

result = hap(5, 10);   // 함수 호출
                       // result는 함수안의 변수 result와 상관 없음

* 반환 값의 데이터 형식에는 return을 하는 데이터의 데이터 형식을 넣음, 만약 반환하지 않는다면 void 사용

 

* 함수이름은 대소문자를 구분해야하며 숫자로 시작하면 안 됨

 

* 인자는 함수를 호출할 때 받는 값

 

* return에는 함수를 호출한 곳에 반환해줄 값을 넣어줌

 


2. 지역변수 & 전역변수

   - 지역변수 : 한정된 지역에서만 사용되는 변수

   - 전역변수 : 프로그램 전체에서만 사용되는 변수

   - 둘 중 지역변수를 먼저 따라야함 (우선순위)

< 예시 >

1. 전역변수만 선언

int a = 5;

int main () {

    cout << a;  // 5가 출력됨
    
}


2. 지역, 전역 둘다 선언

int a = 5;

int main() {

    int a = 50;
    cout << a; // 지역변수가 우선이므로 50출력
    
}

* main함수 안에서 선언된 지역변수 a는 다른 함수가 생겼을 때 다른 함수에서는 알지 못함

 

* 전역변수 a는 여러 함수가 생겨도 모든 함수에서 전역변수 a의 존재를 알고 같은 이름의 지역변수가 없다면 읽음

 


3. 매개변수 전달

    - 값의 전달 : 값 자체를 함수의 인자로 넘겨줌

                     값을 전달한 곳에서는 아무 영향도 받지 않음

    - 주소의 전달 : 주소를 함수의 인자로 넘겨줌

                        주소를 이용해 값을 바꾸므로, 값을 넘긴 곳의 값도 영향을 받음

< 예시 - 값의 전달 >

void test(int a) {

    a = a + 1;
    cout << a;  // +1을 하여 11이 출력됨
    
}

void main(){

    int a = 10;
    
    test(a);
    cout << a;  // 함수에서 변한 값은 영향을 주지 않아 선언한대로 10이 출력됨

}


< 예시 - 주소의 전달 >

void test(int *a) {

    *a = *a + 1;
    cout << *a;  // a에 +1이 되어 11이 출력됨
    
}

void main() {

    int a = 10;
    
    cout << a;  // 함수로 넘겨주기 전이니 10이 출력됨
    test(&a);   // 주소로 넘겨주어야 함!!
    cout << a;  // 포인터로 주소값을 넘겨주어 함수에서 바뀐 값이 main함수의 변수에도 영향을 줌
    
}

* *a++;라고 명령하면 에러남

 

* 값의 전달은 정말 값만 전달하기 때문에 함수로 들어간 값은 더이상 main함수의 변수와 상관이 없음

 

* 주소의 전달은 주소를 전달하기 때문에 함수의 변수와 main함수의 변수가 서로 주소로 연결되어 있어 영향을 줌

 

* 주소의 전달을 할때 호출은 &a처럼 주소를 넘겨주어야 하고 인자로 받을 때는 *a로 받아야 함

 

 

< 참고 >

명품  C++ 프로그래밍 - 황기태

'Study > C++' 카테고리의 다른 글

[C++] 입출력, 연산자  (0) 2020.08.02
[C++] 클래스와 객체 & 객체 포인터  (1) 2020.05.31
[C++] 클래스와 객체  (0) 2020.05.24
[C++] 조건, 반복,배열  (0) 2020.03.31

댓글