-
포인터 활용
[학습내용] [학습목표] ▪ 포인터와 배열
▪ 포인터 연산▪ 포인터와 배열의 관계에 대해 설명할 수 있다.
▪ 포인터를 이용한 연산을 사용할 수 있다.포인터와 배열
1. 포인터로 배열 참조
▪ 배열명은 배열의 시작 주소를 의미하는 상수
▪ 배열의 시작 주소를 구할 때는 & 없이 배열명만 사용
▪ 배열명을 포인터처럼 사용 가능
인덱스를 사용하는 대신 배열의 시작 주소로 포인터 연산을 하면 배열의 특정 원소에 접근 가능
▪ *(arr+i)는 arr[i]를 의미
배열의 시작 주소에서 데이터 타입 i개 크기만큼 증가된 주소에 있는 값
▪ 배열의 시작 주소로 초기화 된 포인터를 이용해서 배열의 모든 원소에 접근 가능
▪ 포인터 변수를 배열 이름인 것처럼 사용 가능
▪ 포인터와 +, - 연산
‘포인터 - 포인터’ 연산은 두 포인터의 차를 구하는 데 사용
p + N p - N p가 가리키는 데이터형 N개 크기만큼 증가된
주소가 연산의 결과p가 가리키는 데이터형 N개 크기만큼 감소된
주소가 연산의 결과int arr[5] int diff = &arr[3] - &arr[0] //arr[3]과 arr[0]은 int 3개만큼 떨어져 있음
01: 02: #include <stdio.h> 03: 04: int main(void) 05: { 06: char ch; //char*형 변수의 선언 07: char *pc = &ch; 08: 09: int n; //int*형 변수의 선언 10: int *pi = &n; 11: 12: double d; //double*형 변수의 선언 13: double *pd = &d; 14: 15: int arr[3]; 16: int i; 17: 18: for(i = 0 ; i < 3 ; i++) //char*형에 정수를 더하는 연산 19: printf("pc+%d = %p\n", i, pc+i); 20: 21: for(i = 0 ; i < 3 ; i++) 22: printf("pi+%d = %p\n", i, pi+i); //int*형에 정수를 더하는 연산 23: 24: for(i = 0 ; i < 3 ; i++) 25: printf("pd+%d = %p\n", i, pd+i); //double*형에 정수를 더하는 연산 26: 27: for(i = 0 ; i < 5 ; i++) //포인터의 차를 구하는 연산 28: printf("&arr[%d]-&arr[0] = %d\n", i, &arr[i]- &arr[0]); 29: 30: return 0; 31: }
int arr[5] = { 12, 25, 37, 49, 53 } ; int *p=arr;
*p+1 13 *(p+2) 37 arr+3 arr[3]의 주소 *(arr+3) 49 *arr+4 16 p[4] 53 &arr[2] arr[2]의 주소 p+3 arr[3]의 주소 #include <stdio.h> const int MAX = 3; int main () { int var[] = {100, 200, 300}; int i; for (i = 0; i < MAX; i++) { printf(“Value of var[%d] = %d\n”, i, *(var+i) ); } return 0; }
#include <stdio.h> const int MAX = 3; int main () { int var[] = {100, 200, 300}; int *parr = var; int i; for (i = 0; i < MAX; i++) { printf(“Pointer Value of var[%d] = %d\n”, i, *(parr+i) ); printf(“Index Value of var[%d] = %d\n”, i, parr[i]); } return 0; }
2. 포인터와 배열 원소
▪ 배열의 원소를 가리키는 포인터는 배열의 어떤 원소든지 가리킬 수 있음
int arr[5] = {10, 20, 30, 40, 50}; int *p = &arr[2]; //p는 arr[2]를 가리킴 printf(“p[0] = %d”, p[0]); //p[0]은arr[2]를 의미하므로 30을 출력함 printf(“p[1] = %d”, p[1]); //p[1]은arr[3]를 의미하므로 40을 출력함
▪ 포인터가 배열의 원소가 아닌 일반 변수를 가리킬 때도 *(p+i) == p[i]는 항상 성립함
short data = 10; short *ptr = &data; ptr[0] = 20; //*p 대신 p[0] 처럼 사용할 수 있음
배열과 포인터의 차이점 ▪ 배열이 메모리에 할당되고 나면, 배열의 시작 주소 변경 불가
▪ 포인터 변수는 값을 변경할 수 있으므로, 포인터 변수에 보관된 주소는 변경 가능int x[5];
int y[5];
x =y;
x++; //컴파일 에러! 배열의 시작 주소는 변경할 수 없음!int x[5];
int y[5];
int *p = x;
p = y;
p++; //올바른 문장! 포인터에 저장된 주소는 변경 가능!포인터 연산
1. 포인터 증감 연산
▪ 포인터에대한증감 연산(++, --)도 포인터형에 의해 연산의 결과가 결정
#include <stdio.h> int main(void) { int arr[5] = {10, 20, 30, 40, 50}; int *p = &arr[0]; int i; //int *형 변수의 선언 for(i = 0 ; i < 5 ; i++, p++) printf("%d\n", *p); return 0; } //포인터 변수의 증가 연산
우선 순위 : p++ > ++p = *
2. 포인터 배열 처리
▪ 주소를 저장하는 배열
▪ 형식 : 데이터 타입 *포인터 변수명[크기];
int i; int a=1, b=2, c=3, d=4, e=5; int* arr[5] = {&a, &b, &c, &d, &e}; for( i = 0 ; i < 5 ; i++ ) printf("%d ", *arr[i]);
▪ 포인터 배열의 각 원소에 배열의 시작 주소를 저장할 수도 있음
int x[3] = {1, 2, 3}; int y[3] = {4, 5, 6}; int z[3] = {7, 8, 9}; int* arr[3] = {x, y, z}; //포인터 배열의 원소를 int배열의 시작 주소로 초기화함
▪ arr[i]가 int 배열의 시작 주소로 초기화되었을 때, arr[i]가 가리키 는 배열의 원소에 접근하려면 arr[i][j]로 기술
for( i = 0 ; i < 3 ; i++ ) { for( j = 0 ; j < 3 ; j++ ) printf( “%d”, arr[i][j] ); //*(arr[i]+j)와같은의미 printf( “\n” ); }
학습정리
1. 포인터와 배열
▪ 배열명은 배열의 시작 주소를 의미함
▪ 포인터 변수를 배열명으로 초기화한 경우 포인터 변수를 배열처럼 인덱스를 사용하는 것이 가능함
▪ 배열명은 변수가 아니므로 증감 연산자에 의한 연산은 불가능함
2. 포인터 이용
▪ 배열명을 포인터 변수와 같이 연산에 의해 배열요소를 참조할 수 있음
▪ 포인터 변수에 증감 연산자를 이용하여 배열요소를 참조할 수 있음
▪ 후위 증감 연산자가, 전위 증감 연산자보다 우선순위가 높음
'Blog > JAVA기반 스마트웹 개발2021' 카테고리의 다른 글
프로그래밍 언어 활용 part 1 - 구조체 (0) 2021.07.31 프로그래밍 언어 활용 part 1 - 포인터와 문자열 (0) 2021.07.31 프로그래밍 언어 활용 part 1 - 포인터 기초 (0) 2021.07.29 프로그래밍 언어 활용 part 1 - 문자열 (0) 2021.07.28 프로그래밍 언어 활용 part 1 - 배열 (0) 2021.07.28 댓글