[자료구조 - C언어] 자료구조 제1강: C언어에서 포인터, 배열, 포인터 연산
2022. 4. 17. 17:25ㆍCS/자료구조
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
'CS > 자료구조' 카테고리의 다른 글
[자료구조 - C언어] 자료구조 제5강: 전화번호부 v2.0 (0) | 2022.05.06 |
---|---|
[자료구조 - C언어] 자료구조 제4강: 전화번호부 v1.0 (0) | 2022.04.28 |
[자료구조 - C언어] 자료구조 제3강: 문자열 예제 (0) | 2022.04.26 |
[자료구조 - C언어] 자료구조 제2강: 문자열 (0) | 2022.04.25 |
[자료구조 - C언어] 자료구조 제1강: 동적메모리할당 (0) | 2022.04.18 |