o 포인터
포인터 : 메모리의 주소를 의미한다.
포인터 변수 : 메모리 주소를 저장하는 변수를 의미한다.
포인터 변수 크기 : 4byte 크기를 가진다.
포인터 변수 선언 : 데이터형 *변수명 선언한다. e.g. int *p;
포인터 증가 : 포인터를 데이터형 만큼 증가한다.
포인터 감소 : 포인터를 데이터형 만큼 감소한다.
=====================================================================
LAB> 포인터 예제1
-- point1.c --
/*
* fname : point1.c
*/
#include <stdio.h>
int main()
{
int i;
int *p;
i = 10;
p = &i;
printf("i = %d \n", i);
printf("p = %p , *p = %d \n", p, *p);
return 0;
}
-- point1.c --
-- 실행결과 --
i = 10
p = 0xbf8c63dc , *p = 10
-- 실행결과 --
=====================================================================
=====================================================================
LAB> 포인터 예제2
/*
* fname : point2.c
*/
#include <stdio.h>
int main()
{
char message[] = "Hello World";
char *p;
int i = 0;
p = &message[0];
while(*p)
{
printf("message[%d] = '%c' \n", i, *p);
i++;
p++;
}
return 0;
}
-- 디버깅 --
b main
r
display message
display i
display p
n
:
:
3: p = 0xbfffe9d0 "Hello World"
2: i = 0
1: message = "Hello World"
(gdb) x/s 0xbfffe9d0
0xbfffe9d0: "Hello World"
(gdb) x/c 0xbfffe9d0
0xbfffe9d0: 72 'H'
n
:
:
3: p = 0xbfffe9d1 "ello World"
2: i = 1
1: message = "Hello World"
(gdb) x/c 0xbfffe9d1
0xbfffe9d1: 101 'e'
-- 디버깅 --
=====================================================================
=====================================================================
LAB> 함수 테스트 5
- 포인터 변수를 이용한 테스트
# vi func5.c
-- func5.c --
#include <stdio.h> // puts
#include <stdlib.h> // exit
void testfunc(int *p1,int *p2, int *p3)
{
puts("Hello testfunc");
*p1 = *p1 + 1; // (*p1)++;
*p2 = *p2 + 1; // (*p2)++;
(*p3)++;
}
int main()
{
int i, j, k;
i = 3;
j = 4;
k = 5;
printf("i = %d, j = %d, k = %d \n", i, j, k); // 3, 4, 5
testfunc(&i, &j, &k);
printf("i = %d, j = %d, k = %d \n", i, j, k); // 4, 5, 6
exit(0); // return 0;
}
-- func5.c --
-- 실행결과 --
i = 3, j = 4, k = 5
Hello testfunc
i = 4, j = 5, k = 6
-- 실행결과 --
-- 디버깅 --
b main
r
display i
display j
display k
n
:
3: k = 5
2: j = 4
1: i = 3
- i, j, k 의 변수 값이 세팅된 후에 메모리 주소를 출력하면
- 각 변수의 메모리주소가 출력된다.
- 참고로 스택영역은 High -> Low 로 자라기 때문에 변수의 선언된
- i, j, k 순으로 스택에 저장된다.
- 메모리의 저장순서는 아래와 같다.
- i : 0xbfffe9f0 ~ 0xbfffe9f3
- j : 0xbfffe9ec ~ 0xbfffe9ef
- k : 0xbfffe9e8 ~ 0xbfffe9eb
(gdb) print &i
$1 = (int *) 0xbfffe9f0
(gdb) print &j
$2 = (int *) 0xbfffe9ec
(gdb) print &k
$3 = (int *) 0xbfffe9e8
(gdb) s
testfunc (p1=0xbfffe9f0, p2=0xbfffe9ec, p3=0xbfffe9e8) at func5.c:6
6 puts("Hello testfunc");
n
n
:
c
(gdb) c
Continuing.
i = 4, j = 5, k = 6
-- 디버깅 --
=====================================================================
=====================================================================
#include <stdio.h>
int main ()
{
char c = 'A';
printf("%d\n", sizeof(c));
printf("%c\n", c);
return 0;
}
=====================================================================