본문 바로가기
Develop/C

14-3 C언어 포인터의 완성!!

by 구운밤이다 2016. 7. 6.
728x90
반응형

2016/07/06 - [컴퓨터/C언어] - 14-2 C 언어의 배열 & 포인터의 관계!

드디어 포인터의 마지막 시간이에요!!! 이번 시간엔 저번 시간에 이어 배열과 포인터의 관계를 마저 배우고 함수에 매개변수로 포인터 변수와 배열을 전달하는 것에 대해 배워 보도록 할게요 배열 중 문자열과 포인터 간의 관계에 대해 알아보겠습니다!

char str[] ="Hello world";

문자열은 이렇게 선언 했었죠!


char *str ="Hello world";

하지만 문자열을 이렇게 선언할 수도 있습니다 그런데 이 두개에는 차이점이 존재하는데요!


str[i] ="A"; //가능

str[] = "ABCDE"; //불가능

먼저 배열형태의 문자열은 주소값 변경이 불가능합니다 그렇지만 i번째 요소를 불러와 바꾸게 할 수 있죠


str+i ="A"; //불가능

str ="ABCDE"; //가능

그럼 포인터 형태의 문자열을 보겠습니다 포인터 형태는 주소값 변경이 가능하기 때문에 다른 문자열을 가리킬 수 있어요 하지만 i번째 요소를 불러와 바꾸는 것은 못합니다 그리고 배열이 포인터 형태이기 때문에 식을 쓸때 *이 연산자를 사용하지 않아도 되요! 이제 함수에 전달하는 법을 배워보도록 하겠습니다!! 함수에 포인터 변수를 전달하는 법을 배워보도록 하겠습니다 이것을 Call-by-reference라 하는데요!! 왜 굳이 포인터로 전달해야 할까?? 하는 의문이 들 수 있습니다!! 예전에 함수 시간에 사용했던 Add함수를 예로들어 볼게요.


int add (int n1, int n2) {

    ....

}

이런 함수였죠 근데 여기서 실제로 변수 n이 전달된 게 아니라 n에 저장된 값만 전달이 된거에요!! 따라서 이 함수를 벗어나면 n이 변했다고 해도!! 메인함수로 돌아갔을 때 아무 소용이 없어지죠 이럴 때 필요한 것이 포인터 변수입니다!


int add(int *ptr) {

    ...

}

이렇게 사용해 주면 되요! 그럼 저 ptr이 가리키는 값이 변하면서 변수 n의 값이 변하게 되는거죠! 그리고 Call-by-value라는 것도 있는데요! 이거는 그냥 값만 전달해주는, 즉, 변수를 전달해 주는 것을 뜻합니다 그럼 이번엔 배열을 전달할 때는 어떻게 해야 할까! 이것도 마찬가지로 배열의 주소를 전달해 주면 됩니다!


void AddArray (int *ptr) {

    for(int i =0; int i<10; i++) {

        (*ptr) +=10;

        ptr++;

    }

}


void ShowArray (int *ptr) {

    for(int i =0; i<10; i++) {

        printf("%d\n", *ptr);

        ptr++;

    }

}


int main(){

    int arr[10]={1,2,3,4,5,6,7,8,9,10};

    AddArray(arr);

    ShowArray(arr);

}

이것을 실행하면 이런 결과가 나와요!!





자 이것으로 포인터를 마치고! 다음 시간에 다차원 배열을 배워보도록 하겠습니다~! 


모르는 것은 댓글이나 쪽지로 남겨주시면 성심 성의껏 답변해드리겠습니다!! 댓글공감구독(이웃추가)는 블로거에게 큰 힘이 됩니다! 부탁드리면서 이번 포스팅을 마치도록 하겠습니다! 지금까지 딘또였습니다

728x90
반응형

댓글