본문 바로가기

Linux/C

[linux] 포인터#1

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;
}
=====================================================================


'Linux > C' 카테고리의 다른 글

[linux] 포인터#3  (0) 2015.05.14
[linux] 포인터#2  (0) 2015.05.13
[linux] 명령행 인자를 이용한 프로그램 실행  (0) 2015.05.11
[linux] 반복문( while )  (0) 2015.05.11
[linux] switch case 문  (0) 2015.05.11