C
[c] 포인터
tonirr
2021. 4. 21. 00:42
- 포인터변수의 선언
- 형식: 자료형 *포인터변수명;
- 사용 예: int *p;
- 기능: 변수 p는 포인터 변수로서 정수형의 자료를 갖는 변수의 주소를 갖는다.
- int *p
- p: 포인터 변수로 정수형 자료가 수록되어 있는 주소를 가지고 있음
- *p: 해당 주소에 수록되어 있는 정수형 자료를 갖고 있음
- 포인터변수의 사용 예
- int a, b;
- int *p;
- 변수 p를 포인터 변수로 선언
- a=5000;
- p=&a;
- 포인터 변수 p에 변수 a의 주소 값을 대입
- b=*p;
- 포인터 변수 p가 가리키는 주소의 내용을 변수 b에 저장(a의 값 5000이 b에 저장된다)
- 포인터변수의 참조
- 포인터변수의 참조 => &, * 연산자 사용
- 예 1) int *p, i=4; *p=i;
- 포인터변수 p가 기억공간 내 몇 번지를 가르키는지 알 수 없음
- 예 2) int *p, i=4; *p=5;
- 포인터변수 p가 기억공간 내 몇 번지를 가르키는지 알 수 없음
- 예 1) int *p, i=4; *p=i;
- 포인터변수의 올바른 참조 방법
- 예 3) int *p i=4; p=&i; *p=10;
- 포인터변수의 참조 예
- 포인터변수의 참조 => &, * 연산자 사용
#include <stdio.h>
void main() {
int *p, i=3, j;
p=&i; // 포인터변수 p는 i의 주소를 가리킴
j=*p; // 포인터변수 p가 가리키는 번지의 내용을 변수 j에 대입
j++; // 변수 j의 값을 1증가
print("*p = %d\n", *p); // *p = 3
print(" p = %x\n", p); // p = fff4
print(" j = %d\n", j); // j = 4
}
- void형 포인터
- 형식: void * 포인터명;
- 의미
- 프로그램 실행시에 자료형이 결정되는 경우에 사용
- 저장하기 전에 명시적 형변환이 필요
- void형 포인터의 사용 예
#include <stdio.h>
void main(){
int a = 100;
char b = 'b';
void *p = NULL; // void형 포인터를 선언한 후 초기화
p = (int*)&a; // void형 포인터 p에 int형 변수 a의 주소를 명시적 형변환을 이용하여 대입
printf("*p = %d\n", *(int*)p); // *p = 100
p = (char*)&b; // void형 포인터 p에 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 감소 |
- 포인터 연산
- 포인터변수에 +,-,++,-- 연산자를 사용하는 연산
- int a[10], *p, *q;
- p=&a[2]
- q=p+3 -> q=&a[5]
- p=p+6 -> p=&a[8]
- int a[10], *p, *q;
- p=&a[7]
- q=p-3 -> q=&a[4]
- p=p-5 -> p=&a[2]
- int a[10], *p, *q;
- 포인터변수에 +,-,++,-- 연산자를 사용하는 연산