C언어) 포인터

ssuperJ·2023년 1월 10일
0

clang

목록 보기
1/1

1. 포인터란 무엇인가?

int main(void)
{
	char ch1='A', ch2='Q';
    int num=7;
}

변수 num이 저장하기 시작한 주소 0x12ff76이 변수 num의 주소 값이다.
이러한 정수 형태의 주소 값을 저장하는 목적으로 선언되는 것이 포인터 변수이다.


"정수 7이 저장된 int혀아 변수 num을 선언하고 이 변수의 주소 값 저장을 위한 포인터 변수 pnum을 선언하자. 그리고 나서 pnum에 변수 num의 주소 값을 저장하자

❗️ 64비트 운영체제에서는 주소값이 8바이트(8*8비트)로 표현된다
❗️ 32비트 운영체제에서는 주소값이 4바이트(4*8비트)로 표현된다


2. 포인터 연산자

포인터가 있는 이유
-> 주소값을 통한 메모리 접근을 위하여


1) *

int * ptr = # // ptr의 선언
*ptr = 30; // ptr이 가르키는 &num의 주소로 30을 저장

2) &

&num // 변수 num의 주소값

3. 다양한 포인터 형이 존재하는 이유

❓ 왜 int형 변수로 주소값이 저장이 가능한데 굳이 포인터 변수로 저장하는가?

-> int형 변수에는 값만 저장하지 메모리 주소에 대한 정보를 저장하고 있지 않기 떄문이다.

❓ 포인터 변수가 한개가 아니며 왜 타입별로 포인터터 변수가 존재하는가?

-> 예를 들어 타입에 대한 정보가 없다면
포인터 변수가 가르키는 변수에 맞는 값을 저장하는지 컴파일러가 알 수 없기 때문이다.
컴파일러한테 힌트를 주기위함


포인터 형은 메모리 공간을 참조하는 방법의 힌트가 된다. 다양한 포인터 형을 정의한 이유는 * 연산을 통한 메모리의 접근기준을 마련하기 위함이다.


4. 잘못된 포인터의 사용과 널 포인터

int main(void)
{
	int *ptr;
    *ptr = 200;
}

위험한 코드 1
-> ptr이 쓰레기 값으로 초기화 된다. 따라서 200이 저장되는 위치가 어디인지 알수 없다


int main(void)
{
	int *ptr = 125;
    *ptr = 200;
}

위험한 코드 2
-> 주소값 125가 어디인줄 알고 저장하는가?
혹여나 시스템 주소라면??


int main(void)
{
	int *ptr1 = 0;
	int *ptr2 = NULL;
}

안전한 코드
-> NULL는 숫자 0과 같다
그리고 0은 0번지를 뜻하는게 아니라 아무것도 가르키지 않는다는 의미를 가진다.

profile
중요한건 꺾이지 않는 마음...

0개의 댓글