본문 바로가기
프로그래밍 언어/C

C언어 - 9. 배열과 포인터(2)

by nomfang 2021. 3. 17.
728x90
반응형

포인터

-> 변수의 일종

  • 변수 : 특정 데이터 값을 가지고 있음
  • 포인터: 특정 데이터가 저장된 기억장소의 주소 값을 가지고 있음
    \ ** 포인터는 기억공간을 변수명이 아닌 주소로 접근하기 위해 사용

일반적인 변수의 기억공간 표현

  • 변수는 변수 선언에 의해 기억공간 할당
  • 할당된 기억공간에 대입된 데이터가 저장
  • 할당된 기억공간은 주소가 부여되어 있다

주소를 이용하여 변수와 같은 작업 가능

-> 주소 값(포인터 값)을 다룰 수 있는 변수가 필요하다

  • 포인터 변수: 변수의 주소 값을 갖는 변수
  • 예 : &변수명 or &배열이름 으로 주소 확인 가능

포인터변수의 선언

  • 형식 : 자료형 *변수명
  • 사용 예 : int *p;
  • 기능 : 변수 p는 정수형 포인터 변수로 자료를 갖는 변수의 주소를 갖는다
  • *p : 해당 주소에 값을 가지고 있다
  • p : 포인터 변수로 자료의 주소를 가지고 있다

포인터변수의 참조

  • &, * 연산자 사용
  • 포인터변수에는 상수 값을 사용할 수 없다
  • &를 사용해서 주소 값을 포인터변수로 전달해야함

포인터변수 참조 예

#include <stdio.h>

int main(void) {

  int a=3, b;
  int *p;

  p=&a;
  b=*p;
  b++;

  printf("\*p = %d\n" ,*p);
  printf("p = %x\n", p);
  printf("b = %d\n", b);
}

void 형 포인터

  • 형식 : void *포인터명;
  • 의미 : 프로그램 실행시에 자료형이 결정되는 경우 사용
    ** 저장 전 명시적 형변환이 필요하다 -> *(int*)p 등과 같이 사용
#include <stdio.h>

int main(void) {

  int a = 3;
  char b ='b';
  void *p;

  p=&a;
  printf("*p = %d\n" ,*(int*)p);

  p=&b;
  printf("*p = %c\n", *(char*)p);
}

일반 변수와 포인터 변수의 비교

포인터의 연산

포인터와 기억공간의 대응관계

포인터 변수에 연산 +. -, ++, -- 연산

-> 동일 배열을 가리키는 경우 뺄셈으로 거리 차이를 구할 수 있음
** 두 포인터간 연산은 거리의 차이를 구하는 것이므로 덧셈은 되지 않는다

** 개별 포인터에 +연산을 하면 다음 주소값을 가리키게 된다
-> p+1 : a[7] , q+1 : a[3]

반응형

댓글