[C 언어] 포인터변수, &주소연산자, * 간접연산자

2021. 9. 29. 09:11·Programming Languages/C와 C++
728x90

C언어를 하다보면 & 연산자 * 연산자 그리고 포인터는 봐도봐도 헷갈린다.. 참 한번에 바로 이해되기 어려운 개념인것 같다. 정리하며 이해해보자 !!

 

1. 포인터 변수와 주소연산자 &

  • 포인터 변수 : 주소값을 저장하는 변수이다. 변수의 주소값은 반드시 포인터 변수에 저장하고 일반 변수에는 포인터가 아닌 일반 자료 값을 저장한다. 일반 변수랑 선언하는 방법도 다르고 포인터 변수 라는 것 자체가 또 다른 타입이라고 생각하면 된다. 
  • 포인터 변수의 선언방법 : 자료형 * 변수이름 ex) int *pointerInt;
  • 변수의 자료형이 다르면 당연히 그 변수의 주소를 저장하는 포인터의 자료형도 달라야 한다 !! 
int data = 100;
int *ptr;
ptr = &data

 

2. 간접연산자 *

  • 포인터 변수가 갖는 주소로 그 주소를 따라가서 원래의 변수를 참조할 수 있다
  • 즉, 포인터 변수가 가리키고 있는 변수를 참조한다. 
  • 간접 연산자를 이용한 *ptr은 포인터 ptr가 가리키고 있는 변수 data를 의미한다 
int data = 100;
char ch = 'A';

int *ptrint = &data; // 간접연산자 ptrint에 data의 주소를 넣는다
char *ptrchar = &ch; // 간접연산자 ptrchar에 ch의 주소를 넣는다.

print("%d %c \n", *ptrint, *ptrchar); // 100 A

// ptrint 는 data를 가리키고 있으니까 data의 값을 바로 참조할 수 있다.
// 이와 동일하게 ptrchar은 ch를 가리키고 있으니까 ch의 값 'A'를 바로 참조 할 수 있다. 

*ptrint = 200; // data의 값이 100에서 200으로 바뀐다.


print("%d %c \n", *ptrint, *ptrchar); // 200 A

 

3. 연산자 & 와 *

난 얘네 둘이 제일 헷갈렸는데, 한번 정리를 해보자

&는 주소연산자이고 *는 간접 참조 연산자이다. 모두 전위 연산자로, 서로 반대의 역할을 한다 !!!!!

  • 주소연산자 '& 변수' 는 변수의 주소값이 결과값이다. -> 말그대로 변수가 어디에 저장되어있는지 그 주소를 담고 있다
  • 간접 참조 연산자 '* 포인터변수'는 포인터 변수가 가리키는 변수 자체의 value가 결과값이다. -> value!! 라고 생각하면된다.

참고로 주소값인 '&변수' 는 r-value로만 사용이 가능하다. (r-value 란 right hand side value로 오른쪽에 오는값이다.)

ptr = &i; // 가능
&i = &j; // 틀린 문법

*ptr = 100; // *포인터변수 는 ptr이 가리키는 변수에 100을 삽입한다. 
i = *ptr; // 가능!

 

4. 주소 연산

 

double *pd = 100; // 경고 발생 !!!! 왜?? 포인터 자료형 != int자료형 
double *pd = (double *)100;
// 가능하긴 하지만, 이 의미는 double 형 포인터 pd에 100이라는 주소값을 저장한다는 뜻임
// 즉 100이 value가 아니라 100이 주소값이었던~것이다 !
728x90

'Programming Languages > C와 C++' 카테고리의 다른 글

C언어 enum (열거형)  (0) 2021.12.14
C언어 공용체  (0) 2021.12.14
C 언어 구조체 자세하게 알아보기  (0) 2021.12.14
C언어 배열에서 포인터 사용하기  (0) 2021.09.29
C배열의 크기 구하기 sizeof()  (0) 2021.09.29
'Programming Languages/C와 C++' 카테고리의 다른 글
  • C언어 공용체
  • C 언어 구조체 자세하게 알아보기
  • C언어 배열에서 포인터 사용하기
  • C배열의 크기 구하기 sizeof()
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613) N
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30) N
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5) N
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • 파이썬
  • 코딩테스트
  • 백준
  • 알고리즘
  • dp
  • dfs
  • 운영체제
  • 쿠버네티스
  • EC2
  • 데이터엔지니어
  • linux
  • 백트래킹
  • 프로그래머스
  • Kubernetes
  • Leetcode
  • 데이터브릭스
  • docker
  • Swift
  • 카카오코딩테스트
  • 빅데이터
  • python
  • BFS
  • 데이터엔지니어링
  • AWS
  • 스파크
  • 리눅스
  • SPARK
  • 클라우드
  • ansible
  • Databricks

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[C 언어] 포인터변수, &주소연산자, * 간접연산자
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.