Computer Science/Data Structure

[자료구조] 1장 C언어 리뷰 (1)

na1-4an 2023. 9. 10. 14:20

 이번 학기도 자료구조를 듣게 되었다. 한동안 파이썬으로 코테를 공부하고, 스프링으로 자바를 공부해서 C언어를 까먹었다. 그래서 자료구조 수업을 본격적으로 들어가기 앞서 C언어를 간단히 공부하겠다. 이번 포스팅에서는 이론 공부를 하고, 다음 포스팅에서는 문제를 풀어보도록 하겠다.

 알고 있는 내용은 생략하고 작성하겠다.

1-1 배열

1. 배열의 선언

: int A[6]

2. 메모리 접근 방식

: 직접 접근 방식(direct access).→ 항목 접근의 시간 복잡도가 O(1)

   cf. 연결리스트: 순차 접근 방식(direct access) → 항목 접근의 시간 복잡도 O(n)

3. 문자열 특징(3)

: 문자열은 특별한 1차원 배열이다.

: <string.h> 포함 필수

: =, ==, < 등의 연산자를 사용할 수 없다.

4. 문자열 선언

: char s[12] = "game over"

5. 문자열 함수

: strcmp() - 비교, strcpy() - 복사, strlen() - 길이, strcat() - 붙임

6. 2차원 배열 선언

: int A[4][3]

7. 함수의 매개변수로서의 배열

: 배열을 전달 → 첫 번째 항목의 주소를 전달.(call by reference)

8. 배열에서의 주의사항(2)

: 매개 변수로 배열의 길이도 전달해야함.

  int findMaxValue(int a[ ], int len)

: 2차원 이상의 다차원 배열의 매개 변수 전달에 조심

  int findMaxPixel(int a[ ][5], int h, int w)

9. Call by reference vs. Call by value

  • Call by value: 복사하여 처리하기 때문에 안전하고, 원래의 값이 보존된다.
  • Call by reference:  복사하지 않고 직접 참조를 해서 빠르다. 값이 바뀌면 원래의 값도 바뀐다.

1-2 구조체

1. 구조체의 정의 & 선언

2. 멤버 접근

: 항목 연산자 '.' 사용.

3.연산자

: 대입 연산자 ' = '만 사용 가능.

: >, += 등 연산자 사용 불가능.

4. 함수

: 구조체는 함수의 매개 변수나 반환형으로 사용할 수 있음. → Call by value

1-3 포인터

1. 포인터

: 주소를 저장하는 변수

2. 포인터 변수 선언

int i = 10;
int* p;
p = &i;
char* p, q, r; 		// p는 char* 변수, q와 r은 char변수
char *p, *q, *r; 	// p, q, r 모두 char*형 변수

3. 포인터 활용

* 연산자: 포인터가 가리키는 곳의 내용을 추출

& 연산자: 변수의 주소를 추출

4. 포인터와 연산자

p 		// 포인터
*p 		// 포인터가 가리키는 값
*p++ 	// 가리키는 값을 가져온 다음, 포인터를 한칸 증가
*p-- 	// 가리키는 값을 가져온 다음, 포인터를 한칸 감소
(*p)++ 	// 포인터가 가리키는 값을 증가시킨다

5. 이중 포인터

6. 배열과 포인터

: 배열의 이름:사실상 포인터와 같은 역할!

7. 포인터의 형변환

void *p;
pi=(int *) p;

8. 포인터에서 구조체 멤버 접근

: 구조체에서는 ' . ' 연산자로 접근했다면, 

  포인터에서는 ' -> ' 연산자로 접근!

9. 주의사항(3)

: 포인터는 NULL로 초기화하는 것이 좋음.

: 초기화가 안 된 포인터 변수는 접근하면 안됨.

char* pc; // 포인터 pc는 초기화가 안 되어 있음
*pc = ‘a’; // 매우 위험한 코드

: 포인터 사이의 변환에는 명시적인 형 변환.

1-4 메모리

1. 정적 메모리

: 메모리의 크기는 프로그램 시작 전 결정. 실행 도중 크기를 변경 못함.

: 더 큰 입력이 들어오면 처리 못함. 더 작은 입력이 들어오면 메모리 공간 낭비.

int i; // int형 변수 i를 정적으로 할당
int* p; // 포인터 변수 p를 정적으로 할당
int A[10]; // 길이가 10인 배열을 정적으로 할당

2. 동적 메모리

: 실행 도중에 메모리를 할당 받고, 반납하는 것. 메모리를 효율적으로 사용 가능.

void* malloc(int size);			// 할당 공간이 쓰레기 값으로 채워짐
void* calloc(int num, int size) // 할당 공간이 0 값으로 채워짐

void free(void* ptr)