프로그래밍 기본지식 9탄

최주영·2022년 12월 10일
0

C언어

목록 보기
10/15

✅포인터란 무엇인가 ?

  • C언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 불림
  • char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장합니다.

ex) int n = 100;     // 변수 선언
     int *ptr = &n    // 포인터 선언

밑에 그림은 ex) 예제 부분에서 사용된 변수와 포인터가 메모리에서 어떻게 저장되는지를 보여주는 예제


✅포인터 연산자의 종류

  • 주소 연산자 (&)
    -> 주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환
    -> '&'기호는 앰퍼샌드(ampersand)라고 읽으며, 번지 연산자라고도 불림

  • 참조 연산자 (*)
    -> 참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환

✅포인터 문법

  1. 타입* 포인터이름 = &변수이름;
  2. 타입* 포인터이름 = 주소값;

예시

복합 대입 연산식연산 결과
int N;정수형 변수 N 선언
int *pN;포인터 변수 pN 선언
pN = &N;정수 N 값이 저장된 주소를 저장하는 포인터변수 pN
pN = pN + 1;pN의 주소가 4바이트 증가된다.
*pN = *pN + 1;pN이 가리키는 값 즉 N의 값은 1이 증가한다.
N = *pN * 2;pN이 가리키는 값 즉 N의 값에 2를 곱해준다.

✅포인터 사용의 장단점

  • 장점
    -> 메모리 매핑 하드웨어-외부장치를 메모리처럼 접근할 수 있다.
    -> 참조에 의한 호출-함수외부 변수의 수정과 여러 개의 값을 반환할 수 있다.

  • 단점
    -> 사용하기 복잡하고 잘못 사용하면 심각한 오류가 발생한다.


✅포인터 배열 vs 배열 포인터

  • 포인터배열 : 배열의 요소가 포인터들로 이루어져 있다.
  • 선언 방법 : 자료형* 변수명[크기]
    ex)char* arr[3];

ex 소스코드

int i, arr_len;

int num01 = 10, num02 = 20, num03 = 30;

int* arr[3] = {&num01, &num02, &num03}; // int형 포인터 배열 선언  

 

arr_len = sizeof(arr)/sizeof(arr[0]);

for (i = 0; i < arr_len; i++)

{

    printf("%d\n", *arr[i]);

}  

위의 소스코드의 출력결과는 10 20 30이 나올것이다.

  • 배열포인터 : 배열을 가리키는 "하나의 포인터"
  • 선언 방법 : 자료형 (*변수명)[크기]
    ex) char (*arr)[3]; -> char 타입의 인덱스를 3개 가지고 있는 배열"을 가리키는 포인터

ex) 소스코드

#include <stdio.h>
int main(void)
{
    char (*arr)[3];
 
    char tmp1[3] = { 'b', 'l', 'o' };
    char tmp2[3] = { 'c', 'k', '\0' };    //문자열의 끝을 알리는 '\0'을 추가
    char tmp3[5] = { 'd', 'm', 'a', 's', 'k'};    //배열의 사이즈가 다릅니다. 가리키기 불가.
    printf("tmp1[3]의 주소 : %p\n", tmp1);
    printf("tmp2[3]의 주소 : %p\n", tmp2);
    printf("tmp3[5]의 주소 : %p\n", tmp3);
 
    printf("\n"); printf("\n");
 
    arr = &tmp1;    //arr은 tmp1의 주소를 가리킵니다.
    printf("arr의 주소 : %p\t 문자열 : ", arr);
    for (int i = 0; i < (int)sizeof(*arr); i++)
    {
        printf("%c", (*arr)[i]);
    }
    printf("\n");
 
    arr = &tmp2;    //arr은 tmp2의 주소를 가리킵니다.
    printf("arr의 주소 : %p\t 문자열 : ", arr);
    for (int i = 0; i < (int)sizeof(*arr); i++)
    {
        printf("%c", (*arr)[i]);
    }
    printf("\n");
 
    //arr = &tmp3; 배열의 사이즈가 다르다는것은 타입이 다르다는 뜻 입니다.
    return 0;
}

위 소스코드 예제를 그림으로 표시

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글