알 수 없는 사용자 2020. 2. 6. 17:39

1.1 주소연산자&

메모리 공간은 바이트마다 고유한 주소가 있습니다. 0부터 바이트마다 1씩 증가합니다.

메모리 주소는 저장장소인 변수 이름과 함게 기억 장소를 참조하는 또 다른 방법입니다.

 

주소연산자 &

지금까지 함수 scanf_s()를 사용하면서 &인자를 사용했을겁니다. 바로 &(ampersand)가

피연산자인 변수의 메모리 주소를 반환하는 주소연산자입니다.

 

int input;

scanf_s("%d",&input);

(&input은 변수 input의 주소값을 반환한는것뿐

실제 주소는 4바이트 크기의 양의 정수이다) 

 

저는 쉽게 생각해서 input이라는 곳에 변수를 저장한다고 생각하고있습니다.

 

입력한 모습
실행한 모습(32를 입력했다)

보시면 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