티스토리 뷰
AI/정보처리기사(C언어)
[정보처리기사 실기] C언어 총 정리(4) - 2차원 배열과 포인터, 포인터 배열, 배열 포인터, 구조체
brave_sol 2024. 5. 19. 22:58[29,30강] 2차원 배열과 포인터
* 배열 : 물리적으로 연속 된 공간
*이차열 배열은 행의 대표 주소를 가지고 있다.
배열 | 배열 저장소 |
저장소에 등록 된 주소 | 값 | 주소 | |
int a[3][2] = {{1,2},{3,4},{5,6}}; | a → | a[0] → | a[0][0] 1행1열 | 1 | 100번지 |
3행 2열짜리 배열 a 생성 | a[0][1] 1행 2열 | 2 | 101번지 | ||
a[1] → | a[1][0] 2행 1열 | 3 | 102번지 | ||
a[1][1] 2행 2열 | 4 | 103번지 | |||
a[2] → | a[2][0] 3행 1열 | 5 | 104번지 | ||
a[2][1] 3행 2열 | 6 | 105번지 | |||
printf("%d\n", a) | a에는 a[0]의 주소값 저장 → 100번지 출력 | ||||
printf("%d\n", *a) | a에 주소값 에있는 a[0]에는 a[0][0]의 주소값 저장 → 100번지 출력 | ||||
printf("%d\n", **a) | a에 주소값 에있는 a[0]에 있는 a[0][0]의 주소의 값 → 1 출력 |
* 예시(1)
int data[ ][3] = {1,3,4,5,2,9,6,8,7}; | 3열 배열 data 생성 | data (100번지) |
1열 | 2열 | 3열 | |
data [0] 1행 (100번지) |
1 (100번지) |
3 (101번지) |
4 (102번지) |
|||
int *p = data[1]; | p → (103번지) |
data [1] 2행 (103번지) |
5 (103번지) |
2 (104번지) |
9 (105번지) |
|
int x,y; | data [2] 3행 (106번지) |
6 (106번지) |
8 (107번지) |
7 (108번지) |
||
x= *p; | 103번지의 값 x = 5 |
|||||
y = *(p+2); | 105번지의 값 y = 9 |
|||||
printf("x=%d, y=%d\n", x, y) | x = 5, y = 9 |
* 예시(2)
int darr[3][3] ={{1,2,3},{4,5,6},{7,8,9}}; | 3행 3열 darr | darr 100번지 |
1열 darr[ ][0] |
2열 darr[ ][1] |
3열 darr[ ][2] |
|
int sum1, sum2; | 1행 100번지 darr[0][ ] |
1 (100번지) |
2 (101번지) |
3 (102번지) |
||
sum1=*(*darr+1) + *(*darr+2); | *(100번지+1)+ *(100번지+2) = 2+3 = 5 |
2행 103번지 darr[1][ ] |
4 (103번지) |
5 (104번지) |
6 (105번지) |
|
sum2=*darr[1]+*darr[2]; | 103번지의 값 4 +106번지의 값 7 =11 |
3행 106번지 darr[2][ ] |
7 (106번지) |
8 (107번지) |
9 (108번지) |
|
printf("%d,%d, sum1, sum2); | 5,11 출력 |
[31,32,33,34강] 포인터 배열
* 포인터 배열이란? 배열의 요소가 포인터(메모리주소)로 이루어진 것
* %s는 주소값을 받아서 null이 나올때까지 출력
char a[3] = {'a','b','c'}; | a → 100번지 | a[0] | a | 100번지 |
a[1] | b | 101번지 | ||
a[2] | c | 102번지 | ||
printf("%s\n", a); | 100번지의 문자열(%S)을 출력 *** null을 만날 때 까지 → abc출력 |
null |
* 예시(1)
char *c[ ] = {'aaa','bbb','bbb' }; | c → 100번지 | 100번지 | 20번지 100번지 |
30번지 101번지 |
40번지 102번지 |
20번지 | a | a | a | ||
30번지 | b | b | b | ||
40번지 | c | c | c | ||
printf("%s", *(c+1)); | c → 100번지 c+1 → 101번지 *(c+1) →101번지의 값 → 주소값 30번지, %s는 주소값의 문자열을 출력(null전까지) bbb |
* 예시(2)
char *array1[2] = {"Good morning", "C language" }; |
array1 → | 100번지 | 20번지 array1 [0] |
50번지 array1 [1] |
|||||||||||||
20번지 | G | o | o | d | m | o | r | n | i | n | g | ||||||
50번지 | C | l | a | n | g | u | a | g | e | ||||||||
printf("%s"\n, array1[0]+5); | morning | ||||||||||||||||
printf("%c"\n, *(array1[1]+6)); | u |
* %s는 주소값을 받아서 null이 나올때까지 출력
* 예시(3)
int a[2][3]= {{-3,14,5},{1,-10,8}}; |
a→100번지 | |||||||||
int *b[ ] = {a[0],a[1]}; | 100번지 a[0] |
-3 100번지 |
14 101번지 |
5 102번지 |
||||||
int *p=b[1]; | 103번지 a[1] |
1 103번지 |
-10 104번지 |
8 105번지 |
||||||
b → 200번지 | 100번지 | 103번지 | ||||||||
p → 103번지 | ||||||||||
printf("%d", *b[1]); | 103번지의 값 1 | |||||||||
printf("%d", *(++p)); | p+1 → 104번지의값 -10 | |||||||||
printf("%d", *(--p-2)); | p-1 → 103번지 -2 → 101번지의 값 14 |
* 예시(4)
int *arr[3]; | arr → 100번지 | arr[0] | 10번지 | 100번지 | ||||||
int a = 12, b=24, c=36; | arr[1] | 20번지 | 101번지 | |||||||
arr[0] = &a; | arr[2] | 30번지 | 102번지 | |||||||
arr[1] = &b; | a | 12 | 10번지 | |||||||
arr[2] = &c; | b | 24 | 20번지 | |||||||
c | 36 | 30번지 | ||||||||
printf("%d\n", *arr[1]+**arr+1); | 20번지의 값 24 + 100번지의 값 10번지의 값 12 + 1 = 37 |
[35강] 구조체, 포인터 이동
* 구조체란? 여러 변수들을 모아서, 하나의 객체를 구성할때 사용하는 사용자 정의 타입 객체
구조체 | 정의 후 사용 | 정의와 동시에 인스턴스 생성 | 포인터에 담음 . 대신 -> 사용 |
struct 구조체명 { 멤버변수 1; 멤버변수 2; } |
struct person { char *name; int age; }; struct person user1; user1.name = "h user"; printf("%s", user1, name); |
struct person { char *name; int age; } test; test.name = "h user"; test.age = 40; printf("%s : %d", test.name, test.age); |
struct person { char *name; int age; } struct person *p; p -> name = "test_2"; p -> age= 40; printf("%s : %d", p->name, p->age); |
*예시
문제 | 풀이 |
struct list { int *fp } data, *p int x[] = {100,200,300,400}; p= &data; p->fp= x+1; printf("%d", *(++p->fp)); |
data(100번지) : fp 가짐 p → 100번지 x → 200번지 p안에 있는 fp → data(100번지)안에있는 fp에 x+1에 201번지 주소 대입 따라서 ++(p->fp)이므로 p->fp 201번지 +1 = 202번지의 값 300출력 |
[36강] 배열 포인터
* 배열포인터란? 배열의 시작 주소값을 저장할 수 있는 포인터의 2차원 배열의 구조. 그냥 하나의 포인터일 뿐이다.
포인터인데 배열. 자기가 다시 잘라서 재조합함(논리적으로)
int (*in)[2]; | in이라는 포인터를 만들건데 어떤 구조가 들어오던 2개씩 자를거야 | ||||
int num[3]={1,2,3}; | num → 100번지 | 1 100번지 |
2 101번지 |
3 102번지 |
|
in = num | in 100번지 |
100번지 in[0] |
1 100번지 |
2 101번지 |
|
101번지 in[1] |
3 102번지 |
||||
printf("%d\n", in); | 100번지 | ||||
printf("%d\n", num); | 100번지 | ||||
printf("%d\n", *in); | 100번지의 값은 in[0] 이므로 100번지 |
||||
printf("%d\n", **in); | 100번지의 값 1 |
※ 출처 : 흥달쌤 C언어 29강~36강 https://youtu.be/wg4j5dtAP1E?si=PO9s7NFFc_W6S53l
※ 컴파일 사이트 : http://ideone.com
반응형
'AI > 정보처리기사(C언어)' 카테고리의 다른 글
[정보처리기사 실기] C언어 총 정리(6) static 변수, 재귀함수, 중복 재귀함수 (0) | 2024.05.21 |
---|---|
[정보처리기사 실기] C언어 총 정리(5) 함수와 변수의 유효범위 (0) | 2024.05.20 |
[정보처리기사 실기] C언어 총 정리(3) 배열과 포인터 (1) | 2024.05.18 |
[정보처리기사 실기] C언어 총 정리(2) 조건문, 반복문 (0) | 2024.05.17 |
[정보처리기사 실기] C언어 총 정리(1) 프로그래밍 기초 (2) | 2024.05.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 30분
- Ai
- Python
- 실기
- 루틴
- 갓생
- 오픽
- llm
- 스크랩
- 영어회화
- 티스토리챌린지
- ChatGPT
- 뉴스
- 프로그래머스
- 습관
- 아침운동
- 미라클모닝
- 아침
- 고득점 Kit
- 다이어트
- C언어
- SQL
- 오블완
- 줄넘기
- 빅데이터 분석기사
- 경제
- 운동
- opic
- 기초
- IH
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함