C_포인터

심야·2023년 7월 14일
0

컴퓨터 과학

목록 보기
12/12
post-thumbnail

포인터

포인터란 '가리키는 것'이란 의미를 지닌다.
프로그램 작동 시 컴퓨터는 각 방의 데이터가 필요해 방들마다 주소를 붙여 데이터를 꺼내기 쉽게 만들었다.
방의 주소를 얻는 방법이 '포인터'이다.

int, char변수처럼 포인터도 변수다.
포인터 변수는 특정한 데이터가 저장된 주소값을 보관하는 변수다.

  • Pointer : 메모리 상에 위치한 특정한 데이터의 시작주소 값을 보관하는 변수

포인터는 int, char처럼 형(type)이 있다.
이 말은 포인터가 메모리 상의 int형 데이터의 주소값을 저장하는 포인터와 char형 데이터의 주소값을 저장하는 포인터가 서로 다르다는 말이다.

int *p;
char *p;

& 연산자

포인터는 주소를 보관하는 변수다. 그럼 주소는 어떻게 알아내는 걸까?
'&' 연산자를 사용하면 주소값을 구할 수 있다.

/* & 연산자 */
#include <stdio.h>
int main() {
  int a;
  a = 2;

  printf("%p \n", &a);
  return 0;
}

포인터 'p'에 들어 있는 값과 변수 'a'가 저장된 주소값이 같다.

#include <stdio.h>
int main() {
  int *p;
  int a;

  p = &a; // 변수 a의 주소값을 저장한다.

  printf("포인터 p 에 들어 있는 값 : %p \n", p);
  printf("int 변수 a 가 저장된 주소 : %p \n", &a);

  return 0;
}

정리

  1. 포인터는 특정한 데이터의 주소값을 보관한다.
  2. 포인터는 주소값을 보관하는 데이터의 형에 '*'를 붙임으로써 정의된다.
  3. '&'연산자로 특정한 데이터의 메모리 주소값을 구한다.

* 연산자

* 연산자 역할

  1. 포인터 변수에 저장된 주소값의 데이터를 가져온다.
  2. 포인터 변수에 저장된 주소값에 위치한 데이터

포인터 변수와 정수형 변수의 값이 같다.

/* * 연산자의 이용 */
#include <stdio.h>
int main() {
  int *p;
  int a;

  p = &a;
  a = 2;

  printf("a 의 값 : %d \n", a); // 2
  printf("*p 의 값 : %d \n", *p); // 2

  return 0;
}

포인터 변수에 a의 주소값을 저장한다.
*p는 포인터에 저장된 주소(변수 a의 주소)에 해당하는 데이터(변수 a)를 의미한다.
따라서 *p = 3a = 3과 같은 의미다.

#include <sdtio.h>
int main()
{
    int *p;
    int a;

    p = &a;
    *p = 3;

    printf("a의 값 : %d \n", a); // 3
    printf("*p의 값 : %d \n", *p); // 3

    return 0;
}

포인터 자체의 의미

변수 a와 포인터 p의 메모리 상의 모습은 아래와 같다.

포인터 p에 변수 a의 주소값이 저장되어 있다면 포인터 p는 변수 a를 가리킨다 라고 말한다. 포인터는 변수여서 특정한 메모리 공간을 차지한다. 따라서 위 그림처럼 포인터도 자기 자신만의 주소를 가진다.

포인터는 왜 형(Type)이 있을까

pointer Type이 있다면

int a;
pointer *p;
p = &a;
*p = 4;

위 코드를 컴퓨터는 아래와 같이 해석한다.

int a; // int 형 변수 a 선언, 메모리에 4 바이트 공간 생성
pointer *p // pointer 형 변수 p 선언, 메모리에 8 바이트 공간 생성
p = &a // 포인터 변수에 a의 주소값을 저장한다.
*p = 4; // 현재 포인터 p는 변수 a의 주소값이 들어있다. 그런데 a의 주소값은 모든 주소가 아니라 "시작주소"만 들어있다. *p 는 포인터 변수에 저장된 주소값의 데이터를 가져온다. 하지만 포인터 타입이 명확하지 않아 시작주소부터 얼마만큼을 읽어들어야 할지 알 수 없다.

int, char 등의 Type이 있다면

int a;
int *p;
p = &a;
*p = 4;

컴퓨터는 포인터가 int *형인 것을 보고 '이 포인터는 int데이터를 가리킨다'고 인식해 시작주소부터 4 바이트를 읽어 값을 바꾼다.

포인터도 변수다.

#include <stdio.h>
int main()
{
 int *p;
 int a;
 int b;
	
 p = &a;
 *p = 2;
 p = &b;
 *p = 4;
		
 printf("p에 저장된 값 : %p\n", p); // p에 저장된 값 : 0x7fffd3c4cb1c
 printf("a의 주소값 : %p \n", &a); // a의 주소값 : 0x7fffd3c4cb18
 printf("b의 주소값 : %p \n", &b); // b의 주소값 : 0x7fffd3c4cb1c
 printf("-------------------\n");
 printf("포인터 변수 p의 값 : %d\n", *p); // 포인터 변수 p의 값 : 4
 printf("변수 a의 값 : %d\n", a); // 변수 a의 값 : 2
 printf("변수 b의 값 : %d\n", b); // 변수 b의 값 : 4
}

포인터는 변수여서 가리키는 주소값이 변한다.

Reference

본 글은 이재범님의 모두의 코드 강좌를 정리합니다.
https://modoocode.com/23

profile
하루하루 성실하게, 인생 전체는 되는대로.

0개의 댓글

관련 채용 정보