코딩하는라민

[정처기 실기] 프로그래밍 언어 활용 - 배열과 포인터 본문

자격증 공부/정보처리기사

[정처기 실기] 프로그래밍 언어 활용 - 배열과 포인터

코딩하는라민 2023. 4. 19. 00:38
728x90
반응형

[정처기 실기] 프로그래밍 언어 활용 - 배열과 포인터

 

 

📌 데이터 타입

✏️ 데이터 타입 유형

유형 파이썬 자바 C언어
불린
Boolean
참 : true
거짓 : false
참 : True
거짓 : False
-
문자
Character
데이터 유형을 명시적으로 선언할 필요가 없다.

변수에 할당한 값을 기반으로 변수의 데이터 유형을 유추.
(동적으로 유형이 지정됨)
char char
문자열 타입
String
String char [ ]
정수 타입
Integer
int int
부동 소수점
Floating Point
float, double float, double

 

📌 배열

같은 타입의 변수들로 이루어진 연속된 공간

✏️ 1차원 배열(Array)

  C언어 자바
초기값이 없는 경우 타입 배열명[요소개수]; 타입 [ ]배열명 = new 타입[요소개수];
타입 배열명[ ] = new 타입[요소개수];
초기값이 있는 경우 타입 배열명[요소개수] = { 초깃값 }; 타입 [ ]배열명 = { 초깃값 };

 

⏩ C언어

  • 초기값이 명시되어 있지않은 값들은 자동으로 0으로 초기화
int a[5] = {1, 2};

int i;
for(i=0; i<5; i++)
    printf("%d\n", a[i]);
    
// 1
// 2
// 0
// 0
// 0
  1 2 0 0 0  
  a[0] a[1] a[2] a[3] a[4]  

 

⏩ 자바

  • 초기값을 설정하지 않은 경우 문자열은 NULL 이 저장되어 있다.
  • 배열의 크기는 length 속성으로 구한다.
int []a = new int[3];

System.out.println(a.length);

// 3

 

✏️ 2차원 배열(Array)

  C언어 자바
초기값이 없는 경우 타입 배열명[행 개수][열 개수]; 타입 [ ][ ]배열명 = new 타입[행 개수][열 개수];
타입 배열명[ ][ ] = new 타입[행 개수][열 개수];
초기값이 있는 경우 타입 배열명[행 개수][열 개수] = { 초깃값 }; 타입 [ ][ ]배열명 = { {초깃값}, {초깃값}, ... };

 

⏩ C언어

int a[2][3] = {1, 2, 3, 4, 5};

int i, j;
for(i=0; i<2; i++){
    for(j=0; j<3; j++){
        printf("%d ", a[i][j]);
    }
}
// 1 2 3 4 5 0
  1 2  
  a[0][0] a[0][1]  
  3 4  
  a[1][0] a[1][1]  
  5 6  
  a[2][0] a[2][1]  

 

⏩ 자바

int [][]a = new int[3][2];
System.out.println(a.length); // a 배열의 행 개수
System.out.println(a[0].length); // a[0] 배열의 개수
// 3
// 2
  • ln : 줄바꿈
int [][]a = {{1, 2, 3}, {5}, {6, 7}, {9}};

System.out.println(a.length); // a 배열의 행의 개수
System.out.println(a[0].length); // a[0] 배열 개수
System.out.println(a[1].length);
System.out.println(a[2].length);
System.out.println(a[3].length);

// 4
// 3
// 1
// 2
// 1

 

📌 포인터

✏️ 포인터란?

  • 변수의 주솟값(위치)을 저장하는 공간으로 해당 변수의 값을 참조할 수 있게 해준다.
  • &(ampersand) : 메모리의 주소를 반환하는 address-of 연산자
  • *(dereference operator) : 포인터가 참조하는 주소에 저장된 값을 참조하는 연산자.
  • 데이터타입* 포인터변수명 = &변수명;
int r = 3;
int *n = &r; // s를 초기화하여 t의 주소를 보유한다.

 

    10    
    r    
    r 의 주소    
  • &r : r의 메모리 주소
  • *n : n이 가리키는 메모리 주소(&r)에 저장된 을 제공 → r의 포인터
  • &r 과 *n는 같지 않다. &은 r의 주소를 나타내기 때문.
  • r과 *n 는 같다.

 

📌 배열과 포인터

  1. 배열은 연속된 메모리 공간에 할당되는 데이터의 모음
  2. 포인터메모리 주소를 저장하는 변수. 상황에 따라 그 값(가리키는 주소)을 변경할 수 있다.
  3. 배열 이름은 배열의 첫 번째 요소를 가리키는 포인터
  4. 배열 요소는 포인터 산술 연산을 통해 간단하게 접근할 수 있음
  5. 2차원 배열은 일반적으로 1차원 배열의 배열로 표현되며, 각 행이 1차원 배열이 됨

 

✏️ 1차원 배열과 1차원 포인터

int r[4] = {1, 2, 3};
int *s = r;
r[4] 1 2 3
r[0] r[1] r[2]
*s = r
포인터 변수 s 는 r의 주소값을 향한다.
즉, s 의 주소값과 r의 주소값은 같은 주소값이다.
각각의 주소값은 &r[0], &r[1], &r[1] 으로 표현 가능하다.
주소값 r (r+1) (r+2)
  ⬆️ ⬆️ ⬆️
포인터 r이 가리키는
주소값
s (s+1) (s+2)
s 의 값이라는 것은 결국은 r의 값을 나타낸다. (*s = r 이기 때문에)
포인터 r이 가리키는
주소에 해당하는 을 나타냄
*s *(s+1) *(s+2)
  • 포인터가 가리키는 값과 배열의 값은 같지만, 이 둘의 개념은 다르기 때문에 완전히 같다고 볼 수 없다.
    • 배열의 이름은 배열의 시작 주소를 가리킨다. 배열 요소의 값은 해당 요소의 인덱스로 접근 가능하다.
    • 포인터는 메모리 주소를 저장하는 변수. 다른 변수의 주소를 가리키도록 할당된다.
    • 포인터 변수가 가리키는 값은 해당 주소에 있는 값.
    • 포인터는 상황에 따라 그 값(가리키는 주소)을 변경할 수 있다.
  • r = &r[0] = s
  • r[0] = *r

 

int r[3] = {4, 5};
int* s = r;  // *s와 r은 동일하다.

printf("%d %d $d\n", r[0], r[1], r[2]);
printf("%d %d $d\n", *r, *(r+1), *(r+2));
printf("%d %d $d\n", s[0], s[1], s[2]);
printf("%d %d $d\n", *s, *(s+1), *(s+2));

// 4 5 0
// 4 5 0
// 4 5 0
// 4 5 0
  • \n : 줄바꿈
  • *r : r 이 가리키는 값
  • *(r+1) : r+1 이 가리키는 값
  • *(r+2) : r+2 이 가리키는 값

 

✏️ 2차원 배열과 1차원 포인터

int r[3][2] = {1, 2, 3, 4, 5, 6};
int* s = r[1];
  • r 배열의 1번지 주소를 s 라는 1차원 포인터 변수에 저장
  *r[0]  1 
r[0][0]
= *(s-2)
 2 
r[0][1]
= *(s-1)
  r[0] &r[0][0] &r[0][1]
*s *r[1]  3 
r[1][0]
= *s
 4 
r[1][1]
= *(s+1)

 s  ➡️ r[1] &r[1][0] &r[1][1]
  *r[2]  5 
r[2][0]
= *(s+2)
 6 
r[2][1]
= *(s+3)
  r[2] &r[2][0] &r[2][1]
  • r[0] : 첫 번째 행의 주소, r 과 동일
  • &r[0][0] : r 배열의 첫 번째 요소인 r[0][0] 의 주소를 나타내며, 포인터 변수에 저장할 수 있다.
  • *r[0] : r[0]의 첫 번째 요소인 r[0][0]을 나타냄
  • r[0][0] : 해당 주소에 저장된 값 자체를 나타냄
  • r+1 = r[1] = &r[1][0] = s
  •  *r[1] = r[1][0] = *s

 

int r[3][2] = {1, 2, 3, 4, 5, 6};
int* s = r[1];

printf("%d %d $d\n", *r[0], *r[1], *r[2]);  // r[ ] 형태 : 1차원 포인터
printf("%d %d $d\n", **r, **(r+1), **(r+2));  // r 형태 : 2차원 포인터

printf("%d %d %d $d\n", *(s-1), *s, *(s+1), *(s+2));
printf("%d %d %d $d\n", s[-1], s[0], s[1], s[2]);

// 1 3 5
// 1 3 5
// 2 3 4 5 
// 2 3 4 5
더보기
  • s[-1] == r[0][1] == 2
    s[0] == r[1][0] == 3
    s[1] == r[1][1] == 4
  • *(s-1) == r[0][1] == 2
    *s == r[1][0] == 3
    *(s+1) == r[1][1] == 4
  • ** : 이중 포인터. 포인터를 가리키는 포인터
    **r == r[0][0]
    **(r+1) == r[1][0]
    **(r+2) == r[2][0]

 

✏️ 2차원 배열과 포인터 배열

int r[3][2] = {1, 2, 3, 4, 5, 6};
int* s[3] = {r[1], r[0], r[2]};
  *r[0] 1
r[0][0]
2
r[0][1]
s[1] ➡️ r[0] &r[0][0] &r[0][1]
  *r[1] 3
r[1][0]
4
r[1][1]
s[0] ➡️ r[1] &r[1][0] &r[1][1]
  *r[2] 5
r[2][0]
6
r[2][1]
s[2] ➡️ r[2] &r[2][0] &r[2][1]

 

printf("%d %d %d\n", r[0][0], r[1][0], r[2][0]);
printf("%d %d %d\n", *r[0], *r[1], *r[2]);
printf("%d %d %d\n", s[0][0], s[1][0], s[2][0]);
printf("%d %d %d\n", *s[0], *s[1], *s[2]);

// 1 3 5
// 1 3 5
// 3 1 5
// 3 1 5

 

✏️ 2차원 배열과 2차원 포인터

int r[3][2] = {1, 2, 3, 4, 5, 6}
int (*s)[2] = r+1; int (*g)[2] = r
    1
r[0][0]
2
r[0][1]
 g  ➡️ r[0]    
    3
r[1][0]
4
r[1][1]
 s  ➡️ r[1]    
    5
r[2][0]
6
r[2][1]
  r[2]    

 

r : 2차원 배열을 나타내는 포인터 상수

r[0] : r의 첫번째 행을 나타내는 포인터

*g : r의 첫번째 행을 나타내는 포인터. r[0]과 같다.

*s : r의 두 번째 행을 나타내는 포인터

printf("%d %d\n", r[0][1], r[1][0]);
printf("%d %d\n", s[1][0], g[1][0]);

// 2 3
// 5 3
  • int (*s)[2] = r+1;
    2열짜리 배열.
    r+1 부터 시작. 즉, 3부터 시작된다.
    s[0][0] == 3, s[0][1] == 4, s[1][1] == 5
  • int (*g)[2] = r;
    2열짜리 배열.
    r부터 시작. 즉, 1부터 시작된다.
    g[0][0] == 1, g[0][1] == 2, g[1][0] ==3

 

✏️ 1차원 배열과 문자열

  • 배열 마지막에 NULL 문자가 삽입된다.
  • 초기화하는 글자수보다 1 이상 큰 값을 배열로 선언해야 함
  • 출력하면 시작 주소부터 NULL 전까지 읽음
char t[6]="ramin";
r a m i n NULL
&t[0] &t[1] &t[2] &t[3] &t[4] &t[5]

 

printf("%s\n", t);
printf("%s\n", t+2);

// ramin
// min

 

✏️ 2차원 배열과 문자열

char g[2][6] = {"ramin", "coding"};
r a m i n NULL  
&g[0][0] &g[0][1] &g[0][2] &g[0][3] &g[0][4]    
g[0]+0 g[0]+1 g[0]+2 g[0]+3 g[0]+4    
c i d i n g NULL
&g[1][0] &g[1][1] &g[1][2] &g[1][3] &g[1][4] &g[1][5]  
g[1]+0 g[1]+1 g[1]+2 g[1]+3 g[1]+4 g[1]+5  

 

printf("%s %s\n", g[0], g[1]);
printf("%s %s\n", g[0]+1, g[1]+2);

// ramin coding
// amin ding

 

 

 

 

 

 


참고 : 수제비2022 실기 교재, 이해안돼서 본 유튜브 강의

  등을 공부하고, 간단하게 정리한 내용입니다. 잘못된 부분이나 문제되는 점이 있으면 댓글 부탁드립니다.

728x90
반응형