728x90
C언어를 하다보면 & 연산자 * 연산자 그리고 포인터는 봐도봐도 헷갈린다.. 참 한번에 바로 이해되기 어려운 개념인것 같다. 정리하며 이해해보자 !!
1. 포인터 변수와 주소연산자 &
- 포인터 변수 : 주소값을 저장하는 변수이다. 변수의 주소값은 반드시 포인터 변수에 저장하고 일반 변수에는 포인터가 아닌 일반 자료 값을 저장한다. 일반 변수랑 선언하는 방법도 다르고 포인터 변수 라는 것 자체가 또 다른 타입이라고 생각하면 된다.
- 포인터 변수의 선언방법 : 자료형 * 변수이름 ex) int *pointerInt;
- 변수의 자료형이 다르면 당연히 그 변수의 주소를 저장하는 포인터의 자료형도 달라야 한다 !!
int data = 100;
int *ptr;
ptr = &data
2. 간접연산자 *
- 포인터 변수가 갖는 주소로 그 주소를 따라가서 원래의 변수를 참조할 수 있다
- 즉, 포인터 변수가 가리키고 있는 변수를 참조한다.
- 간접 연산자를 이용한 *ptr은 포인터 ptr가 가리키고 있는 변수 data를 의미한다
int data = 100;
char ch = 'A';
int *ptrint = &data; // 간접연산자 ptrint에 data의 주소를 넣는다
char *ptrchar = &ch; // 간접연산자 ptrchar에 ch의 주소를 넣는다.
print("%d %c \n", *ptrint, *ptrchar); // 100 A
// ptrint 는 data를 가리키고 있으니까 data의 값을 바로 참조할 수 있다.
// 이와 동일하게 ptrchar은 ch를 가리키고 있으니까 ch의 값 'A'를 바로 참조 할 수 있다.
*ptrint = 200; // data의 값이 100에서 200으로 바뀐다.
print("%d %c \n", *ptrint, *ptrchar); // 200 A
3. 연산자 & 와 *
난 얘네 둘이 제일 헷갈렸는데, 한번 정리를 해보자
&는 주소연산자이고 *는 간접 참조 연산자이다. 모두 전위 연산자로, 서로 반대의 역할을 한다 !!!!!
- 주소연산자 '& 변수' 는 변수의 주소값이 결과값이다. -> 말그대로 변수가 어디에 저장되어있는지 그 주소를 담고 있다
- 간접 참조 연산자 '* 포인터변수'는 포인터 변수가 가리키는 변수 자체의 value가 결과값이다. -> value!! 라고 생각하면된다.
참고로 주소값인 '&변수' 는 r-value로만 사용이 가능하다. (r-value 란 right hand side value로 오른쪽에 오는값이다.)
ptr = &i; // 가능
&i = &j; // 틀린 문법
*ptr = 100; // *포인터변수 는 ptr이 가리키는 변수에 100을 삽입한다.
i = *ptr; // 가능!
4. 주소 연산
double *pd = 100; // 경고 발생 !!!! 왜?? 포인터 자료형 != int자료형
double *pd = (double *)100;
// 가능하긴 하지만, 이 의미는 double 형 포인터 pd에 100이라는 주소값을 저장한다는 뜻임
// 즉 100이 value가 아니라 100이 주소값이었던~것이다 !
728x90
'Programming Languages > C와 C++' 카테고리의 다른 글
C언어 enum (열거형) (0) | 2021.12.14 |
---|---|
C언어 공용체 (0) | 2021.12.14 |
C 언어 구조체 자세하게 알아보기 (0) | 2021.12.14 |
C언어 배열에서 포인터 사용하기 (0) | 2021.09.29 |
C배열의 크기 구하기 sizeof() (0) | 2021.09.29 |