C 언어/[책 정리] 혼자 공부하는 C언어

포인터의 기본 개념 (2)

smile blog 2022. 12. 20. 13:43

간접 참조 연산자 * , const를 사용한 포인터


포인터와 간접 참조 연산자 : *

포인터

주소를 저장하는 변수로 일반 변수와 마찬가지로 선언 후에 사용한다 (선언할 때 변수 앞에 *만 붙여준다)

 

#include <stdio.h>

int main(void)
{
	int a; // 일반 변수 선언
	int *pa; // 포인터 변수 선언
	 
	pa = &a; // 포인터에 a의 주소값 대입
	*pa = 10; // 포인터로 변수 a에 10 대입 

	printf("포인터로 a 값 출력 : %d\n", *pa);
	printf("변수명으로 a 값 출력 : %d\n", a);

	return 0;
}

*pa == a

==> 값이 같은 걸로 보았을 때 위에 코드처럼 포인터 pa와 변수 a는 같다는 것을 알 수 있다

 

 

int *pa;

==> 포인터의 자료형은 저장할 주소가 어떤 변수의 주소인지 보고 그 변수의 자료형을 적으면 된다

 

 

pa = &a;

==> 만약 변수 a가 메모리 100번지부터 103번지까지 할당되었다면 주소 값 100 (&는 시작 주소 값을 가져오므로)이 pa에 저장된다

포인터 pa는 변수 a가 메모리 어디에 할당 되었는지 그 위치를 기억하고 있다

이렇게 포인터가 어떤 변수의 주소를 저장한 경우 '가리킨다'라고 하고 밑에 코드처럼 화살표로 간단히 표현할수 있다

pa -> a // 포인터 pa는 변수 a를 가리킨다

 

ex)

x -> y // x는 y를 가리킨다

==> x는 포인터이며 변수 y의 주소를 저장한다

 

 

 

간접 참조 연산자 * ( 포인터 연산자 )

포인터가 가리키는 변수를 사용할 때 쓰는 특별한 연산자

*pa // 간접 참조 연산자 + 포인터

 

연산자의 위치는 어디에 붙어도 상관 없다

ex) *pa, * pa 둘 다 같은 뜻


const를 사용한 포인터

const 예약어 ( const = 상수화 )

포인터에 사용하면 가리키는 변수의 값을 바꿀 수 없다는 의미

#include <stdio.h>

int main(void)
{
	int a = 10, b = 20;
	const int* pa = &a; // const 사용

	printf("변수 a 값 : %d\n", *pa);
	pa = &b;
	printf("변수 b 값 : %d\n", *pa);
	pa = &a;
	a = 20;
	printf("변수 a 값  %d\n", *pa);

	return 0;
}

 

포인터에 사용된 const의 의미

==> pa가 가리키는 변수 a는 pa를 간접 참조하여 바꿀 수 없다는 것이다

 

ex)

*pa = 20;

==> pa를 통해 a를 바꿀려하면 에러 메세지가 뜬다

 

포인터에 const를 사용하는 대표적인 예

문자열 상수를 인수로 받는 함수 (문자열 상수는 값이 바뀌면 안 되는 저장공간이므로 함수의 매개변수를 통해서 값을 바꿀 수 없도록 매개변수로 선언된 포인터에 cosnt를 사용)

 

int * const pa = &a;

==> 포인터 pa가 상수화가 됨 (상수화란 변수와는 반대로 고정된 값으로 변했다는 의미이다)