본문 바로가기
깨알 c언어

깨알 c언어 ch.21 ~ 25

by moca7 2024. 2. 22.

21. 배열(1)

22. 배열(2)

23. 포인터

24. scanf와 변수

25. 배열과 포인터(1)

 

 

 

21. 배열(1)

 

ㅁ 배열의 정의

- 배열이란 같은 자료형을 가진 연속된 메모리 공간으로 이루어진 자료구조.

- 배열이란 같은 자료형의 변수를 연속적으로 묶어 놓은 저장공간.

 

- 변수라는 건 자료형(크기)이 있음. char는 1바이트, int는 4바이트. 같은 크기의 변수들 연속적으로 묶어놓은 거.

 

ㅁ 배열의 종류

- 1차원 배열.  int array[5]             (1차원 배열은 1개의 행을 가진 배열이다)

- 2차원 배열.  int array[4][3]         (4행 3열)      (행과 열로 이루어져 있으면 2차원 배열) (개수는 12개)

- 3차원 배열.  int array[2][3][4]     (2면 3행 4열)

 

ㅁ 배열은 0부터 시작하며 반복문과 함께 사용이 가능하다. 

 

ㅁ 배열의 선언

- int a [5]; 

자료형, 배열명, 개수

 

- c언어와 자바언어는 0부터 시작함. 

a[0] a[1] a[2] a[3] a[4] 

 

첫번째 시작하는 메모리 상의 주소가 100번지이면 그게 (물리적인) 메모리의 주소값이다.

 

- int a [5] ; 

a[0] = 10; a[2] = 20; a[6] = 60;

 

a[0] a[1] a[2] a[3] a[4]

10           20                   <- a[6]은 없으므로 오류가 발생함.

 

ㅁ 2차원 배열

- 같은 자료형의 변수를 행과 열의 연속적인 공간으로 묶어 놓은 것

int a [2] [3];

 

             0열       1열          2열

 0행   a[0][0]    a[0][1]    a[0][2] 

 1행   a[1][0]    a[1][1]    a[1][2] 

 

근데 메모리 상에는 행과 열로 저장 안되고 1차원 배열구조(한 행)로 저장이 됨. 

a[1][0]이 a[0][2] 다음으로 감. 

인간이 보기 편하게 2차원 배열로 만들어 놓은 것 뿐. 

 

ㅁ 문제

 

1) msg[2]는 l이다. l은 !가 아니므로 while 반복문 수행.

2) a, e, i, o, u면 number를 늘리고, i를 늘린다. a, e, i, o, u가 아니라면 number를 늘리지 않고 i만 늘린다.

3) msg[2]는 l이므로 number=0, i=3

4) msg[3]은 l이다. l은 !가 아니므로 while 반복문 수행.

5) msg[3]은 l이므로 number=0, i=4

6) msg[4]는 o이다. o는 !가 아니므로 while 반복문 수행.

7) msg[4]는 o이므로 number=1, i=5

8) msg[5]는 공백이다. 공백은 !가 아니므로 while 반복문 수행.

9) msg[5]는 공백이므로 number=1. i=6

10) msg[6]은 W다. W는 !가 아니므로 while 반복문 수행.

11) msg[6]은 W이므로 number=1, i=7

12) msg[7]은 o다. o는 !가 아니므로 while 반복문 수행.

13) msg[7]은 o이므로 number=2, i=8

14) msg[8]은 r이다. r은 !가 아니므로 while 반복문 수행.

15) msg[8]은 r이므로 number=2, i=9

16) msg[9]는 l이다. l은 !가 아니므로 while 반복문 수행.

17) msg[9]는 l이므로 number=2, i=10

18) msg[10]은 d이다. d는 !가 아니므로 while 반복문 수행.

19) msg[10]은 d이므로 number=2, i=11

20) msg[11]은 !이다. while 조건절이 거짓이되므로 while 반복문 수행하지 않는다. 

number=2 

 

 

22. 배열(2)

 

ㅁ 문제

 

1) i=0일 때, ch=str[5]=n, str[5]=n이 됨. str[0]=n이 됨.     현재 nation

2) i=1일 때, ch=str[4]=o, str[4]=a가 됨. str[1]=o가 됨.     현재 notian

3) i=2일 때, ch=str[3]=i, str[3]=t가 됨. str[2]=i가 됨.        현재 noitan

4) i=3일 때, ch=str[2]=i, str[2]=t가 됨. str[3]=i가 됨.        현재 notian

출력결과. notian

 

 

23. 포인터

 

ㅁ 포인터란 주소값을 가지고 있는 변수이다. 

 

ㅁ 포인터의 정의

- 메모리의 위치(주소값)를 표현한 기호

 

ㅁ 포인터 변수 선언

int *a                      <- a라는 변수를 선언. 근데 포인터 변수다. 주소값을 가지고 있다.

*a = 10;                   <- *이 붙으면 a의 값이다. a가 가지고 있는 (100번지) 주소값에 10이라는 값을 넣어라. 

printf("%d", a);         <- 10아님. 100임.

printf("%d", *a);        <- 이게 10이다. a의 값.

 

처음 선언할때만 *a하는 거고, 그 후로는 *가 붙으면 실제 값이다.

 

ㅁ 변수의 주소 찾기

int b = 10;

int *a;

a = &b;                     <- a의 값이 아닌, a의 공간(주소값)에 b의 주소값을 대입한다. 

printf("%d\n", *a);           <- 10          a가 가지고 있는 100번지 주소값의 실제값은 10이다. 

printf("%d\n", b);            <- 10

 

변수라는 건 사실 모두가 주소를 갖고 있음. 우리가 그냥 쓰지만. 100번지라고 임의로 생각.

 

앰퍼샌드 &를 쓰면 그 변수의 주소값을 뜻함.

 

printf("%d\n", a);           <- 100이라는 번지수를 출력함. 

 

ㅁ 문제

 

주소값(번지수)는 마음대로 잡으면 됨.

A는 실제값 10, 주소값 100

B는 주소값 200

포인터 변수 C. C의 실제 값은 B의 주소값 200

B의 실제값에 10 대입, 20더해서 30이 됨. 

 

포인터 변수 C의 실제값이 30인 이유. 

(1) int *C = &B

(2) int *C;     

     C=&B

위의 두 개가 같은 거다.  

포인터 변수를 최초로 선언할 때만, *를 써도 (실제값이 들어가는게 아니고) 주소를 할당할 수 있다

고로 int *C;     *C=&B하면 C의 실제값에 B의 주소값을 넣는 형태이기 때문에 이상한 결과가 나오게 됨. 

 

 

24. scanf와 변수

 

ㅁ scanf

- 사용자의 키보드로 입력받을 때 사용하는 함수

- 형식: scanf("%d", 변수의주소);

 

ㅁ scanf 사용법

- int a;

scanf("%d", &a);            <- 사용자가 123 등 입력한 값을, a라는 변수의 주소값에, 실제값을 입력받음.

printf("%d", a);

 

ㅁ [문] 다음 C 프로그램을 실행한 결과로 옳은 것은?

(단, 아래의 scanf() 함수의 입력으로 90을 타이핑 했다고 가정한다.)

 

scanf("%d", &a); 라고 해놓고 여기선 그냥 k. 이유는

그냥 변수가 아니라 포인터 변수기 때문에 그냥 k하면 그자체로 주소값을 뜻하니까. 

 

scanf로 k의 주소값에 90을 입력 받음. 주소값이 90이 되지 않음. 주소값은 메모리 상에 있는 거고 

그 주소값의 실제값에 90을 넣음. i랑 k는 같은 주소값에 있고. 

 

답은 90, 20, 90

 

 

25. 배열과 포인터(1)

 

ㅁ 포인터 변수, 배열 모두 주소값을 가지고 있음. 

 

ㅁ 문제

 

1) i=0일 때, 37 출력

2) i=1일 때, 47 출력

3) i=2일 때, 57 출력

4) i=3일 때, 67 출력

5) i=4일 때, 77 출력

 

a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 

10    20   30    40  50   60   70   80   90   100

 

a의 0번지이자 100번지. a의 1번지이자 101번지. 배열이라는 것은 물리적으로 연속된 공간이기 때문에. 

 

배열 a도 포인터처럼 그냥 a쓰면 주소값. 그냥 a에는 100번지라는 주소값이 들어감. 

그래서 a+3은 103번지를 뜻한다. 

 

ptr도 주소값을 뜻하기 때문에 ptr+0은 ptr의 1000번지에 0을 더한 1000번지가 된다. 

 

if의 증감식에 전위 연산이든 후위 연산이든 별 의미가 없다. 

 

'깨알 c언어' 카테고리의 다른 글

깨알 c언어 ch.31 ~ 35  (0) 2024.03.08
깨알 c언어 ch.26 ~ 30  (0) 2024.03.08
깨알 c언어 ch.16 ~ 20  (0) 2024.02.22
깨알 c언어 ch.11 ~ 15  (0) 2024.02.22
깨알 c언어 ch.6 ~ 10  (0) 2024.02.21