"잡으면 보존되고 놓으면 없어지며, 드나드는데 때가 없고, 어디로 가는지 알지 못한다는 것은 오직 마음을 두고 하는 말이다."
Gallery view
Search
다양한 포인터
•
포인터의 종류와 의미
◦
포인터, int *ptr; // ★★★★★
int 형 메모리 주소를 저장하는 변수선언
◦
이중 포인터, int **ptr; // ★★
int *형 메모리 주소를 저장하는 변수선언
◦
배열 포인터, int (*ptr)[3]; // ?
열의 개수가 3개인 int형 이차원 배열의 메모리 주소를 저장하는 변수선언
열의 개수가 고정
◦
함수 포인터, int (*function)(int) // ★★★
함수의 메모리 주소를 저장하는 변수선언
◦
void 포인터, void *ptr; // ★★★★
모든 데이터형의 주소를 저장하는 변수선언
사용할 때는 반드시 형 변환(type casting)을 해야한다.
◦
포인터 배열, int *ptr[3]; // ★★★★
3개의 열을 가진 배열의 메모리 주소를 저장하는 배열선언
다양한 포인터
이중 포인터
•
역할
◦
포인터 변수의 메모리 주소를 저장하는 변수
•
형식
데이터형 **변수명
→ int **ptr;
•
활용
◦
포인터 변수의 메모리 주소를 저장
◦
열의 개수가 서로 다른 배열을 생성
•
이중 포인터 활용(1)
포인터 변수의 메모리 주소를 저장
#include <stdio.h>
#include <stdlib.h>
int main(void){
int var = 12;
int *ptr;
int **pptr;
ptr = &var;
pptr = &ptr;
printf("%ld %ld %p %p %p\n", sizeof(ptr), sizeof(pptr), ptr, pptr, &pptr);
printf("%p %p %d\n", pptr, *pptr, **pptr);
return 0;
}
C
복사
•
이중 포인터의 활용(2)
열의 개수가 서로 다른 배열을 다룸(배열보다는 메모리를 다룬다고 생각할 수 있다.)
int **pptr;
◦
이중포인터는 메모리를 생성하는 기능이 없다. 변수 이기 때문이다. 변수의 특징은 값을 저장하는데 포인터변수의 메모리 주소를 저장하고 접근 할 수 있다.
1단계 : pptr = (int **)malloc(sizeof(int *) * 3);
2단계 :
pptr[0] = (int*)malloc(sizeof(int) * 4);
pptr[1] = (int*)malloc(sizeof(int) * 2);
pptr[2] = (int*)malloc(sizeof(int) * 3);
#include <stdio.h>
#include <stdlib.h>
int main(void){
int **pptr, i;
pptr = (int**)malloc(sizeof(int*)*3); // 행 선언
pptr[0] = (int*)malloc(sizeof(int)*4); // 열 선언
pptr[1] = (int*)malloc(sizeof(int)*2); // 열 선언
pptr[2] = (int*)malloc(sizeof(int)*3); // 열 선언
pptr[0][0] = 1;
pptr[0][1] = 2;
pptr[0][2] = 3;
pptr[0][3] = 4;
pptr[1][0] = 10;
pptr[1][1] = 20;
pptr[2][0] = 100;
pptr[2][1] = 200;
pptr[2][2] = 300;
printf("%d %d %d %d\n", pptr[0][0], pptr[0][1], pptr[0][2], pptr[0][3]);
printf("%d %d\n", pptr[1][0], pptr[1][1]);
printf("%d %d %d\n", pptr[2][0], pptr[2][1], pptr[2][2]);
for(i = 0; i < 3; i++){
free(pptr[i]); // 각각 시작하는 메모리주소를 가지고 있다. 열을 선언한 메모리를 해제하는 행동
}
free(pptr); // 행 선언한 메모리를 해제 하는 행동
return 0;
}
C
복사
•
이중 포인터의 활용(3)
길이가 다른 문자열을 다룰 때 → 메뉴 구성
ex)
1. 관리자 모드
2. 로그인
3. 로그아웃
C
복사
#include <stdio.h>
#include <stdlib.h>
int main(void){
char menu1[] = "1. 관리자 모드";
char menu2[] = "2. 로그인";
char menu3[] = "3. 로그아웃";
char **ppmanu;
int i;
ppmanu = (char**)malloc(sizeof(char*)*3);
ppmanu[0] = menu1;
ppmanu[1] = menu2;
ppmanu[2] = menu3;
printf("------(( 메뉴 ))------\n");
for(i = 0; i < 3; i++){
printf("%s\n", ppmanu[i]);
}
printf("----------------------\n");
free(ppmanu);
return 0;
}
C
복사
이중포인터
•
이중포인터
◦
이중포인터는 변수이다. 그리고 그 변수를 통해서 메모리 주소를 취합할 수 있는 역할을 할수 있는게 이중포인터라고 볼 수 있다.
◦
이중포인터는 여러가지 생성을 통해서 그와 같은 임의의 길이를 가진 열을 모아서 이차원 배열이라는 하나의 단위를 만들 수 있다.
•
포인터 배열은
◦
이차원 배열의 행의 대한 부분이 이미 고정되어 있는 상태에서 각가 열이 다른 배열을 다룰수 있게 해주는게 포인터 배열이다.
◦
이중포인터보다 포인터 배열이 보다 다루기가 쉽다.
포인터 배열
•
역할
메모리 주소를 저장하는 배열
•
형식
데이터형 *ptr[열 개수];
예) int *ptr[3];
→ int형 메모리 주소 3개를 저장하는 배열
ptr[0], ptr[1], ptr[2]
•
활용
◦
임의의 열 길이를 가지는 배열을 연결할 수 있음
◦
길이가 다른 문자열을 다룰 때 자주 사용됨
포인터 배열의 활용(1)
포인터 배열
•
상당히 많이 사용하게 되는 포인터이다.
•
역할
함수의 메모리 주소를 저장하고 호출하는 역할
•
형식
리턴 데이터형(*함수 포인터명)(매개변수)
예 : int(*pfunc)(int, int);
함수 포인터
•
역할
◦
열의 개수가 같은 이차원 배열의 메모리 주소를 저장하는 역할
◦
열의 개수가 고정된 임의의 행을 생성하여 다룰 수 잇다.
•
형식 : 3개의 열을 가지는 경우
데이터형 (*변수명)[열의 개수];
→ int (*ptr)[3];
•
활용
◦
이차원 배열의 메모리 주소를 저장
◦
이차원 배열을 함수의 매개변수로 전달할 때
◦
열의 개수가 고정인 임의의 행을 다룰 때
•
배열 포인터의 활용(1)
이차원 배열을 다룰 때 사용
// 이차원 배열을 다룰때 사용하는 예
#include <stdio.h>
int main(void){
int array[2][3] = {{10, 20, 30}, {100, 200, 300}};
int (*ptr)[3];
int i;
ptr = array;
for(i = 0; i < 2; i++){
printf("%d %d %d\n", ptr[i][0], ptr[i][1], ptr[i][2]);
}
return 0;
}
C
복사
•
배열 포인터의 활용(2)
이차원 배열을 매개변수로 전달할 때
//이차원 배열을 매개변수로 전달할 때
#include <stdio.h>
// 행의 대한 정보
void add(int (*ptr)[3], int count){
int i, j;
for(i = 0; i < count; i++){
for(j = 0; j < 3; j++){
++ptr[i][j];
}
}
}
int main(void){
int array[2][3] = {{1, 2, 3}, {4, 5, 6}};
int i, j;
add(array, 2);
for(i = 0; i < 2; i++){
for(j = 0; j < 3; j++){
printf("%d", array[i][j]);
}
putchar('\n');
}
return 0;
}
C
복사
•
배열 포인터의 활용(3)
열의 개수가 고정인 임의의 행을 생성
배열 포인터
•
모든 포인터는 변수이다.
•
포인터를 사용하면 메모리를 다양한 방법으로 사용할 수 있다.
•
난해한 포인터 사용보다는 직관적인 코드를 사용하는 것이 효율적이다.
•
이중 포인터, 함수 포인터, 포인터 배열을 꼭 기억하자.
정리
