[자료구조 - C언어] 자료구조 제1강: C언어에서 포인터, 배열, 포인터 연산

2022. 4. 17. 17:25CS/자료구조

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

1. 메모리

  • 컴퓨터의 메모리는 데이터를 보관하는 장소
    • 컴퓨터의 메모리 하나의 커다란 테이블, 테이블의 각 칸이 주소를 가진다.
  • 바이트(8 bits) 단위로 주소가 저장됨
    • 정수형 변수는 4byte를 차지한다.
  • 모든 변수는 주소를 가진다.
    • 변수: 메모리의 일정 영역을 차지하면서 어떤 값을 저장할 수 있는 장소
    • 정수형 변수 a는 1002번지부터 1005번지 차지: 변수 a의 주소는 1002번지

 

2. 포인터(pointer)

  • 포인터는 메모리 주소를 값으로 가지는 변수이다.
    • 포인터는 일종의 변수다.
      • 모든 변수는 주소를 가진다.
      • 정수형 변수정수를 값으로 가지는 변수
      • 실수형 변수실수를 값으로 가지는 변수
      • 포인터메모리 주소를 값으로 가지는 변수
        • 메모리 주소는 그냥 정수 → 다만 그 정수가 메모리 주소인 것
type-name * variable-name;
//타입명 * 변수명
  • variable-name은 선언된 포인터 변수의 이름
  • *는 variable-name이 포인터 변수임을 표시하는 기호
  • 그렇다면 * variable-name만으로 포인터 변수라는 것을 나타낼 수 있다. type-name은 왜 필요한가?
    • type-name은 * variable-name이 저장하는 메모리 주소에 저장된 값의 데이터 타입을 표기
    • ex. ptr에 저장하는 메모리 주소(1004)에 저장된 데이터(100) 타입은 Int

2-1. 연산자 &

  • 연산자 &(엠퍼센트)는 변수로부터 그 변수의 주소를 추출하는 연산자

int a = 100;
int *ptr;  //정수형 포인터 ptr 선언
ptr = &a //a라는 변수의 주소를 추출해서 포인터변수 ptr에 저장
  • 변수 a는 100의 값을 가지는 정수형 변수, 1004번 메모리 주소에 값이 저장되어 있음
  • 포인터 변수 ptr에 a의 주소를 추출해서 저장
    • ptr변수는 포인터 변수이지만 역시나 변수: 주소 값을 저장하는 변수인 ptr이 메모리에 생성
    • ptr은 1012 주소를 가지고, 1004의 주소 값을 저장하고 있다.

2-2. 연산자 *

int x = 1, y = 2;
int *ptr;
ptr = &x;
  • 정수형 변수 x는 1의 값을 가지고 주소는 1000이다.
  • 정수형 변수 y는 2의 값을 가지고 주소는 1004이다.
  • 정수형 포인터 변수 ptr은 x의 주소값(1000)을 값으로 가지고, ptr의 주소는 1020이다.
y = *ptr
  • y는 *ptr의 값을 가진다.
    • ptr이 가지는 값은 x의 주소, *ptr은 ptr이 갖고 있는 값(= x의 주소)이 가리키는 값(= 1)
    • y는 x의 주소가 가리키는 값(= 1)을 가진다.
    • y는 1의 값을 가진다.
*ptr = 0;
  • *ptr은 0이다.
    • *ptr이 가지는 값(주소)이 가리키는 값이 0이다.
    • x의 주소값이 가리키는 값이 0이다.
    • x는 0의 값을 가진다.

[*위치에 따른 구분하기]

  • 변수를 선언할 때 변수명 앞에 * : 이 변수가 '포인터 변수다'를 표시하는 하나의 기호 역할
    • 치환문의 왼쪽: 변수가 지정하는 자리
    • ex. int * ptr; *ptr = 0
  • 변수의 선언 X, 일반적인 문장에서 포인터 변수 앞에 *: 포인터 변수가 저장하고 있는 주소에 저장된 값이나, 그 주소가 참조하는 자리
    • 치환문의 오른쪽: 그 변수가 가진 주소에 저장된 값
    • ex. y = *ptr

 

3. 포인터와 배열

int a[10];
//정수형 배열, 배열의 이름 a, 크기는 10
  • 배열의 이름(a)은 배열의 시작 주소를 저장하는 포인터 변수, 단 그 값을 변경할 수 없다.
    • 배열의 이름은 또 다른 하나의 변수
    • a는 a[0]의 주소를 저장하는 포인터 변수
  • 배열의 이름을 매개변수로 전달하면 전달되는 매개변수의 값은 배열의 첫 번째 값의 주소
    • int array[] == int *array

 

4. 포인터 arithmetic

int a[10];
  • *a와 a[0]는 동일한 의미다.
  • *(a + 1)은 a[1]과 동일한 의미다.
    • 메모리 주소 a는 일반적인 32bit의 정수 값 → 연산 가능
    • a의 주소는 1000, (a + 1)의 주소는 1004
      • 정수형 변수인 a는 메모리에서 4byte를 차지하기 때문에
#include <stdio.h>

int main(void){
    int int_data = {0, 1, 2};
    char char_data = {'a', 'b', 'c'};
    int *int_ptr = &int_data;
    char *char_ptr = &char_data;
    
    printf("%d\\n", int_ptr);    //1876947596
    printf("%d\\n", int_ptr+1);  //1876947600
    printf("%c\\n", char_ptr);   //\\213
    printf("%c\\n", char_ptr+1); //\\214
    
}
  • *(a + i)은 a[i]와 동일한 의미다.
    • *(a + i)는 저장된 주소에 저장된 값을 의미
    • *(a + i)는 타입에 관계없이 배열의 i번째 칸에 저장된 값
    •  (a + i)는 타입에 관계없이 배열의 i번째 칸의 주소
      • 연산자가 +연산자보다 우선순위가 높기 때문에 괄호()는 필수

 

 

 

 


부경대학교 권오흠 교수님의 [c로 배우는 자료구조 및 여러 가지 예제 실습] 강의 정리입니다. 감사합니다.

https://www.youtube.com/watch?v=-XbHQQ8pUQY 

 

728x90