학습목표
•
자료구조를 C프로그램으로 구현하기 위해 필요한 프로그래밍 기법 학습
•
배열 자료형을 이해하고 배열의 구현 방법 학습
•
포인터의 의미를 이해하고 구현 방법 학습
•
구조체 자료형을 이해하고 구현 방법 학습
배열
같은 자료형을 가진 자료들을 나열하여 메모리에 연속으로 저장하여 만든 자료들의 그룹
인덱스 | index
•
배열의 요소를 간단히 구별하기 위해 사용하는 번호
•
0부터 시작
배열 선언
// 자료형 배열이름[배열요소 개수]
int list[6];
C
복사
1.
배열 자료형 선언
a.
배열 요소는 모두 같은 자료형
2.
변수 이름과 같은 규칙으로 배열이름 설정
3.
[]를 사용해 배열 요소의 개수를 표시
a.
배열 요소 개수가 배열 크기
b.
배열을 선언하면 메모리에 배열에 대한 공간이 할당됨
c.
메모리의 크기는 “자료형에 대한 메모리 할당 크기 X 배열 요소 개수”
1차원 배열
int list[6];
// set연산에 해당
list[0] = 100;
// get연산에 해당
value = list[0];
C
복사
다차원 배열
2차원 이상의 배열
// 자료형 배열이름[배열크기: 행 개수 -> 행 번호][배열크기: 열 개수 -> 열 번호]
int list[3][5]
C
복사
2차원 배열(행렬)
다차원 배열의 초기화
다차원 배열이 배열의 배열이라는 것을 생각하여 초기값을 구분하여 지정하거나, 1차원 배열처럼 초기값 리스트를 지정해 순서대로 배열 요소의 초기값으로 설정
// 다차원 배열 | 배열의 배열 -> 초기값을 구분하여 지정
int i[2][3] = {{1,2,3}, {4,5,6}};
// 초기값 리스트를 지정해 순서대로 배열 요소의 초기값으로 설정 : 1차원 배열처럼
int i[2][3] = {1,2,3,4,5,6};
C
복사
포인터
•
변수의 메모리 주소값
•
포인터 변수
◦
주소값을 저장하는 특별한 변수
◦
포인터 변수가 어떤 변수의 주소를 저장하고 있다?
→ 포인터 변수가 그 변수를 가리키고 있다!
◦
포인터 변수를 통해, 연결된 주소의 변수 영역을 액세스
◦
포인터라고 하기도 함
포인터 선언
// 자료형 *포인터이름;
// 1바이트의 char형 변수의 주소를 저장할 포인터 선언 : ptr에 저장된 메모리 주소로부터 1바이트의 cha데이터 액세스
char *ptr;
// 2바이트의 short형 변수의 주소를 저장할 포인터 선언 : ptr에 저장된 메모리 주소로부터 2바이트의 short데이터를 액세스
short *ptr;
// 4바이트의 int형 변수의 주소를 저장할 포인터 선언 : ptr에 저장된 메모리 주소로부터 4바이트의 int데이터를 액세스
int *ptr;
C
복사
char a = "A";
char b = "200";
// 포인터 선언
char *p;
// 포인터변수가, 변수의 메모리 주소를 저장
p = &a;
// 포인터가 가리키는 내용 변경 : *연산자 사용
*p = b;
C
복사
포인터변수로 변수a의 주소를 가리킨다 → 즉, 변수a의 변수 영역을 액세스
포인터 연산
변수의 주소를 얻기 위해 사용
주소 연산자 : &
int x=1, y=2;
int *px;
px = &x;
y = *px;
*px = 0;
C
복사
바로 위 코드의 실행결과 그림
함수의 매개변수로 포인터 사용하기
1.
Call-by-Value
함수 내에서 매개변수로 전달된 포인터를 사용해 외부 변수의 값 변경 가능
#include <stdio.h>
void swap(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
int main(void)
{
int a=1, b=2;
printf("swap을 호출하기 전: a=%d, b=%d", a,b);
swap(a,b);
// 실행결과는 a=1, b=2 : swap함수 내에서 x,y의 값은 2와 1로 스왑이 이뤄졌지만, 함수 외부에서(main함수)는 a,b는 스왑이 안 일어난 셈
// 이건 value를 전달했기 때문에 그렇습니다
// value를 사용해서 스왑을 해주려면 스왑함수에 리턴문이 존재해야 외부에서도 적용이 된 셈인데, 쉽지 않아요
printf("swap을 호출한 다음: a=%d, b=%d", a,b);
return 0;
}
C
복사
2.
Call-by-Address
함수 내에서 매개변수로 전달된 포인터를 사용해 외부 변수의 값 변경 가능
#include <stdio.h>
void swap(int *px, int *py)
{
int tmp;
tmp = *px;
*px = *py;
*py = tmp;
}
int main(void)
{
int a=1, b=2;
printf("swap을 호출하기 전: a=%d, b=%d", a,b);
swap(&a,&b);
// a와 b의 값이 실제로 2와 1로 스왑이 일어났습니다 : 포인터를 사용해주었기 때문
printf("swap을 호출한 다음: a=%d, b=%d", a,b);
return 0;
}
C
복사
배열과 포인터
배열의 이름 : 사실상 포인터와 같은 역할
#include <stdio.h>
#define SIZE 6
// 인자에 배열을 사용한다고 말한건, 배열의 value를 전부 전달한게 아님.
// 배열의 주소(시작 주소)를 전달해준겁니다.
void get_integers(int list[])
{
printf("6개의 정수를 입력하시오: ");
for(int i=0; i<SIZE; ++i) {
scanf("%d", &list[i]);
}
}
int cal_sum(int list[])
{
int sum = 0;
for(int i=0; i<SIZE; ++i) {
sum += *(list + i);
}
return sum;
}
int main(void)
{
int list[SIZE];
get_integers(list);
printf("합 = %d \n", cal_sum(list));
return 0;
}
C
복사



