#2 C언어

송민혁·2022년 9월 6일
0

C

목록 보기
2/2

포인터

지금까지 변수 선언으로 메모리에 공간을 확보하고, 그곳을 데이터를 넣고 꺼내 쓰는 공간으로 사용했다. 그러나 변수는 선언된 블록, 함수 내부로 사용이 제한되어있다. 그래서 사용 범위를 벗어난 경우도 데이터를 공유할 수 있는 새로운 방법인 포인터 개념이 필요하다.

포인터주소를 가지고 있는 변수이다. 즉, 포인터는 다른 변수를 가리키는 변수이다.
메모리에는 각각의 바이트를 구분하기 위한 주소가 있다. 여기서 주소는 플랫폼에 따라 (주소의)크기가 다르다.

포인터 선언

포인터 선언 방법
데이터형 *변수명;
데이터형 *변수명 = 초기값;

int *p;
double *pd;
int a =123;
int *pa = &a;
char *pc = NULL;

여기서 나오는 * 표시는 포인터 수식어라고 하고, & 표시는 메모리 주소를 의미한다.

포인터 초기화

  • 포인터에 직접 절대 주소를 대입해서는 안 된다.
  • 변수의 주소를 구할 때는 주소 구하기 연산자&를 이용한다.
int *p1 = 0x12345678; //컴파일 에러

int a = 10; 
int *p3 = &a; // int 변수 a의 주소를 구해서 int 포인터인 p3를 초기화한다.
int *p3 = 0; // 어떤 변수의 주소로 초기화할지 알 수 없으면 0으로 초기화한다.
int *p3 = &a; // 0 대신 NULL을 사용해도 된다.

포인터 사용

  • 상수나 수식에는 사용할 수 없다.
  • 역참조 연산자
p= &123; //ERROR
p = &(x + 1); //ERROR
p = &printf("hello"); //ERROR
printf("%d", *p);
*p = 20; //역참조 연산자, 뒤에 초기화하기

  • 포인터는 초기화하고 사용하는 것이 안전하다.
    (int *p = &a;)

  • 포인터를 안전하게 사용하려면 사용할 때 널 포인트 (NULL)인지 검사한다.

if (p !=NULL)
  *p = 100;
  • 포인터의 데이터형과 포인터가 가리키는 변수의 데이터형이 같아야 한다.

const 포인터

  • 읽기 전용 포인터: 포인터가 가리키는 변수의 값을 변경할 수 없다. 가리키는 변수의 원본 데이터는 직접 변경하면 변경 가능하다.

모르는 것

포인터 연산

포인터 연산은 특이하게 데이터형 단위로 계산된다. 예시를 통해서 연습해보는 게 좋다.
아래 사진과 같이 int *p = &a;이라면 p+1는 a의 주소에서 4바이트를 더한 주소값을 의미한다.

포인터는 배열에도 적용이 가능하다.

int arr[5] = {1, 2, 3, 4, 5};
int *p = &arr[0]; // p가 arr[0]을 가리킨다.

그렇다면 p+1은 어떤 주소값을 가질까? 바로 arr[1]이다. 즉, p+i==&arr[i]을 의미한다.

그래서 우리는 포인터+정수에는 정수 버전과 배열 버전이 있음을 인지해야 한다.

0개의 댓글