반응형
포인터
포인터 변수란 메모리의 주소 값을 저장하기 위한 변수
#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);
}
포인터 크기는 컴파일러 따라 다를 수 있지만
모든 주소와 포인터는 가리키는 자료형과 관계없이 크기가 같다.
#include <stdio.h>
void main()
{
char* p1;
int* p2;
double* p3;
printf("%d %d %d", sizeof(&p1), sizeof(&p2), sizeof(&p3)); // 8 8 8
}
8바이크 크기인 double 형 변수로 가르키게 되어
의도하지 않은 결과를 나을 수 있다.
만약 다른 변수에 할당되어 있는 영역이라면
그 값을 바꿀 수도 있으니 주의해야 한다.
경고 메세지가 발생하는데 타입 캐스팅을 명시해서 메시지를 없앨 수 있지만
타입 크기에 따른 주의사항은 잊지말자.
#include <stdio.h>
void main()
{
int a = 10;
int* p = &a;
double* pd;
pd = (double*)p;
printf("%lf\n", *pd);
}
반응형
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
[C] [전처리기] 매크로와 선행처리기 (1) | 2025.01.28 |
---|---|
[C/C++] [전처리기] 헤더파일(.h) 만들어서 include 하기 (2) | 2025.01.09 |
[C/C++] const 키워드 (1) | 2024.12.30 |
[C/C++] #include "헤더파일" & #include <헤더파일> (1) | 2024.12.25 |
[C/C++] 지역변수와 전역변수와 레지스터 변수 (1) | 2024.12.22 |
댓글