팔만코딩경
/
Library DB
/
C언어 기초문법(?)
/
C언어 10강. 포인터2 pointer
Search
Share
C언어 10강. 포인터2 pointer
"잡으면 보존되고 놓으면 없어지며, 드나드는데 때가 없고, 어디로 가는지 알지 못한다는 것은 오직 마음을 두고 하는 말이다."
Gallery view
Search
LIST
다양한 포인터
•
포인터의 종류와 의미
◦
포인터, 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)
열의 개수가 고정인 임의의 행을 생성
배열 포인터
•
모든 포인터는 변수이다.
•
포인터를 사용하면 메모리를 다양한 방법으로 사용할 수 있다.
•
난해한 포인터 사용보다는 직관적인 코드를 사용하는 것이 효율적이다.
•
이중 포인터, 함수 포인터, 포인터 배열을 꼭 기억하자.
정리