본문 바로가기

2021 정보처리기사/참고자료: 정보처리기사

[C언어 기초] C언어 배열, 포인터

728x90
반응형

#C언어의 배열

개요

✔ 여러 데이터를 연속적인 공간에 나열하고, 해당 위치들을 첨자(Index)로 탐색

✔ 하나의 식별자로 같은 타입의 여러 데이터를 제어할 수 있다

 

 

 

선언

✔ 변수명 작성 규칙과 동일한 규칙 적용

✔ <타입><식별자>[<데이터개수>];

 

 

 

초기화

✔ <타입><식별자>[<데이터개수>] = {<값>, <값>, ...}

✔ 일부분만 초기화되는 경우 나머지는 0으로 초기화

✔ 선언과 동시에 초기화 해주는 것이 좋다.

✔ 초기화를 별도로 하는 경우, 하나씩 초기화 해야 함

 

 

#include <stdio.h>
int main()
{
     	//5칸 배열 생성 후 1, 6, 4, 5, 3으로 데이터 초기화
   	 int ar[5] = {1, 6, 4, 5, 3};
    
  	//5칸 배열 생성 후 모두 0으로 데이터 초기화
  	  int ar[5] = {0, 0, 0, 0, 0};
    
   	//5칸 배열 생성 후 첫 데이터를 0, 나머지를 0으로 데이터 초기화
   	 int ar[5] = {0};
    
   	 return 0;
}

 

 

 

주소상수

✔ 배열은 여러 데이터를 연달아 가지는 구조이기 때문에 배열이름 + 인덱스가 반드시 필요하다

✔ 배열 이름은 배열 데이터의 첫번째 주소값을 가지고 있고, 변경할 수 없다(상수)

✔ 주소 상수에 인덱스만큼 포인터 연산이 진행되면서 각각의 데이터가 접근할 수 있게 된다

 

 

#include <stdio.h>
int main()
{
     	// 5칸 배열 생성 후 1, 6, 4, 5, 3으로 데이터 초기화
   	 int ar[5] = {1, 6, 4, 5, 3};
    
  	// 배열이름 값(주소) 출력
  	 printf("%d \n", ar);
    
   	// ar배열의 1번째 데이터의 주소 출력(4만큼 증가한 주소값이 출력됨)
   	 printf("%d \n", ar+1);
    
    
  	// ar배열의 1번째 값 출력(인덱스가 0부터 시작하므로 여기서는 6이 출력된다)
   	printf("%d \n", ar[1]);
     
   	 return 0;
}

 

 

포인터 연산

✔ 접근하려는 데이터의 간격 단위로 주소값을 증가시켜주는 연산

 

✔ 예를 들어 주소가 지정되는 단위는 1바이트(byte)지만, 정수의 크기는 4byte 이므로 만약 첫번째 데이터 주소값이 100이라면, 나란히 붙은 데이터 주소값은 104가 된다. 첫번째와 두번째 데이터 주소값의 간격이 4byte이므로 이 간격만큼 주소가 증가되는 것

 

✔ 주소값 + N: N번째 데이터 주소값(ex. 100+1 = 101이 아니라 104가 된다)

 

 

포인터 연산자

✔ 데이터 주소값으로 직접접근이 가능한 연산자

✔ 데이터 원본 가공 가능, 포인터 연산 가능

✔ 포인터 변수는 값이 아닌 주소를 저장한다

 

<참조데이터타입> *<식별자>: 포인터 변수 선언

<포인터 변수> =&<데이터 변수>: 데이터 주소값 할당

*<포인터변수> = <값>: 포인터 변수가 가리키는 데이터 공간에 값을 할당

 

#include <stdio.h>
main(){

    // 정수형 변수 생성
    int date = 10;

    // 포인터 변수 생성
    int *p;

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

    // p가 가리키는 공간에 20을 할당한다
    *p = 20;

    // data 값 출력
    printf("%d \n", data);

    // p에 저장된 주소값(data주소)위치의 값 출력
    printf("%d \n", *p);

    // p에 저장된 주소값(data주소)출력
    print("%d \n", p);
    
}

 

 

 

배열과 포인터

✔ 배열 이름은 주소상수기 때문에 주소값 재 할당 불가능

 

✔ 포인터 변ㅅ에 배열 이름을 할당하여 포인터 연산 가능

 

✔ 배열 주소를 포인터 변수에 할당하여 배열 제어 가능

 

 

#include <stdio.h>
int main()
{
    int ar[5] = {1, 6, 4, 5, 3};
    int *pr;

    // ar(배열명)은 주소상수이므로 &을 붙일 필요 없음
    pr = ar;

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

    // pr에 저장된 주소값(ar배열)위치의 2번째 값을 출력
    printf("%d \n", pr[2]);

    // pr에 저장된 주소값(ar배열)위치의 2번째 값을 출력
    printf("%d \n", *(pr+2));

    return 0;
}

 

 

 

 

첨자(Index)

✔ 배열 요소 중 원하는 위치에 접근하기 위해 사용된다

 

✔ 첫 위치는 1이 아닌 0으로 시작

 

✔ <배열이름>[<첨자>]

 

 

 

for 문 활용

✔ for문을 이용하여 배열 할당, 출력 반복

 

✔ 인덱스 위치에 반복용 변수 활용

 

✔ 시작값과 종료값 설정에 주의(0부터 시작)

 

#include <stdio.h>
int main()
{
    //반복용 변수와 배열 생성(초기화 안됨)
    int i, ar[5];
    //0부터 4까지 반복(초기화)
    for(i=0; i<5; i++)
      //ar[0] = 1;
      //ar[1] = 2;
      //ar[2] = 3;
      //ar[3] = 4;
      //ar[4] = 5;
    ar[i] = i+1;
    //0부터 4까지 반복(출력)
    for(i=0; i<5; i++);
    printf("%d", ar[i]);
    return 0;
}

 

 

 

 

자료출처: 유튜브 주간컴공TV

728x90