일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 큐 연결리스트
- jQuery
- 연결 리스트
- npm Option
- 포인터
- 추상적 자료 구조
- access
- 배열 스택
- Index Range Scan
- Index Skip Scan
- 연동
- 확장 엘리먼트
- c언어 스택 배열
- 스택
- javascript new
- 생성자
- 자료구조
- pattern
- javascript this
- javascript prototype
- 생성자 new
- Index Full Scan
- javascript 생성자
- C#
- Loose Index Scan
- new 사용법
- 스택 배열
- 이중 연결 리스트
- 배열
- 연결리스트
- Today
- Total
Open-Closed Principle
[c언어] void 포인터 본문
포인터란 주소(address)를 내용으로 가지는 변수(variable)이다.
포인터는 크게 두가지 요소로 구성되어 있다.
첫째, 내용으로 가지는 주소
둘째, 가리키는 주소에 저장되어 있는 데이터의 형(data type)이다.
이 두가지만 잘 생각하고 응용하면 조금 복잡할 찌라도 해결할 실마리를 줄것이다.
void 포인터란 포인터의 두 가지 요소중 둘재 요소인 가리키는 데이터형이 정해지지 않은 포인터를 의미한다. void 포인터의 정의는 가리키는 데이터형이 없으므로 데이형 자리에 void라는 예약어를 기술하면 된다.
1 | void *vptr; | cs |
void 포인터는 주소만 저장하는 포인터인데 그로 인해서 포인터 연상자를 사용할 때 주의해야 할 점이 있다.
첫째, 포인터가 가리키는 곳의 내용을 읽어내는 역참조(dereference, *) 연산자를 사용하지 못한다. 엄밀하게 이야기 하면 데이터형을 알 수 없기 때문이다. 그래서 형변환 연산자(casting operator)를 이요하여 다른 형의 포인터로 강제 형변환을 하면 참조가 가능하다.
1 2 3 4 5 | void* vptr; int i; i = *vptr; // 잘못된 표현 i = *(int*)vptr; // 형변환을 통한 void 포인터 사용법 | cs |
두번째, 가리키는 곳의 데이터형이 없으므로 +나 - 같은 포인터와 정수의 덧셈 뺄셈을 하지 못한다. 포인터에 정수를 더한다는 말은 포인터에다 "sizeof(가리키는 곳의 데어터형)*정수"를 하는 것이다. 하지만 void 포인터는 sizeof(가리키는 곳의 데이터형)을 구할 수가 없으므로 연산이 안되는 것이다. 그래도 참조와 마찬가지로 다른 형의 포인터로 강제 형변환하여서 +,- 연산을 행할 수 있다.
1 2 3 4 5 | void* vptr; int i; i = *(vptr + 1); // 잘못된 표현 i = *((int*)vptr + 1); // 형변환을 통한 void 포인터 사용법 | cs |
void 포인터는 형이 정해지지 않고, 또한 다른 형의 포인터로 강제 형변환하는 형태로 강제로 형을 부여할 수 있다. 이 성질을 이용하여 데이터형에 관계없이 동작하는 함수를 제작하는데 유용하게 사용할 수 있다. 예를등다면 stdlib.h에 정의되어 있는 qsort() 함수와 같은 것이다.
'Programming > C, C++' 카테고리의 다른 글
[c언어]값에 의한 호출 대 참조에 의한 호출 (call by value vs call by reference) (2) | 2016.01.26 |
---|---|
[C언어] 2차원 배열과 포인터 (0) | 2014.07.06 |
[C언어] 1차원 배열과 포인터 (0) | 2014.06.29 |
[C언어]포인터의 기초(pointer) (0) | 2014.06.26 |