본문 바로가기
자격증/정보처리기사

C언어 자료구조와 포인터

by 두두리안 2022. 7. 7.
728x90

목차

1. 배열
2. 포인터 연산자
3. 함수(Function)
4. 구조체

1. 배열

1-1. 개념

* 동일한 형식(type)의 데이터를 둘 이상 다뤄야 할때 사용
* 여러 데이터를 하나의 식별자로 관리
* 연속적인 공간에 데이터(요소)가 생성되고, 첨자를 통해 위치를 탐색
* 서로 다른 형식의 데이터를 하나의 배열에 담을 순 없다

1-2. 배열의 선언과 초기화

#include <stdio.h>

int main(){

    // 5칸 배열 생성후 데이터 초기화
    int ar[5] = {1, 3, 5, 6, 8};

    // 5칸 배열 생성후 첫데이터를 0, 나머지 0으로 데이터 초기화
    int ar2[5] = {0}

    return 0;
}
1. 배열의 선언
    * <타입> <식별자> [<데이터 개수>]
2. 배열의 초기화
    * 선언과 동시에 초기화하지 않으면 각 데이터를 하나하나 초기화 해야한다

1-3. 배열명과 첨자

#include <stdio.h>

int main(){

    // 5칸 배열 생성후 데이터 초기화
    int ar[5] = {1, 3, 5, 6, 8};

    // ar 배열의 1번째 데이터의 주소 출력
    print("%d", ar+1);  // 3

    return 0;
}
1. 주소상수
    * 배일명은 변수명처럼 데이터를 할당할수 없는 상수
    * 연속적으로 나열되어 있는 배열 데이터의 시작 주소값이다
    * 배열은 이 주소값을 시작 지점으로 하여 다음 데이터들에 접근
2. 포인터 연산
    * 동일한 간격(타입)으로 데이터가 나열되어 있는 배열의 특징을 이용한 연산
    * 주소가 지정되는 단위크기는 무조건 1byte, 각 데이터의 첫번째 byte를 대표 주소값으로 지정
3. 첨자(index)
    * 배열의 여러 데이터들 중 원하는 위치에 접근하기 위한 정수값
    * 1이 아닌 0부터 시작하며, 음수첨자는 존재하지 않음

1-4. 배열의 활용

#include <stdio.h>

int main(){

    // 2행 3열 배열 생성
    int arr1[2][3] = {1, 2, 3, 4, 5, 6};

    // 3개 요소중 각각 2개 요소를 초기화
    int arr2[2][3] = {{1,2}, {4,5}};

    return 0;
}
1. 2차원 배열
    * 배열의 요소로 다른 배열이 할당되어 있는 구조를 말한다
    * 2개의 대괄호와 첨자로 선언하며 접근
    * 중괄호를 중첩하여 데이터를 초기화
    * 중괄호를 중첩하지 않으면 배열의 순서에 맞춰 초기화를 진행
#include <stdio.h>

int main(){

    // 반복용 변수, 배열생성
    int i, ar[5];

    // 0부터 4까지 반복
    for(i=0;i<5;i++){
        ar[i] = i+1; // 1,2,3,4,5
    }

    return 0;
}
2. for문 활용
    * for문을 이용해서 배열 할당, 출력 등을 반복할수 있다
    * 배열의 첨자 위치에 변수를 삽입하여 활용
    * 첨자는 0부터 시작한다는 점에 주의하여 for문을 설정

2. 포인터 연산자

2-1. 개념

* 기억장치에 저장된 데이터를 참조할때, 식별자가 아닌 주소값으로 접근할수 있는 연산자
* 복사된 데이터를 가공하는 것이 아닌, 데이터 원본을 가공할수 있다
* 주소값을 사용하기 때문에 포인터 연산이 가능하다
* 데이터 식별자 앞에 '&'을 붙이면, 해당 데이터의 주소값을 알수있다
* 포인터 변수 앞에 '*'을 붙이면 해당 주소의 데이터를 사용할수 있다

2-2. 포인터 변수

#include <stdio.h>

int main(){

    // 정수형 변수
    int data = 10;

    // 포인터 변수
    int *p;

    // 포인터 변수에 data 변수의 주소값 할당
    p = &data;

    // p에 저장된 주소값(data주소) 위치로 접근하여 20 할당
    *p = 20;

    return 0;
}
* 포인터 변수는 주소값을 저장하며, 타입이 달라도 크기가 동일
* <참조할 데이터 타입> *<식별자>
* <포인터 변수> = &<데이터변수>
* *<포인터 변수> = <값>

2-3. 배열과 포인터

#include <stdio.h>

int main(){

    int ar[5] = {1,2,3,4,5};
    int *pr;

    // ar은 주소상수이므로 &붙일 필요없음
    pr = ar;

    // ar배열의 3번째 값 출력
    printf("%d", ar[2]);    // 3

    // pr배열의 3번째 값 출력
    printf("%d", pr[2]);    // 3

    // pr배열의 3번째 값 출력
    printf("%d", *(pr+2));    // 3

    return 0;
}
* 배열이름은 주소상수이기 때문에 주소값 재할당이 불가능
* 포인터 변수는 주소값 재할딩이 가능하고 포인터 연산도 가능
* 배열주소를 포인터 변수에 할당하면 포인터 이름으로도 배열을 제어할수 있다

3. 함수(Function)

3-1. 함수의 개념

* 기능별로 구분하여 반복적으로 재사용할수 있도록 작성한 작은 프로그램
* main 함수 블록 바깥에서 정의하고, 블록안에서 호출하여 사용
* 함수가 호출되면 현재 프로그램의 진행을 잠시 멈추고, 호출된 함수가 진행된뒤에 다시 프로그램 진행
* 함수 호출시 계산에 필요한 인수를 전달

3-2. C언어 표준 라이브러리

1. stdio.h: 데이터 입출력에 사용하는 기능
    * printf(): 출력
    * scanf(): 입력
2. math.h: 수학 함수들에 제공
    * sqrt(): 제곱근
    * pow(): 제곱수
    * abs(): 절대값
3. string.h: 문자열 처리에 사용되는 기능
    * strlen(): 문자열 길이
    * strcpy(): 문자열 복사
    * strcmp(): 문자열 비교
4. stdlib.h: 자료형 변환, 난수발생, 메모리할당에 사용되는 기능
    * atio(): 문자열을 정수타입으로 변환
    * atof(): 문자열을 실수타입으로 변환
    * rand(): 난수 발생
5. time.h: 시간처리에 사용되는 time, clock 기능 제공

3-3. return

#include <stdio.h>

// 두수의 합
int add_value(int a, int b){
     int c = a + b;
     return c;
 }

int main(){

    int k;

    k = add_value(5,10); // 15

    printf("%d", k);

    return 0;
}
1. 리턴값이 있는 함수의 정의와 호출
    * 함수의 결과를 호출위치로 돌려받는 방식의 함수
    * <결과값의 타입> <함수명> (<[매개변수]>) 형식으로 헤더 정의
#include <stdio.h>

// 두수의 합
void add_value(int a, int b){
     int c = a + b;

     printf("%d", c);

     return ;
 }

int main(){

    add_value(5,10); // 15

    return 0;
}
2. 리턴값이 없는 함수의 정의와 호출
    * 함수의 결과를 돌져주지 않는 방식의 함수
    * <void> <함수먕> (<[매개변수]>) 형식으로 헤더 정의

3-4. 참조에 의한 매개변수 전달(Call By Reference)

#include <stdio.h>

void fa(int x, int *y){

    // x의 값에 5 증가
     x = x + 5;

    // y에 저장된 주소값 위치로 접근하여 5 증가
     *y = *y + 5;
 }

int main(){

    int n = 10, k = 20;

    fa(n, &k);

    printf("%d %d", n, k); // 10, 25

    return 0;
}
* Call By Value: 함수에 인수를 전달하여, 원본값이 복사되어 매개변수에 전달
* 원본값을 변경하기 위해서 주소값과 포인터를 이용하여 함수를 정의
* 주소값을 인수로 전달, 매개변수에 포인터 변수를 지정

4. 구조체

4-1. 개념

* C언어에서 이미 제공되는 자료형을 이용하여 새로운 자료형을 만드는 것
* 배열과 달리 서로 다른 형식의 데이터를 하나의 이름과 형식으로 구성
* 기존에 없었던 새로운 구조를 사용해야 하기 때문에 구조를 먼저 정의하고, 데이터를 선언하여 사용

4-2. 구조체 정의

* 함수처럼 main 함수 블록 바깥에서 블록구조로 정의
* <struct> <타입 식별자> {<변수 선언>}

4-3. 구조체 변수 선언

#include <stdio.h>

// studnet 구조체 정의
struct student{
    int no;
    int score;
    char grade;
}

int main(){

    // student 타입의 변수생성과 초기화
    struct student kim = {3021, 94, 'A'};
    struct student jane = {2113, 86, 'B'};

    // 구조체 변수 데이터 재할당
    jane.score = 82;

    return 0;
}
* 정의된 구조체 형식으로 사용될 변수를 선언하는 작업
* <struct> <타입 식별자> <변수 식별자> = {<초기값>, <초기값>, ...} 형태로 선언 및 초기화

참고자료 : 이기적 환상콤비 정보처리기사

728x90

'자격증 > 정보처리기사' 카테고리의 다른 글

객체지향 개발 절차  (0) 2022.07.10
객체지향 기술  (0) 2022.07.07
C언어 선택 및 반복 제어문  (0) 2022.07.06
C언어 특징 및 입출력  (0) 2022.07.06
분산 데이터베이스 설계  (0) 2022.07.05