11. array & pointer

22
Array & Pointers

Upload: -

Post on 19-May-2015

150 views

Category:

Documents


3 download

TRANSCRIPT

Array & Pointers

2

One-Dimensional Arrays§ Array

– 같은 이름의 변수를 사용하여 여러 개의 type이 같은 값을 표현할수 있게 하는 data type.

– num이라는 이름으로 10개의 int형 변수를 연속적으로 5개 할당

int num[5] ;

num

1000번지 1004 1008 1012 1016

3

One-Dimensional Arrays§ Array

– 각각의 변수에는 index를 사용하여 접근 한다. index = 0가 첫 번째원소를 의미 한다.

int num[5] ;

num[0] = 10 ;num[1] = 13 ;num[2] = 14 ;num[3] = 17 ;num[4] = 20 ;

10 13 14 17 20num

1000번지 1004 1008 1012 1016

num[0] num[1] num[2] num[3] num[4]

4

One-Dimensional Arrays§ Array – Syntax

– 배열의 크기는 반드시 양수로 써야 한다.– 배열 원소의 첨자는 항상 0 부터 시작한다.

• 위의 예제의 경우는 grade[0], grade[1],~ , grade[49]가 생성.

element-type array_name[size];

[Ex] int grade[50];

data type variable Name

size of Array

5

One-Dimensional Arrays

#include <stdio.h>

int main() {int a[100], k ;

for( k = 0 ; k < 100 ; k++ )scanf( “%d”, &a[k] ) ;

for( k = 99 ; k >= 0 ; k-- )printf( “%d ”, a[k] ) ;

printf( “\n” ) ;

return 0;}

§ 배열사용예제#include <stdio.h>

int main() {int a[100], k, sum = 0 ;

for( k = 0 ; k < 100 ; k++ )scanf( “%d”, &a[k] ) ;

for( k = 0 ; k < 100 ; k++ )sum += a[k] ;

printf( “%d\n”, sum ) ;

return 0;}

6

Initialization

§ 초기화– 지정된 array에 초기값을 할당하는 것.

§ 초기값이배열원소의값보다적을때

float x[7] = { -1.1, 0.2, 33.0, 4.4, 5.05, 0.0, 7.7 };

x[0] = -1.1, x[1] = 0.2,…, x[6] = 7.7 로초기화된다.

int a[100] = { -1 };

a[0] = -1, a[1] = 0, … a[99] = 0처럼남은원소들은모두 0으로초기화 된다.

7

cnt_abc Program

#include <stdio.h>#include <ctype.h>

int main(void) { int letter[26] = {0}, c, i ;while ( (c = getchar( )) != EOF) {

c=toupper(c);if( isalph(c) ) ++letter[c – ‘A’];

}

for ( i = 0; i < 26; ++i) {if ( i % 6 == 0 ) printf(“\n”);printf(“%4c:%3d”, ‘A’ + i, letter[i]);

} /* end of for */return 0;

}

문자가 끝날때까지 getchar()로입력받는다. 소문자는 대문자로바꾼다.

배열에저장된문자들의개수를하나씩출력한다.

§ 입력받은문자각각의개수를헤아리자

8

The Relationship between Arrays and Pointers

§ Example : – 각 원소의 주소는 ?

int num[5] ;num

1000번지 1004 1008 1012 1016

num[0] num[1] num[2] num[3] num[4]

&num[0] == 1000&num[1] == 1004&num[2] == 1008&num[3] == 1012&num[4] == 1016

9

The Relationship between Arrays and Pointers

§ Example : num은무엇일까?

– num은 포인터상수로 “배열시작주소” 이다.

int num[5] ; num

1000번지 1004 1008 1012 1016

num[0] num[1] num[2] num[3] num[4]

num == &num[0] == 1000

10

The Relationship between Arrays and Pointers

§ Example : 포인터의특별한연산– “포인터 + 1” 은 “1 큰 주소값”을 의미하는 것이 아니라, 그 “다음원소의 주소” 이다

– “포인터 - 1” 은 “바로 이전 원소의 주소” 이다

int num[5] ;

1000번지 1004 1008 1012 1016

num[0] num[1] num[2] num[3] num[4]

num == &num[0] == 1000

(num+0) == ??(num+1) == ??(num+2) == ??(num+3) == ??(num+4) == ??

&num[0]&num[1]&num[2]&num[3]&num[4]

11

The Relationship between Arrays and Pointers

§ Example : 포인터의특별한연산

int num[5] ; 10 20 30 40 50

1000번지 1004 1008 1012 1016

num[0] num[1] num[2] num[3] num[4]

int num[5], *p = num ;

*p = 10 ;*(p+1) = 20 ;*(p+2) = 30 ;*(p+3) = 40 ;*(p+4) = 50 ;

int num[5], *p = num ;

p[0] = 10 ;p[1] = 20 ;p[2] = 30 ;p[3] = 40 ;p[4] = 50 ;

int num[5] ;

*num = 10 ;*(num+1) = 20 ;*(num+2) = 30 ;*(num+3) = 40 ;*(num+4) = 50 ;

int num[5] ;

num[0] =10 ;num[1] = 20 ;num[2] = 30 ;num[3] = 40 ;num[4] = 50 ;

12

Pointer Arithmetic and Element Size

§ 포인터연산– 변수 p가 포인터라면 p + 1은 그 type의 다음 변수를 저장하거나 access할수 있도록 주소를 생성한다.

– 포인터의 정수 덧셈 연산이 가능하다.– 포인터의 정수 뺄셈 연산이 가능하다.– 두 개의 포인터의 뺄셈 연산이 가능하다.

13

Pointer Arithmetic and Element Size

§ Adding an Integer to a Pointer

[Ex]p = &a[2];

q = p + 3;

p += 6;

0 1 2 3 4 5 6 7 8 9

p

a

0 1 2 3 4 5 6 7 8 9

p

a

0 1 2 3 4 5 6 7 8 9

p

a

q

q

14

Pointer Arithmetic and Element Size

§ Subtracting an Integer from a Pointer

[Ex]p = &a[8];

q = p - 3;

p -= 6;

0 1 2 3 4 5 6 7 8 9

p

a

0 1 2 3 4 5 6 7 8 9

p

a

0 1 2 3 4 5 6 7 8 9

p

a

q

q

15

Pointer Arithmetic and Element Size§ Subtracting Pointers

[Ex]p = &a[5];q = &a[1];

i = p – q; /* i == 4 */i = q – p; /* i == -4 */

0 1 2 3 4 5 6 7 8 9

q

a

p

16

Pointer Arithmetic and Element Size

§ Comparing Pointers– 관계연산자 (relational operators) <, <=, >,>= 사용 가능.

– 동등연산자(equality operators) ==, != 사용 가능.

[Ex]p = &a[5];q = &a[1];

p <= q; /* result is 0 */p >= q; /* result is 1 */

17

Pointer Arithmetic and Element Size§ 포인터연산의예제

int a[ ] = { 5,15,25,43,12,1,7,89,32,11}int *p = &a[1], *q = &a[5] ;

1. *(p + 3) ?

2. *(q - 2) ?

3. q - p ?

4. if ( p > q ) ?

5. if ( *p > *q )?

18

Pointer Arithmetic and Element Size§ 포인터연산의예제

#include <stdio.h>int main(void){

double a[2], *p, *q;p = &a[0]; /* points at base of array */q = p + 1; /* equivalent to q = &a[1]; */

printf(“%d\n”, q – p );printf(“%d\n”, (int) q – (int) p );printf(“%d\n”, sizeof(double) );return 0;

}

Combining the * and ++ Operators

§ Combining the * and ++ Operators

– p를 1 증가 혹는 감소 시킨 후 *p

– *p 후 p를 1 증가 혹은 감소

– p가 가르키는 변수를 1 증가 혹은 감소

19

*++p º *(++p), *--p º *(--p)

*p++ º *(p++), *p-- º *(p--)

(*p)++, (*p)--

Combining the * and ++ Operators

§ Combining the * and ++ Operators

20

int main(){

int k, a[10], *p = a ;

while( p < &a[10] )*p++ = 0 ;

return 0;}

int main(){

int k, a[10], *p = a ;

while( p < &a[10] ) {*p = 0 ;p = p + 1 ;

}

return 0;}

Combining the * and ++ Operators

§ Combining the * and ++ Operators

21

int main(){

int k, a[10], *p = &a[10] ;

while( p >= &a[0] )*--p = 0 ;

return 0;}

int main(){

int k, a[10], *p = a ;

while( p >= &a[0] ) {p = p -1 ;*p = 0 ;

}

return 0;}

Example

§ 입력받은수더하기

22

#include <stdio.h>

int sum( int num[], int size ) {int k, sum = 0 ;for( k = 0 ; k < size ; k++ )

sum += num[k] ;return sum ;

}

int main() {int a[100], k ;for( k = 0 ; k < 100 ; k++ )

scanf( “%d”, &a[k] ) ;printf( “%d\n”, sum(a, 100) ) ;return 0;

}

#include <stdio.h>

int sum( int num[], int size ) {int k, sum = 0 ;for( k = 0 ; k < size ; k++ )

sum += *num++ ;return sum ;

}

int main() {int a[100], k ;for( k = 0 ; k < 100 ; k++ )

scanf( “%d”, &a[k] ) ;printf( “%d\n”, sum(a, 100) ) ;return 0;

}

int num[]는int *num과같다.