이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[C] 포인터

  • 2022.03.28 16:21
  • Programming Language/C

 

 

 

포인터는 메모리 공간의 주소를 의미한다.

포인터만 따로 처리하는 타입으로 포인터 타입이 있다. ( * 로 표시하고, "%p"를 사용 )

 

 

 

 

 

변수를 저장할 때 처음부터 포인터와 값을 함께 기록하면 좋지만, 저장할 때 메모리 공간이 따로 들어가고 매번 값을 확인해야 하기 때문에 잘 사용하지 않는다.

 

대신 크기별로 전담 변수를 둬 데이터의 타입으로 덩어리의 크기를 표현하는 방법을 사용한다. (int타입이면 int포인터, char타입이면 char포인터) 

 

 

 

 

 

 

 

 

 

int형 포인터 ptr1에 대해서 주소로 접근해 데이터를 읽을 때는 4byte를 한 덩어리로 보고 읽어온 값은 int형으로 처리한다.

 

char형 포인터 ptr2에 대해서 주소로 접근해 데이터를 읽을 때는 1byte를 한 덩어리로 보고 읽어온 값은 char형으로 처리한다.

 

포인터 변수를 선언할 때는 왼쪽과 같이 타입을 함께 작성한다.

 

 

 

(포인터 변수의 크기는 4바이트 혹은 8바이트이다. 컴파일러의 환경에 따라 다름.)

 

 

이를 통해 미루어 짐작할 수 있듯, 포인터에서 미리 지정된 타입은 매우 중요하다.

지정된 타입의 크기를 기준으로 잘라서 읽기 때문에, int * ptr1 = 3.1234; 처럼 자료형이 일치하지 않는 연산은 수행할 수 없다.

(컴파일은 될 지 몰라도, 읽어들이는 크기가 다르기에 의도대로 동작하지 않는다)

 

 

 

포인터 변수에 값을 넣을 때는 어떻게 해야 할까?

 

int a = 3; 처럼 하드코딩식으로 대입하면 안된다. (int * ptr1 = 3;)

어셈블리어에서는 가능했지만, 3이라는 주소가 운영체제에서 매우 중요한 부분 일 수도 있고.. 보안을 위해서 금지한다.

 

int * p;
int num = 5;
p = &num

 

위와 같이 포인터 변수는 주소를 통해 접근해야 한다. (& 사용)

 

 

변수의 l-valule와 r-value를 생각하면 이해하기 쉽다.

num변수의 위치를 p변수의 값에 저장한다.

 

 

scanf에서 자주 사용하던 &연산자는 변수와 함께 사용 시 변수의 위치(주소, l-value)를 알려주는 연산자이다.

즉, 변수를 주면 변수의 주소를 주는 연산자라고 생각할 수 있다.

 

&연산을 반대로 수행하는 연산자도 있는데, 바로 *연산자이다.

 

*연산자는 주소를 주면 변수의 값을 준다. 

즉, l-value를 통해 r-value를 얻을 수 있다.

 

변수의 r-value만을 얻을 수 있어 완전히 역연산이라고는 할 수 없지만, 비슷한 역할을 수행한다. (변수를 얻을 수 없으니)

 

포인터를 표현하는 기호와 같아 헷갈리기 쉽다..

 

 

 

 

 

---- &*과 *&연산도 오류 없이 수행된다 ------

 

x = *pnum부분의 연산에 집중하자.

x = *pnum연산을 수행할 시 x의 l-value는 그대로지만 r-value에는 365가 할당된다. 

이 부분을 이해하면 다음 내용도 문제 없이 넘길 수 있다.

 

 

역시 *연산자의 성질을 통해 *연산자와 포인터 변수를 함께 사용할 시 일반 변수로 사용할 수 있다는 점을 미루어 짐작할 수 있다.

 

 

위 예제를 통해 이해하자.  num1은 130, num2는 70이 출력된다.

 

 

 

반응형

'Programming Language > C' 카테고리의 다른 글

[C] 포인터 연산  (0) 2022.04.01
[C] 배열과 포인터  (0) 2022.04.01
[C] 문자열  (0) 2022.03.28
[C] 배열  (0) 2022.03.28
[C] 함수 간 소통 / 재귀  (0) 2022.03.22

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [C] 포인터 연산

    [C] 포인터 연산

    2022.04.01
  • [C] 배열과 포인터

    [C] 배열과 포인터

    2022.04.01
  • [C] 문자열

    [C] 문자열

    2022.03.28
  • [C] 배열

    [C] 배열

    2022.03.28
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (605)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • JavaScript (15)
      • C (25)
      • C++ (12)
      • Python (1)
      • PHP (2)
    • Computer Science (68)
      • Operating System (18)
      • Computer Network (16)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • Solutions (13)
    • Life Logs (0)
    • 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바