반응형
포인터
포인터 변수란 메모리의 주소 값을 저장하기 위한 변수
#include <stdio.h>
#include <string.h>
int main(void) {
int num = 7;
int* p; // 포인터 변수 선언
p = # // num의 주소값을 포인터 변수 p에 저장
printf("%d", *p); // 포인터 p가 가리키고 있는 실제값 출력
}
포인터 변수 p이 int형 변수 num을 가리킨다.
포인터 변수는 double *p;와 unsigned int *p; 같이 선언
포인터 형(type)은 메모리 공간을 참조하는 기준이 됩니다. - int (4 byte), double (8 byte)
#include <stdio.h>
#include <string.h>
int main(void) {
double num = 3.14; // double 형 변수
int* p = # // 형(type) 불일치
printf("%d", *p); // 예측 불가능한 값 출력
}
C언어는 메모리 접근이 유연하기 때문에 위의 코드는 컴파일 에러가 발생하지 않는다.
하지만 double형 변수를 4바이트를 읽어 해석하기 때문에 잘못된 결과가 나옵니다.
그렇기에 포인터형을 통해 메모리의 접근시 유의해야 합니다.
int *b = &a;처럼 선언할 때 사용하는 *는 포인터 변수임을 알리기 위한 목적(선언)
이후에 *b 라고 쓰면 포인터 변수 b가 가리키는 주소의 값을 의미.
따라서, 아래 두 개의 * 연산자는 다른 의미를 가집니다.
#include <stdio.h>
#include <string.h>
int main(void) {
double num = 3.14;
int* p = #
printf("%d", *p);
}
포인터의 잘못된 사용 예제
- 선언시 초기화를 해주지 않으면 메모리는 쓰레기값을 가리키고 있습니다.
잘못된 메모리 접근을 방지하고자 RTE 발생
- 보통 NULL로 선언해줍니다. "아무데도 가리키지 않는다."
(실제로 이는 상수 0으로 정의되어 있다.)
#include <stdio.h>
#include <string.h>
int main(void) {
int* ptr; // 빌드시 RTE 발생
*ptr = 200;
printf("%d", *ptr);
}
위의 코드와 마찬가지로, 빌드시 RTE 발생하지만,
잘못된 메모리의 접근에 대해 보호장치가 없는 운영체제에서도 치명적인 영향을 주지 않는다.
#include <stdio.h>
#include <string.h>
int main(void) {
int* ptr = NULL; // 선언과 동시에 초기화
*ptr = 200; // 아무것도 가리키지 않는 곳에 값을 할당하므로 RTE 발생
printf("%d", *ptr);
}
반응형
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C] 함수 포인터와 void 포인터 (0) | 2021.03.20 |
---|---|
[C] 포인터의 포인터(이중 포인터) (0) | 2021.03.20 |
[C] 다차원 배열과 포인터 관계 (0) | 2021.03.20 |
[C] Call-by-value & Call-by-reference (0) | 2021.03.20 |
[C] 포인터와 배열의 관계 (0) | 2021.03.20 |
댓글