2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터
2. 메모리와 주소 정수형 배열의 메모리 할당 aa == &aa[0] *aa == aa[0] 배열의 주소 표현 따라서 또는 aa == &aa[0] *aa == aa[0]
01 #include <stdio.h> 02 03 int main( ) 04 { 05 int aa[3] = {10, 20, 30}; 06 07 printf("aa[0]의 값은 %d, 주소는 %d\n", aa[0], &aa[0]); // 배열의 자리 값과 주소를 출력 08 printf("aa[1]의 값은 %d, 주소는 %d\n", aa[1], &aa[1]); 09 printf("aa[2]의 값은 %d, 주소는 %d\n", aa[2], &aa[2]); 10 printf("배열 이름 aa의 값(= 주소)는 %d\n", aa); // 배열 이름(aa 주소)을 출력 11 }
aa 값을 1031로 가정하고 aa+1을 계산한 결과는 무엇일까? 배열의 이름 활용법 (포인터 연산) aa 값을 1031로 가정하고 aa+1을 계산한 결과는 무엇일까? 예상 결과 : aa+1 → 1031 + 1 = 1032 (X) 실제 결과 : aa+1 → 1031 + 4 = 1035 (O) 계산 과정 ‘+1’의 의미 : 배열 aa의 위치에서 한 칸 건너뜀 한 칸의 크기 : 배열 aa가 정수형 배열이므로 4바이트 즉, aa+1 = &aa[1] = 1035 포인터 표기법과 배열 표기법 aa + i == &aa[i] *(aa + i) == aa[i]
01 #include <stdio.h> 02 03 int main( ) 04 { 05 int aa[3] = {10, 20, 30}; 06 07 printf("&aa[0]는 %d, aa+0은 %d \n", ___①__ , aa+0); 08 printf("&aa[1]는 %d, aa+1은 %d \n", &aa[1], ___②__ ); 09 printf("&aa[2]는 %d, aa+2는 %d \n", &aa[2], ___③__ ); 10 } ---&aa[0] == aa + 0 ---&aa[1] == aa + 1 ---&aa[2] == aa + 2
4. 배열과 포인터의 관계 문자형 배열과 문자열 포인터 I T - C o K B k 문자 하나 표현 : char 문자열 표현 : s[12] 포인터 선언 및 초기화: 이 경우 배열 s와 포인터 p는 호환 가능 (포인터 표기법과 배열 표기법): I T - C o K B k \0 char *p = s; *(p + 3) == s[3]
실습과제1: [기본 9-8] 문자열과 포인터의 관계 ① 01 #include <stdio.h> 02 03 int main( ) 04 { 05 char s[8]= "Basic-C"; 06 char *p; 07 08 p = s; 09 10 printf("&s[3] ==> %s\n", &s[3]); 11 printf("p+3 ==> %s\n\n", p+3); 12 13 printf("s[3] ==> %c\n", s[3]); 14 printf("*(p+3) ==> %c\n", *(p+3)); 15 } ---문자형 배열을 선언하고 초깃값을 대입한다. ---문자형 포인터 변수를 선언한다. ---p에 배열 s의 주소를 대입한다. ---문자열과 포인터의 주솟값을 %s로 출력한다. ---문자와 포인터의 실제 값을 %c로 출력한다.
실습과제2: [응용 9-9] 문자열과 포인터의 관계 ② 01 #include <stdio.h> 02 03 int main( ) 04 { 05 char s[8]= "Basic-C"; 06 char *p; 07 int i; 08 09 p = __①___ ; 10 11 for( i=sizeof(s)-2; i>=0; i-- ) 12 printf("%c", *( __②___ ) ); 13 14 printf("\n"); 15 } ---포인터 변수에 배열 주소를 대입한다. ---문자형 배열의 끝부터 배열의 개수만큼 반복한다. -----포인터 변수가 가리키는 곳의 문자 하나를 출력한다.
참고: sizeof(s): 배열의 크기(8) 12행: (p+i)의 실제 값 출력 *(p+i) (p+6) (p+5) (p+4) (p+3) (p+2) (p+1) (p+0)
실습과제1:[기본 9-8] 문자열과 포인터의 관계 ① 실습과제2:[응용 9-9] 문자열과 포인터의 관계 ②
실습과제 3번 #include <stdio.h> int main(void) { int i = 0; int point[] = {95, 88, 76, 54, 85, 33, 65, 78, 99, 82}; int arrlen = sizeof(point) / sizeof(int); printf("배열 표기를 이용하여 원소값을 출력\n"); for (i = 0; i < arrlen; i++) { // 배열 표기법 printf("%d%s", point[i], (i == arrlen – 1) ? "\n\n" : ", "); } printf("포인터 연산을 이용하여 원소값을 출력 \n"); for (i = 0; i < arrlen; i++) { // 포인터 표기법 printf("%d%s", *(point + i), (i == arrlen – 1) ? "\n\n" : ", "); return 0;
실습과제 4번 #include <stdio.h> int main() { char msg[] = {'H', 'e', 'l', 'l', 'o', '!', '\0'}; int i = 0; 1. 문자열 msg를 참조하는 포인터를 ptr이라는 이름으로 선언 printf("%s\n", msg); // 문자열 msg 출력 : 1번 while (msg[i]) { // 문자배열 msg 출력 : 2번 printf("%c", msg[i]); ++i } printf("\n"); 2. 포인터 ptr을 이용하여 문자열 msg 출력 (1번과 유사하게 한 줄로 완성) while (*ptr) { // 2번과 유사하게 포인터 ptr을 이용하여 msg 출력 3. 포인터 ptr이 가리키는 문자를 출력 ptr = ptr + 1; return 0;