티스토리 뷰
[21,22강] 배열
* 배열이란? 같은 자료형(같은 크기를 가지는 ex. int랑 int)의 변수를 연속적으로 묶어 놓은 저장공간(주소값O)
물리적으로 연속된 공간!
- 배열의 선언 : 자료형 배열이름[열의 개수] ex. int a[5]
- 이차원 배열 : 같은 자료형의 변수를 행과 열의 연속적인 공간으로 묶어 놓은 것 ex. int a[2][3];
일차원 배열 | int a[5]; | a[0] a[1] a[2] a[3] a[4] | * a에는 a[0]의 물리적인 메모리의 주소값이 저장되어 있다. |
이차원 배열 | int a[2][3]; | a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] |
* 이해하기 위함이고, 실제 저장은 일차원으로 저장됨 |
[23강] 포인터
* 포인터(*)란? 메모리의 위치(주소값)를 표현한 기호
int *a | a라는 포인터 변수야~ 선언, 주소값을 가짐 | ex. a라는 공간에 100번지가 할당됨 a 값이 아님 |
printf("%d", a); 100번지 출력 |
|
*a=10 | a에 저장된 주소에 10이라는 값을 저장 | ex. 100번지에 가보면 10이 있음 | printf("%d",*a); 10이 출력 |
|
&a | a의 주소값 | ex. 100번지 |
* 변수의 주소찾기
입력 | 포인터 | 포인터에 할당된공간 |
변수명 | 변수값 | 변수주소 | 출력 |
int b =10; | b | 10 | 200번지 | |||
int *a; | a | |||||
a = &b; ***b메모리의 주솟값 | 200번지 | |||||
printf("%d\n", *a); | a에 저장된 주소에 있는 값 b의 주소값(200번지)저장됨 b의 값이므로 10이 출력 |
|||||
printf("%d\n", b); | b에 저장된 값이므로 10 출력 |
* 예시
입력 | 포인터 | 포인터에 할당된공간 |
변수명 | 변수값 | 변수주소 | 출력 |
int A = 10, B; *B에는 쓰레기값이 저장됨 |
A | 100번지 | ||||
int *C = &B; | C | &B (101번지) |
B | 10 |
101번지 | |
B = A--; | B=A를 하고 A=A-1 B=10, A=9 |
|||||
B +=20; | B= B+20 = 10+20=30 | |||||
printf("%d", *C); | C가 가르키는 주소의 값이므로 101번지에 저장된 값 30이 출력됨 |
[24강] scanf와 변수
* 전처리기 #include<stdio.h> 이 파일을 가지고 와라(input, output관련된 함수 모여있는 라이브러리)
* scanf("%d", 변수의 주소) : 사용자의 키보드로 입력받을 때 사용하는 함수
int a; | a라는 변수 선언 | 변수명 | 변수값 | 변수주소 |
scanf("%d", &a); | 입력받은 정수를 a주소값(100번지)에 저장 | a | scanf로 입력받은 값 |
100번지 |
printf("%d", a); | a의 값을 출력 | scanf로 입력받은 값 출력 |
* 예시
입력 | 포인터 | 포인터에 할당된공간 |
변수명 | 변수값 | 변수주소 | 출력 |
int i = 10; | i | 90 |
100번지 | |||
int j = 20; | j | 20 | 101번지 | |||
int *k = &i; k에 i의 주소값이 저장됨 |
k | &i (100번지) |
||||
scanf("%d", k); →90입력 | &i(100번지)에 입력값 90 저장 | |||||
printf("%d,%d,%d\n", i,j,*k); | 90, 20, k에저장된 주소값 (&i, 100번지)에 있는 값 90, 20, 90 |
[25,26,27,28강] 배열과 포인터
* 예시(1)
입력 | 배열/ 포인터 |
포인터에 할당된공간 |
변수명 | 변수값 | 변수주소 | 출력 |
int i; | i | 200번지 | ||||
int a[ ] | a | a[0]의 주소 (100번지) |
a[0] | 10 | 100번지 | * 실제로는 1씩 증가하진 않지만 이해하기 위함 |
a[1] | 20 | 101번지 | ||||
a[2] | 30 | 102번지 | ||||
a[3] | 40 | 103번지 | ||||
a[4] | 50 | 104번지 | ||||
a[5] | 60 | 105번지 | ||||
a[6] | 70 | 106번지 | ||||
a[7] | 80 | 107번지 | ||||
a[8] | 90 | 108번지 | ||||
a[9] | 100 | 109번지 | ||||
int *ptr = a+3; | ptr | a+3 a[0]+3번지 (103번지) |
* 이 값은 바꾼적이 없음 | |||
for (i=0; i<5; ++i) { printf("%d", *(ptr+i) -3)); } |
i=0, i<5 참, *(ptr+i)= (103번지+0)의 값 40-3=37출력 ++i = 0+1=1 i<5참, *(103번지+1)=104번지의 값 50-3 = 47 출력 ++i = 1+1 =2 2<5, 105번지값60-3=57 3<5, 67 출력 4<5, 77 출력 5<5 는 거짓이므로 for문 X |
* 배열과 포인터의 관계
입력 | 배열/ 포인터 |
포인터에 할당된공간 |
변수명 | 변수값 | 변수주소 | 출력 |
int a[5]; | a | 100번지 | a[0] | 100번지 | ||
a[1] | 101번지 | |||||
a[2] | 10 | 102번지 | ||||
a[3] | 103번지 | |||||
a[4] | 104번지 | |||||
int *b = a; | b | a=100번지 | ||||
printf("%d", a[2]); | 10 | |||||
printf("%d", b[2]); | b는 a를 가리키므로 100번지 102번지이므로 10 |
* 예시(2)
입력 | 배열/ 포인터 |
포인터에 할당된공간 |
변수명 | 변수값 | 변수주소 | 출력 |
int a[ ] = {1, 2, 4, 8} ; | a | a[0]의주소 100번지 |
a[0] | 1 | 100번지 | |
a[1] | 4 |
101번지 | ||||
a[2] | 3 |
102번지 | ||||
a[3] | 5 |
103번지 | ||||
int *p = a+1; | p | a+1 즉, a[1]의주소 |
p[0] | a[1]주소 101번지 |
||
p[1] | a[2]주소 102번지 |
|||||
p[2] | a[3]주소 103번지 |
|||||
p[3] | ? | |||||
p[1] = 3; a[1] = 4; p[2] = 5; printf("%d %d\n", a[1]+p[1], a[2]+p[2]); |
p[1]=a[2]=3 a[1]=4 p[2]=a[3]=5 a[1]+p[1]=a[1]+a[1]=4+4=8 a[2]+p[2]=a[2]+a[2]]=3+3=6 |
* 예시(3)
입력 | 배열/ 포인터 |
포인터에 할당된공간 |
변수명 | 변수값 | 변수주소 | 출력 |
int a[4] = {10,20,30}; | a | a[0]의주소 100번지 |
a[0] | 10 | 100번지 | |
a[1] | 100 |
101번지 | ||||
a[2] | 30 | 102번지 | ||||
a[3] | 200 | 103번지 | ||||
int *p = a; | p | |||||
p++; | ||||||
*p++ = 100; | * p의 값(a[1]=20)에 100할당 후 p=p+1 |
|||||
*++p = 200; | 103번지 | a[3] | p=p+1(103번지) 후 a[3](103번지)의 값에 200할당 |
|||
printf("a[0]=%d, a[1]=%d, a[2]=%d\n",a[0] ,a[1] ,a[2] ) |
10, 100, 30 출력 |
* 예시(4)
계속 풀다 보니까 포인터에 화살표로 표시해두면 편할 것 같다.
n[0] | n[1] | n[2] | n[3] | |||
int num[4] = {1,2,3,4}; | 1 | 5 |
30 |
4 | ||
int *pt = num; | pt는 num의 주솟값 (n[0]) | |||||
pt++ | pt = pt+1 (n[1]을 가리킴) | |||||
*pt++ = 5; | pt의 값 n[1]에 5를 넣고 pt= pt+1 | |||||
*pt++ = 10; | pt의 값 n[2]에 10을 넣고 pt= pt+1 | |||||
pt--; | pt= pt-1 (n[2)]) | |||||
*pt+++=20; | pt의 값에 pt=pt+20=30넣고 pt=pt+1 | pt ↑ | ||||
printf("%d %d %d %d", num[0], num[1], num[2], num[3]); |
num 배열을 출력 | 1 | 5 | 30 | 4 |
※ 출처 : 흥달쌤 C언어 21강~28강 https://youtu.be/wgdLUvIYprY?si=mTVNXnyP6IBW2sfw
※ 컴파일 사이트 : http://ideone.com
반응형
'AI > 정보처리기사(C언어)' 카테고리의 다른 글
[정보처리기사 실기] C언어 총 정리(6) static 변수, 재귀함수, 중복 재귀함수 (0) | 2024.05.21 |
---|---|
[정보처리기사 실기] C언어 총 정리(5) 함수와 변수의 유효범위 (0) | 2024.05.20 |
[정보처리기사 실기] C언어 총 정리(4) - 2차원 배열과 포인터, 포인터 배열, 배열 포인터, 구조체 (0) | 2024.05.19 |
[정보처리기사 실기] C언어 총 정리(2) 조건문, 반복문 (0) | 2024.05.17 |
[정보처리기사 실기] C언어 총 정리(1) 프로그래밍 기초 (2) | 2024.05.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 오블완
- 다이어트
- 갓생
- 오픽
- opic
- 빅데이터 분석기사
- 운동
- 고득점 Kit
- Python
- IH
- 습관
- Ai
- 줄넘기
- 루틴
- 기초
- 실기
- 아침
- 뉴스
- 스크랩
- llm
- 30분
- ChatGPT
- 경제
- SQL
- 영어회화
- C언어
- 프로그래머스
- 아침운동
- 미라클모닝
- 티스토리챌린지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함