귀염둥이의 메모

[C언어] 포인터(Pointer) 본문

CS/C, C++

[C언어] 포인터(Pointer)

겸둥이xz 2021. 2. 9. 02:54
반응형

포인터(Pointer)

- 포인터는 특정한 변수 자체가 존재하는 메모리 주소의 값을 가진다.

- 포인터는 컴퓨터 시스템의 특정한 메모리에 바로 접근할 수 있다.

- 중요한 메모리 영역에 접근하지 않도록 주의해야 한다. -> 의도하지 않은 결과 발생

 

기존에 a를 이용해서 5라는 값을 찾을 수 있지만 포인터 변수 b를 이용해서도 5라는 값을 찾을 수 있다.

int main() {
  int a = 5;
  int *b = &a; // 선언할 때 쓰는 *는 포인터 변수임을 알림
  printf("*b = %d\n", *b); // *b = 5
  
  return 0;
 }

'선언할 때' 쓰는 *는 포인터 변수임을 알려주기 위한 목적을 가진다.

이후에 *b 라고 쓰게 되면, 포인터 변수 b가 가리키는 주소의 값 5이다. 간접 참조

 

 

포인터 관련 연산자

- 주소 연산자(&) : 변수 앞에 붙어서 변수의 메모리 시작 주소 값을 구한다.

- 포인터(*) : 포인터 변수를 선언할 때 사용한다.

- 간접 참조 연산자(*) : 선언된 포인터 변수가 가리키는 변수를 구한다.

 

int main() {
  int a[] = {1, 2, 3, 4, 5};
  
  for (int i = 0; i < 5; i++) {
  	printf("%d\n", &a[i]);
  }
  
  /* 출력결과
  -405719472
  -405719468
  -405719464
  -405719460
  -405719456
  */
  return 0;
}

printf에서 &를 사용하여 주소 값을 출력했기 때문에 배열의 각 원소의 주소 값이 출력된다.

 

int main() {
    int a = 5;
    int *b = &a; // 변수 a의 주소 값을 가리킨다.
    int **c = &b; // 포인터 변수 b의 메모리 주소 값을 가리킨다.
    printf("%d\n", **c); // 5
    
    return 0;
}

포인터는 단지 특정한 메모리 주소를 담고 있는 변수일뿐이다. 포인터는 다중으로 사용 가능하다.

 

 

배열과 포인터

- 배열과 포인터는 사실 동일하다.

- 배열을 선언한 이후에는 그 이름 자체가 포인터 변수와 동일함.

int main() {
    int a[] = {1, 2, 3, 4, 5};
    int *b = a;
    printf("%d\n", b[2]); // 3
    
    return 0;
}

 

 

<참고>

패스트캠퍼스 컴퓨터공학 올인원 패키지 - (컴퓨터 공학 전공필수 소프트웨어 베이직)

반응형
Comments