Pointers summary Binary to Byte 1203 2 1203
Pointers summary
Binary to Byte • 1203의 2진수 표현 1203 = 1024 + 128 + 32 + 16 + 2 + 1 = 210 + 27 + 25 + 24 + 21 + 20 2진수 => 0100 1011 0011 16진수 => 4 B 3 Binary(2진수)는 각 자리 또는 bit에 0과 1만 표현 가능 1203을 2진수로 표현하기 위해 11 bit가 필요함 위치 값 10 1 9 0 8 0 7 1 6 0 5 1 4 1 8 bit = 1 byte 3 0 2 0 1 1 0 1 4
주소 • 32 bit 주소 체계를 따르는 컴퓨터의 경우 정보의 표현 • 64 bit인 경우 한 줄에 64개 2진수 표현 가능 1 word 1 byte 주소 0 byte 1 byte 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 1 byte 8 7 6 5 4 3 offset 2 1 0 0000000000010010110011 4 byte 8 byte 12 byte 16 byte 5
문제 • 다음의 메모리 상태를 참고로, 변수 초기화 문장을 작성 … 0 31… 100 392 c 104 108 235 a ABC d 8. 0 b 112 int a = 235; float c = 8. 0; int b = 392; char d[] = “ABC”; 116 120 124 128 132 136 10
문제 • 다음의 메모리 초기화 문장을 토대로 메모리 배치도 작성 … 0 31… 100 1 a 104 108 39. 2 b 400201 c 112 int a = 1; float b = 39. 2; double c = 400201; char d[5] = { 1, 2, 3, 4, 5}; 116 120 124 128 132 136 b 132 1 133 2 134 3 135 4 136 5 11
변수의 주소 확인 실행 결과 value value of of of c[0] c[1] c[2] c[3] c[4] = = = 3; 2; 0; 8; 9; address address is is is 0 x 7 fff 5602 a 3 e 0 0 x 7 fff 5602 a 3 e 4 0 x 7 fff 5602 a 3 e 8 0 x 7 fff 5602 a 3 ec 0 x 7 fff 5602 a 3 f 0 … 0 31… 0 x 7 fff 541 c 13 d 8 0 … 0 x 7 fff 5602 a 3 e 0 3 0 x 7 fff 5602 a 3 e 4 2 0 x 7 fff 5602 a 3 e 8 0 0 x 7 fff 5602 a 3 ec 8 0 x 7 fff 5602 a 3 f 0 9 13
Scanf에서 &연산자의 활용 1 2 2 float a; // 4 byte scanf(“%f”, &a); 3. 14 … 0 31… 사용자 입력 ⏎ 300 304 308 312 316 3. 14 저장 3. 14 1 변수 할당 3 a의 주소 확인 주소: 308 a 320 324 328 332 336 14
포인터 변수의 사용 예 1 2 3 4 1 int a = 100; int *pa; … pa = &a; … 0 31… 2 a 의 주소는 256이라 가정 포인터 변수 선언 다른 문장들 실행 포인터 변수에 a의 주소 저장 … 0 31… 3 300 304 // // 100 a 304 … 0 31… 300 100 304 a 308 308 312 312 316 320 320 324 324 328 328 pa 316 100 &a = 304 a pa 18
예시 1 2 3 4 5 int a = 100, b int *pv; printf(“%pn”, = 200, c = 300; pv = &a); pv = &b); pv = &c); … 0 31… pv 100 104 100 a 2 pv 값은 b의 주소 120 300 c 3 pv 값은 c의 주소 112 200 b 108 112 1 pv 값은 a의 주소 104 116 120 124 128 132 19
예시 1 2 3 4 int a; int *pv = &a, *pu = &a); // pv와 pv는 a의 주소 104를 저장 printf(“%dn”, *pu = 400); printf(“%d, %dn”, a, *pv); … 0 31… pv 100 104 100 a 108 2 pv가 가리키는 a의 값 400 읽음 3 pv 값은 c의 주소 112 116 1 pu가 가리키는 a에 400 저장 pu 120 124 128 132 20
포인터 연습 문제 int a; // a의 주소는 1 int *p = &a; // p의 *p = 12; 주 소 주소는 20 값 1 문제: 2 12 6 11 포인터 변수 p 16 X 20 3 3 7 20 18 7 12 17 4 4 8 17 9 2 13 18 5 11 9 15 8 6 14 19 14 10 10 16 5 15 20 19 13 1
포인터에서의 캐스팅 int a = 100; double b = 300; int c[2] = {1, 2}; int *pa = &a; double *pb = &b; int *pc = &c[0]; 500 504 508 100 a 300 b 512 1 c[0] 516 2 c[1] 520 500 pa 504 pb 512 pc 500 k void *k; 524 k = &a; 528 532 1 k 값은 a의 주소 500 … 0 31… 536 540 544 548 25
포인터에서의 캐스팅 int a = 100; double b = 300; int c[2] = {1, 2}; int *pa = &a; double *pb = &b; int *pc = &c[0]; void *k; 500 504 508 1 k 값은 a의 주소 500 2 읽을 바이트의 길이는 int 타입의 길이 4바이트 100 a 300 b 512 1 c[0] 516 2 c[1] 520 500 pa 504 pb 512 pc 500 k 524 k = &a; printf(“%dn”, *(int*)k); … 0 31… 528 532 536 540 544 548 26
포인터에서의 캐스팅 int a = 100; double b = 300; int c[2] = {1, 2}; int *pa = &a; double *pb = &b; int *pc = &c[0]; void *k; k = &a; printf(“%dn”, *(int*)k); k = &b; printf(“%dn”, *(double*)k); … 0 31… 500 504 508 100 a 300 b 512 1 c[0] 516 2 c[1] 520 500 pa 504 pb 512 pc 504 k 524 528 532 536 540 544 548 27
포인터에서의 캐스팅 int a = 100; double b = 300; int c[2] = {1, 2}; int *pa = &a; double *pb = &b; int *pc = &c[0]; void *k; k = &a; printf(“%dn”, *(int*)k); k = &b; printf(“%dn”, *(double*)k); k = &c[0]; printf(“%dn”, *(int*)k); … 0 31… 500 504 508 100 a 300 b 512 1 c[0] 516 2 c[1] 520 500 pa 504 pb 512 pc 512 k 524 528 532 536 540 544 548 28
- Slides: 29