Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Trivia

2강.포인터(2) 본문

C언어/C프로그래밍 기초(2학기)

2강.포인터(2)

Vloom 2018. 9. 23. 20:47

1.4 포인터 연산


▶덧셈, 뺄셈 연산

  • 포인터 변수에 대한 연산은 일반적인 변수에 대한 연산과는 약간 상이
  • 증가, 감소되는 값은 포인터가 가리키는 객체의 크기

cf) 객체의 크기에 따라서 증가, 감소되는 값이 달라짐


포인터 타입 

++연산 후 증가되는 값 

char 

int 

float 

double 


ex) 예제 프로그램 : 포인터의 증감연산

//포인터의 증감 연산

#include <stdio.h>


int main()

{

    char *pc;

    int *pi;

    double *pd;


    pc=(char *)10000;

    pi=(int *)10000;

    pd=(double *)10000;

    printf("증가 전 pc=%d, pi=%d, pd=%d\n", pc, pi, pd);


    pc++;

    pi++;

    pd++;

    printf("증가 후 pc=%d, pi=%d, pd=%d\n", pc, pi, pd);


    return 0;

}



증가 전 pc=10000, pi=10000, pd=10000

증가 후 pc=10001, pi=10004, pd=10008


간접 참조 연산자와 증가 연산자

  • *p++; : p가 가리키는 위치에서 값을 가져온 후에 p를 증가 (주소값)
  • (*p)++; : p가 가리키는 위치의 값을 증가 (데이터값)

수식 

의미 

v = *p++ 

p가 가리키는 값을 v에 대입한 후, p를 증가 

v = (*p)++

p가 가리키는 값을 v에 대입한 후, 가리키는 값을 증가 

v = *++p 

p를 증가시킨 후에 p가 가리키는 값을 v에 대입

v = ++*p

p가 가리키는 값을 가져온 후, 그 값을 증가하여 v에 대입 


ex) 예제 프로그램 : 포인터의 증감연산(2)

//포인터의 증감연산

#include <stdio.h>


int main()

{

    int i = 39;

    int *pi=&i;


    printf("i = %d, pi = %p\n", i, pi);

    

    (*pi)++;    //pi가 가리키는 위치의 값을 증가

    printf("i = %d, pi = %p\n", i, pi);

    

    *pi++;      //pi가 가르키는 위치에 값을 가져온 후에 pi를 증가

    printf("i = %d, pi = %p\n", i, pi);


    return 0;

}



i = 39, pi = 0060FF08

i = 40, pi = 0060FF08

i = 40, pi = 0060FF0C


▶포인터의 형변환

  • 형변환 연산자를 포인터 변수 앞에 기술
  • 누락 시 컴파일 경고 발생

1.5 포인터와 배열


▶포인터와 배열은 아주 밀접한 관계


ex) 예제 프로그램 : 포인터와 배열의 관계

//포인터와 배열의 관계

#include <stdio.h>


int main()

{

    int a[] = {10, 20, 30, 40, 50};

    

    printf("a = %u\n", a);

    printf("a+1 = %u\n", a+1);

    printf("*a = %d\n", *a);

    printf("*(a+1) = %d\n", *(a+1));

    

    return 0;

}



a = 6356732

a+1 = 6356736

*a = 10

*(a+1) = 20


▶인덱스 표기법을 포인터에 사용 가능


ex) 예제 프로그램 

//포인터를 배열 이름처럼 사용

#include <stdio.h>


int main()

{

    int a[] = {10, 20, 30, 40};

    int *p;


    p=a;

    printf("a[0]=%d, a[1]=%d, a[2]=%d\n", a[0], a[1], a[2]);

    printf("p[0]=%d, p[1]=%d, p[2]=%d\n", p[0], p[1], p[2]);


    p[0] = 60;

    p[1] = 70;

    p[2] = 80;

    printf("\n");


    printf("a[0]=%d, a[1]=%d, a[2]=%d\n", a[0], a[1], a[2]);

    printf("p[0]=%d, p[1]=%d, p[2]=%d\n", p[0], p[1], p[2]);


    return 0;

}



a[0]=10, a[1]=20, a[2]=30

p[0]=10, p[1]=20, p[2]=30


a[0]=60, a[1]=70, a[2]=80

p[0]=60, p[1]=70, p[2]=80


▶포인터를 사용한 방법의 장점

  • 원소의 주소를 계산할 필요가 없기 때문에 인덱스 표기법보다 처리가 빠름

<인덱스 표기법 사용>

int get_sum(int a[], int n)

{

int i;

int sum = 0;


for(i = 0; i < n; i++)

sum += a[i];


return sum;

}


<포인터 사용>

int get_sum2(int a[], int n)

{

int i;

int *p;

int sum = 0;


p = a;

for(i = 0; i < n; i++)

sum += *p++;


return sum;

}


'C언어 > C프로그래밍 기초(2학기)' 카테고리의 다른 글

9강.구조체(3)  (0) 2018.12.09
8강.구조체(2)  (0) 2018.12.03
7강.구조체(1)  (0) 2018.11.21
1강.포인터(1)  (0) 2018.09.12