/////
Search
📝

3월 11일(월)

학습목표

자료구조를 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
복사