티스토리 뷰

[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 100번지        
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 10
9
100번지  
int *C = &B; C &B
(101번지)
B 쓰레기값
10
30
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 10
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] 2
4
101번지  
      a[2] 4
3
102번지  
      a[3] 8
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] 20
100
101번지  
      a[2] 30 102번지  
      a[3] 200 103번지  
int *p = a; p a의주소
100번지
  a[0]    
p++; 101번지   a[1]    
*p++ = 100; 102번지   a[2]   * 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 2
5
3
10
30
4
int *pt = num; pt는 num의 주솟값 (n[0]) pt       
pt++ pt = pt+1 (n[1]을 가리킴)   pt       
*pt++ = 5; pt의 값 n[1]에 5를 넣고 pt= pt+1     pt   
*pt++ = 10; pt의 값 n[2]에 10을 넣고 pt= pt+1       pt 
pt--; pt= pt-1 (n[2)])     pt   
*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

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함