11. array & pointer
TRANSCRIPT
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과같다.