본문 바로가기

Study/C프로그래밍

[C프로그래밍] #7 포인터

포인터에 대한 개념

  • pointer, 변수의 일종
  • 변수 : 특정 데이터 값을 가지고 있음
  • 포인터 : 특정 데이터가 저장된 기억장소의 주소(번지)값을 가지고 있음
  • 따라서 포인터는 기억공간을 변수명으로 접근하지 않고 주소로 접근하기 위해 사용

 

포인터변수의 선언과 참조

포인터 변수의 선언

  • 변수 p는 포인터 변수로서 정수형의 자료를 갖는 변수의 주소를 갖는다
  • p : 포인터 변수로서 정수형 자료가 수록되어 있는 주소를 갖고 있다
  • *p : 해당 주소에 수록되어 있는 정수형 자료를 갖고 있다
int *p; // 자료형 *포인터변수명;
int a, b;
int *p; 
a = 5000;
p=&a; // p=a의 주소, a의 공간. 포인터 변수 p에 변수 a의 주소 값을 대입
b=*p; // b에게 p의 내용을 옮겨라. 포인터 변수 p가 가리키는 주소의 내용을 변수 b에 저장, a의 값 5000이 b에 저장된다

 

포인터 변수의 참조 > &. * 연산자 사용

잘못된 방법

int *p, i=4;
*p = i;
  • 포인터변수 p가 기억공간 내 몇 번지를 가르키는지 알 수 없다

올바른 참조 방법

int *p, i=4;
p=&i; // i의 주소를 p에 저장
*p=10; // p의 주소 값이 치환되어 있어야지만 그 해당주소를 정의된 포인터 변수가 가리킬 수 있다 

포인터변수의 참조 예시

#include <stdio.h>
void main(){
	int *p, i=3, j;
    p=&i; // p = i의 주소. 
    j=*p; // 포인터변수 p가 가리키는 번지의 내용을 변수 j에 대입
    j++; // 변수 j의 값을 1 증가 
    printf("*p = %d\n", *p); // *p = 3
    printf("p = %x\n", p); // p = fff4
    printf("j = %d\n", j); // j = 4
}

 

void형 포인터

void * 포인터명;
  • 프로그램 실행시에 자료형이 결정되는 경우에 사용
  • 저장하기 전에 명시적 형변환이 필요
  • 어떠한 자료형이 들어와도 상관 없다는 의미
  • 실행 중에 자료형이 결정됨
#include <stdio.h>
void main(){
	int a = 100;
    char b = 'b';
    void *p = NULL; 
    p = (int*)&a; // void형 포인터 p에 int형 변수 a의 주소를 명시적 형변환을 이용하여 대입
    printf("*p = %d\n", *(int*)p); // *p = 100
    p = (char*)&b; // char형 변수 b의 주소를 명시적 형변환을 이용하여 대입
	printf("*p = %c\n", *(char*)p); // *p = b
}

 

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

  일반 변수 포인터 변수
선언 int a; 정수형 변수 a 선언 int *a; 포인터 변수 a를 정수형으로 선언
값 할당 a = 100; 변수 a에 100 할당 *a=100; a주소에 100 할당
주소참조 &a 변수 a의 주소 a a 자체가 주소
주소연산 연산 불가능   a-- ; 포인터를 1 감소

 

포인터 연산

  • 포인터변수에 +,-,++,-- 연산자를 사용하는 연산
반응형