Upload
catherine-fowler
View
225
Download
2
Embed Size (px)
Citation preview
8 주 강의
Arrays, Pointers, and Strings
One dimensional array
• int grad0, grad1, grad2; int grad[3];• int a[size]; /* a[0], …, a[size-1]• #define N 100 int a[N]; /* a[0] .. a[99] is allocated */ for(i=1; i<100; ++i) sum += a[i];
Initialization
float f[5]={0.0, 1.0, 2.0, 3.0, 4.0}; int a[100]={0}; /* all elements to 0 */ int a[]={2,3,5,-7}; /* int a[4] … */ char s[] = “abc”; /* char s[] = {‘a’, ‘b’, ‘c’, ‘\0’} */
Pointers
• &v 는 변수 v 의 location( 주소 )• int *p ::: declares p to be type pointer to
int• p=0; p=NULL;• p=&i; • p=(int *) 1776 • /* an absolute address */
Pointer 예
? ??
a b p
1 2
a b p
int a, b, *p;
a=1; b=2; p=&a;
Pointer 에 의한 접근의 결과Declarations and initializations
int i=3, j=5, *p=&i, *q=&j, *r;double x;
Expression Equivalent expression Value
p == & i p == (& i) 1
* * & p * ( * ( & p)) 3
r = & x r = (& x) /* illegal */
7 * * p / * q + 7 (((7 * (* p))) / (* p)) + 7 11
* (r = & j) *= * p (* (r = (& j))) *= (* p) 15
Legality of opertions
Declarations
int float void
* p;* q;* v;
Legal assignments Illegal assignments
p = 0; p = 1;
p = (int *) 1; v = 1;
p = v = q; p = q;
p = (int *) q;
주의할 점• 7 * * p / * q + 7 • ??? 7 * * p /* q +7 --trouble making• &3 /* illegal */• &(k+3) /* illegal */• register v; &v /* illegal */ • &a[0], &a[i+j+3] /* legal */• int a[3]; &a ?????
Call by reference (address)
• To change the values of variables in the calling environment
• Simulating the effect of call by reference by pointers
예• void swap(int *p, int *q) { int tmp; tmp = *p; *p = *q; *q = tmp }
• int i=3, j=5;
swap(&i, &j);
The simulation of call by reference
• Declaring a function parameter to be a pointer
• Using the de-referenced pointer in the function body
• Passing an address as an argument when the function is called
The relationship between arrays and pointers
• An array name itself is an address, or pointer value, and pointers as well as arrays, can be subscripted
• a[i] *(a+i)• #define N 100 int a[N], I, *p, sum=0;
p=a; p=&a[0]; p=a+1 p=&a[1];
계속 • for (p=a; p < &a[N]; ++p) sum += *p; for(i = 0; i < N; ++i) sum += *(a + i); p=a; for (i=0; i < N; ++i) sum += p[i];
Pointer 연산• int *a; short *b; float *c; double *d;
a+1 주소 4 증가 b+1 주소 2 증가 c+1 주소 4 증가 d+1 주소 8 증가
Arrays as function arguments
• double sum(double a[], int n) { int i; double sum = 0.0; for (i = 0; i < n; ++i) sum+=a[i]; return sum; } double sum(double *a, int n)
Various ways that sum( ) might be called
Invocation What gets computed and returned
sum(v, 100) v[0] + v[1] + …c… + v[99]
sum(v, 88) v[0] + v[1] + …c… + v[87]
sum(&v[7], k – 7)
v[7] + v[8] + …c… + v[k - 1]
sum(v+7, 2 * k) v[7] + v[8] + …c… + v[2 * k+6]
수행 내용
Bubble sorting
• Greedy method• 큰 것을 먼저 뒤로 보내거나 , 작은 것을 먼저 앞으로 보내거나
• 257(6.7 절 ) 페이지 설명
p.258
Unordered data:
7 3 66 3 -5 22 -77 2
First pass: -77 7 3 66 3 -5 22 2
Second pass: -77 -5 7 3 66 3 2 22
Third pass: -77 -5 2 7 3 66 3 22
Fourth pass: -77 -5 2 3 7 3 66 22
Fifth pass: -77 -5 2 3 3 7 22 66
Sixth pass: -77 -5 2 3 3 7 22 66
Seventh pass: -77 -5 2 3 3 7 22 66
calloc() and malloc()
• stdlib.h• Dynamic memory allocation (calloc : contiguous alloc
ation, malloc : memory allocation)• Dynamically create space for arrays, structure
s, unions • callc(n, el_size)• malloc(n*el_size)• 실패시 NULL 을 return (memory 가 부족하면 )
예• int *a, n; … a=calloc(n, sizeof(int));• a=malloc(n*sizeof(int));• deallocation : free(ptr) free(a);• Reallocation : realloc()• 261page 프로그램 설명
Memory map
automatic(stack)
↓
↑
malloc(heap)static
external
Offsetting the pointer
a
0 21 n-1
...
a = calloc(n, sizeof(double));
Offsetting the pointera
0 21 n
...
a = calloc(n+1, sizeof(double)) ;
Merge sorting
• Merge to arrays• Merge 방법 설명 (264page 프로그램 )• Merge sorting 방법 설명 (266 page)• Why power of 2?• 그러면 해결방법은
Strings
• Strings are one-dimensional array of type char• A null character is a byte with all bits off (\0)• char *p = “abc”; • A string constant is treated as a pointer
– “abc”[1] *(“abc”+1)– char *p=“abcde”;– char s[] = “abcde”; char s[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘\0’};
The memory map
p
a b c d e \0a b c d e \0
s
- 272 페이지의 word_count program 설명
String handling functions in the standard library
• char *strcat(char *s1, const char *s2);• int strcmp(const char *s1, const char *s2);• char *strcpy(char *s1, const char *s2);• size_t strlen(const char *s); /* unsigned int
*/• strlen() 와 strcpy() 의 프로그램 (page 273, 2
74)• Strcat() 프로그램 275page
예제Declarations and initializations
char s1[] = “beautiful big sky country”, s2[] = “how now brown cow”;
Expression Value
strlen(s1) 25
strlen(s2 + 8) 9
strcmp(s1, s2) negative integer
Statements What gets printed
printf(“%s”, s1 + 10); big sky country
strcpy(s1 + 10, s2 + 8);
strcat(s1, “s!”);
printf(“%s”, s1); beautiful brown cows!
Multidimensional arrays
Examples of declarations of arrays
Remarks
int
int
int
a[100];
b[2][7];
c[5][3][2];
a one-dimensional array
a two-dimensional array
a three-dimensional
array
col 1 col 2 col 3 col 4 col 5
row 1 a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
row 2 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
row 3 a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]
Two-dimensional arrays
int a[3][5]; /* row major */
row major column major
Expressions equivalent to a[i][j]
*(a[i] + j)
(*(a + i)) [j]
*((*(a + i)) + j)
*(&a[0][0] + 5*i + j)
예제
Storage mapping function
• int a[3][5]• a[i][j] *(&a[0][0] + 5*i +j)
• int a[I][J][K}• a[i][j][k] *(&a[0][0][0] + I*J*i + J*j +
k
Formal parameter declarations
• int a[3][5]
• int sum(int a[][5]) { int i,j,sum=0; for(i=0;i<3;++i) for(j=0,j<5;++j) sum +=a[i][j]; return sum; }• int a[][5] int a[3][5] int (*a)[5]
One dimensional array
• parameter int b[] int b[3] int *b• char *argv[] char *argv[3] char *
*argv
• Caution ::: char x[][] <=/=> char **x
Three dimensional array
• int a[7][9][2];• a[i][j][k] *(&a[0][0][0] + 9*2*I + 2*j
+ k)• Parameter ::: int a[][9][2] int a[7][9][2] int (*a)[9][2]
Initialization
• int a[2][3] = {1,2,3,4,5,6}; int a[2][3] = {{1,2,3},{4,5,6}}; int a[ ] [3] = {{1,2,3},{4,5,6}};• 뒤의 0 은 쓰지 않아도 int a[2][2][3] = { {{1,1,0}, {2,2,0}} {{3,0,0}, {4,4,0}} }; int a[][2][3] = {{{1,1}, {2}}, {3}, {4,4}}}; • int a[2][2][3] = {0};
The use of typedef
• Self documentation• #define N 3] typedef double scalar; typedef scalar vector[N]; typedef scalar matrix[N][N];
scalar a; vector b; matrixc;• page 283 프로그램 설명
Arrays of pointers
• Sorting strings :: a pointer of a pointer
• 285page 설명
Example
.
.
.
i s \0
0
w
1
a p p l e \0
2
3
17
A \0
f o r \0
t r y . \0
.
.
.
Swapping of two strings
W
w[j]
w[i]
\ 0elppa
\ 0rof
Before swapping
W
w[j]
w[i]
\ 0elppa
\ 0rof
After swapping
숙제
• 사람의 이름을 입력하여 순서화한다 - 1 수준 ::: 순서화만 - 2 수준 ::: 사람 이름 대신에 주소 - 3 수준 ::: 한글 이름을 입력하여
순서화
Arguments to main()
• int main(int argc, char *argv[]) { int i; printf(“argc = %d\n”, argc); for (i=0;i<argc;++i) printf(argv[%d] = %s\n”, i argv[i]); return 0; } • my_echo a is an apple• argv=5, argv[0]= my_echo … argv[4] = apple
Ragged arrays
• char a[2][15] = {“abc:”, “a is for apple”}; char *p[2] = {“abc:”, “a is for apple”};• Ragged array ::: an array of pointers who
se elements are used to point varying sizes
예
a b c \0
a i s f o r a p p l e \0
0
1
pA ragged array
Functions as arguments
• #include “sum_sqr.h” double sum_square (double f(double x), int m, int n) { int k; double sum=0.0; for (k=m; k<=n;++k) sum +=f(k)*f(k); return sum; }• double sum_square(double (*f)(double), int m, int n);• sum += (*f)(k) * (*f)(k); 도 가능• 조심 :::: double sum_square(double *f(double), int m, int n) 은
안 된다 … 함수 f(double) 의 return 값이 double 의 pointer
Function prototypes
• Function prototypes
double sum_square (double f(double x), int m, int n)double sum_square (double f(double), int m, int n)double sum_square (double f(double x), int, int)double sum_square (double (*f)(double x), int, int)double sum_square (double (*)(double x), int, int)double sum_square (double g(double x), int a int b)
double sum_square (double f(double x0, int m, int n)double sum_square (double f(double x0, int m, int n)
Using bisection to find the root of a function
• A real number x that satisfies the equation f(x) = 0 a root of f
• 프로그램 설명 (298 페이지 )
Finding a root
x
y
x0
F(b)F(m)
m
a
F(a)b
midpoint
root
graph of f
Finding a root by bisection
The Kepler equation
• m = x – e sin(x) y=x and y=m + e sin(x) x – e sin(x) – m = 0
Kepler equation
x
y
y=x
y=m+esinx
x0
A solution of the Kepler equation
x0
x
y
y =xy =m+e sinx
Arrays of Pointers to Function
• function 은 array 의 처리와 유사• dbl (*pfdd) (dbl); pfdd = kepler; /* 302page 설명 */• Function 을 array 로 처리 pfdd f[N] = {NULL, f1, f2, f3}; /* 304page 설명 */
The type qualifier const (ANSI)
• static const int k=3; can be initialized but can not be modified
: K is a constant int with static storage class• const int n=3; int v[n]; error const int a=7; int *p = &a; ERROR const int a=7; const int *p =&a; OK
The type qualifier volatile (ANSI)
• A volatile object can be modified in some unspecified way by the hardware
• extern const volatile int real_time_clock;
숙제• 수업시간 :::3, 6, 7,8, 11, 18, 24, 27,
38, 42• 집 ::: 4, 10, 12, 16, 20, 32, 35• 추가 ::: 다음 중 2 문제를 집에서 풀 것 29, 30,46