간접 참조 연산자 * , 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가 상수화가 됨 (상수화란 변수와는 반대로 고정된 값으로 변했다는 의미이다)
'C 언어 > [책 정리] 혼자 공부하는 C언어' 카테고리의 다른 글
포인터 완전 정복을 위한 포인터 이해하기 (2) (0) | 2022.12.21 |
---|---|
포인터 완전 정복을 위한 포인터 이해하기 (1) (0) | 2022.12.21 |
포인터의 기본 개념 (1) (0) | 2022.12.20 |
문자를 저장하는 배열 (0) | 2022.12.12 |
배열의 선언과 사용 (0) | 2022.12.12 |