일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- git
- 생활코딩
- github
- 렛츠기릿자바스크립트
- 프론트엔드
- 세로메뉴바
- 자바스크립트
- web
- 실기
- 코드공유
- 웹디자인기능사실기
- 비전공자
- HTML
- 웹퍼블리셔
- 정보처리기사
- 타입스크립트
- 리액트
- PROJECT
- 웹디실기
- Supabase
- CSS
- 연산자
- jQuery
- 깃
- 웹디자인기능사
- 코딩독학
- JS
- JavaScript
- 슬라이드전환
- react
Archives
- Today
- Total
코딩하는라민
[정처기 실기] 프로그래밍 언어 활용 - 배열과 포인터 본문
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 는 같다.
📌 배열과 포인터
- 배열은 연속된 메모리 공간에 할당되는 데이터의 모음
- 포인터는 메모리 주소를 저장하는 변수. 상황에 따라 그 값(가리키는 주소)을 변경할 수 있다.
- 배열 이름은 배열의 첫 번째 요소를 가리키는 포인터
- 배열 요소는 포인터 산술 연산을 통해 간단하게 접근할 수 있음
- 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
반응형
'자격증 공부 > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] 소프트웨어 보안 설계, 공격 기법 (39) | 2023.09.20 |
---|---|
[정보처리기사 실기] 공통 모듈 (57) | 2023.09.19 |
[정보처리기사 실기] 개발환경 구축, 형상관리 (0) | 2023.09.19 |
[정처기 실기] 프로그래밍 언어 활용 - 자료형, 식별자, 연산자 (0) | 2023.04.19 |
[정처기] 2023 정보처리기사 일정 & 출제기준/목차 (0) | 2023.04.01 |