팔만코딩경
/
Library DB
/
C언어 기초문법(?)
/
C언어 10강. 포인터2 pointer
/
LIST
Search
Share
LIST
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)
열의 개수가 고정인 임의의 행을 생성
배열 포인터
•
모든 포인터는 변수이다.
•
포인터를 사용하면 메모리를 다양한 방법으로 사용할 수 있다.
•
난해한 포인터 사용보다는 직관적인 코드를 사용하는 것이 효율적이다.
•
이중 포인터, 함수 포인터, 포인터 배열을 꼭 기억하자.
정리