chapter 7. 포인터
1.1 주소연산자&
메모리 공간은 바이트마다 고유한 주소가 있습니다. 0부터 바이트마다 1씩 증가합니다.
메모리 주소는 저장장소인 변수 이름과 함게 기억 장소를 참조하는 또 다른 방법입니다.
주소연산자 &
지금까지 함수 scanf_s()를 사용하면서 &인자를 사용했을겁니다. 바로 &(ampersand)가
피연산자인 변수의 메모리 주소를 반환하는 주소연산자입니다.
int input;
scanf_s("%d",&input);
(&input은 변수 input의 주소값을 반환한는것뿐
실제 주소는 4바이트 크기의 양의 정수이다)
저는 쉽게 생각해서 input이라는 곳에 변수를 저장한다고 생각하고있습니다.
보시면 32를 입력하고 &없이 출력을 하면 입력했던 32가 나오고
&input을 입력하면 주소가 출력됩니다. 주소값은 실행할때마다 바뀌어서 나온걸로 봐서 랜덤하게 저장된다고 생각이 됩니다.
1.2포인터 변수
포인터 변수는 주소값을 저장하는 변수이다. 주의해야 할점은 변수자료형이 다르면 그 변수의 주소를 저장하는 포인터의 자료형도 달라야한다.그리고 자료형 뒤에 *(asterisk)를 사용한다.
int *ptrint;
short *ptrshort;
char *ptrschar;
double *ptrdouble;
(초기값이 없으면 쓰레기 값이 저장된다)
int *ptr1, *ptr2, *ptr3; 가능하다.
int data = 100;
int *ptrint;
ptrint = &data;
이게 의미하는거는 data에는 100을 저장하고 포인터변수 ptrint에는 data의 주소를 저장한다는 뜻이다!
이것을 포인터 변수 ptrint는 변수 data를 가리킨다(참조한다)라고 표현한다.
간접연산자* 포인터ptrint가 가리키는 변수가 data라면 *ptrint는 변수 data를 의미한다.
int main(void) {
int data = 100;
char ch = "A";
int* ptrint = &data;
char* ptrchar = &ch;
printf("간접 출력: %d %c\n", *ptrint, *ptrchar);
*ptrint = 200;
*ptrchar = 'B';
printf("직접 출력: %d %c\n", data, ch);
return 0;
}
을 실행하면 간접 출력: 100 가 출력되는것을 알수있다. 왜 A가 아니고 역십자가 출력되는지는 모르겠다;;
직접 출력: 200 B