13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수
13-1 포인터와 배열의 관계 배열의 이름의 정체 배열 이름은 첫 번째 요소의 주소 값을 나타낸다. 13-1 포인터와 배열의 관계 배열의 이름의 정체 배열 이름은 첫 번째 요소의 주소 값을 나타낸다. pointer_array1.c 참조 int a[5]={0, 1, 2, 3, 4} 그림 13-1
13-1 포인터와 배열의 관계 /* pointer_array1.c */ #include <stdio.h> 13-1 포인터와 배열의 관계 /* pointer_array1.c */ #include <stdio.h> int main(void) { int a[5]={0, 1, 2, 3, 4}; printf("%d, %d \n", a[0], a[1]); printf("%d 번지 , %d 번지 \n", &a[0], &a[1]); printf("배열 이름 : %d \n", a); return 0; }
13-1 포인터와 배열의 관계 배열 이름과 포인터 비교 비교 대상 비교 조건 포인터 배열 이름 이름이 존재하는가 물론 있다. 13-1 포인터와 배열의 관계 배열 이름과 포인터 비교 비교 대상 비교 조건 포인터 배열 이름 이름이 존재하는가 물론 있다. 당연히 있다. 무엇을 나타내는가 메모리의 주소 변수인가 상수인가 변수 상수 int main(void) { int a[5]={0, 1, 2, 3, 4}; int b=10; a=&b; //a는 상수이므로 오류, a가 변수였다면 OK! }
13-1 포인터와 배열의 관계 배열 이름의 타입 배열 이름도 포인터이므로 타입이 존재 13-1 포인터와 배열의 관계 배열 이름의 타입 배열 이름도 포인터이므로 타입이 존재 배열 이름이 가리키는 배열 요소에 의해 결정 int arr1[10] int* double arr2[20] double*
13-1 포인터와 배열의 관계 배열 이름의 활용 배열 이름을 포인터처럼, 포인터를 배열 이름처럼 활용하 는 것이 가능! 13-1 포인터와 배열의 관계 배열 이름의 활용 배열 이름을 포인터처럼, 포인터를 배열 이름처럼 활용하 는 것이 가능! /* pointer_array2.c */ #include <stdio.h> int main(void) { int arr[3]={0, 1, 2}; int *ptr; ptr=arr; printf("%d, %d, %d \n", ptr[0], ptr[1], ptr[2]); return 0; } 그림 13-2
13-2 포인터 연산 포인터 연산이란? 포인터가 지니는 값을 증가 혹은 감소시키는 연산을 의미 ptr1++; 13-2 포인터 연산 포인터 연산이란? 포인터가 지니는 값을 증가 혹은 감소시키는 연산을 의미 ptr1++; ptr1 += 3; --ptr1; ptr2=ptr1+2;
13-2 포인터 연산 포인터 연산 포인터가 가리키는 대상의 자료형에 따라서 증가 및 감소되 는 값이 차이를 지님 13-2 포인터 연산 포인터 연산 포인터가 가리키는 대상의 자료형에 따라서 증가 및 감소되 는 값이 차이를 지님 /* pointer_op.c */ #include <stdio.h> int main(void) { int* ptr1=0; // int* ptr1=NULL; 과 같은 문장 char* ptr2=0; // char* ptr2=NULL; 과 같은 문장 double* ptr3=0; // double* ptr3=NULL; 과 같은 문장 printf("%d 번지, %d 번지, %d 번지 \n", ptr1++, ptr2++, ptr3++); printf("%d 번지, %d 번지, %d 번지 \n", ptr1, ptr2, ptr3); return 0; }
13-2 포인터 연산 포인터 연산을 통한 배열 요소의 접근 그림 13-4 /* pointer_array3.c */ 13-2 포인터 연산 포인터 연산을 통한 배열 요소의 접근 /* pointer_array3.c */ #include <stdio.h> int main(void) { int arr[5]={1, 2, 3, 4, 5}; int* pArr=arr; printf("%d \n", *pArr); printf("%d \n", *(++pArr)); printf("%d \n", *(pArr+1)); printf("%d \n", *(pArr+2)); return 0; } 그림 13-4
13-2 포인터 연산 포인터와 배열을 통해서 얻을 수 있는 중대한 결론 그림 13-5 /* two_same.c */ 13-2 포인터 연산 포인터와 배열을 통해서 얻을 수 있는 중대한 결론 /* two_same.c */ #include <stdio.h> int main(void) { int arr[2]={1, 2}; int* pArr=arr; printf("%d, %d \n", arr[0], *(arr+1)); printf("%d, %d \n", pArr[0], *(pArr+1)); return 0; } 그림 13-5
13-3 문자열 상수를 가리키는 포인터 문자열 표현 방식의 이해 배열 기반의 문자열 변수 포인터 기반의 문자열 상수 13-3 문자열 상수를 가리키는 포인터 문자열 표현 방식의 이해 배열 기반의 문자열 변수 포인터 기반의 문자열 상수 str_prn.c 참조 char str1[5]="abcd"; char *str2="ABCD"; 그림 13-6
/* str_prn.c*/ #include <stdio.h> int main() { char str1[5]="abcd"; char *str2="ABCD"; printf("%s \n", str1); printf("%s \n", str2); str1[0]='x'; // str2[0]='x'; //Error ?! return 0; }
13-4 포인터 배열 포인터 배열 배열의 요소로 포인터를 지니는 배열 그림 13-8 int* arr1[10]; 13-4 포인터 배열 포인터 배열 배열의 요소로 포인터를 지니는 배열 int* arr1[10]; double* arr2[20]; char* arr3[30]; 그림 13-8
13-4 포인터 배열 포인터 배열 예제 1 그림 13-9 /* ptr_arr.c */ 13-4 포인터 배열 포인터 배열 예제 1 /* ptr_arr.c */ #include <stdio.h> int main(void) { int a=10, b=20, c=30; int* arr[3]={&a, &b, &c}; printf("%d \n", *arr[0]); printf("%d \n", *arr[1]); printf("%d \n", *arr[2]); return 0; } 그림 13-9
13-4 포인터 배열 포인터 배열 예제 2 그림 13-10 그림 13-11 { char* arr[3]={ 13-4 포인터 배열 포인터 배열 예제 2 /* str_arr.c */ #include <stdio.h> int main(void) { char* arr[3]={ "Fervent-lecture", "TCP/IP", "Socket Programming" }; printf("%s \n", arr[0]); printf("%s \n", arr[1]); printf("%s \n", arr[2]); return 0; } 그림 13-10 그림 13-11