포인터에 대한 개념
- 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 감소 |
포인터 연산
- 포인터변수에 +,-,++,-- 연산자를 사용하는 연산
반응형
'Study > C프로그래밍' 카테고리의 다른 글
[C프로그래밍] #6 배열 (0) | 2021.04.29 |
---|---|
[C프로그래밍] #5 함수와 기억 클래스 (0) | 2021.04.27 |
[C프로그래밍] #4 연산자 (0) | 2021.04.26 |
[C프로그래밍] #3 표준 입출력 함수 (0) | 2021.04.26 |
[C프로그래밍] #2 자료형과 선행처리기 (0) | 2021.03.18 |