Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
관리 메뉴

Hello Security World

C언어 [C언어 포인터의 연산] 본문

프로그래밍/C

C언어 [C언어 포인터의 연산]

프로앱등이 2020. 5. 3. 19:36

포인터의 연산

포인터에 대한 증감 연산은 일반 연산처럼 증감값을 더하거나 빼라는 의미는 아니고 포인터 변수를 선언한 데이터 타입의

크기만큼 더하거나 빼라는 의미이다. 즉 프로그램에서 포인터 변수 '*p'를 선언하여 일반 변수 'a'의 값을 저장한 'po' = &a;'

(포인터 변수에는 오직 주소만 들어감) 변수에 'po+1'을 더할 경우 '35+1' 이 되지 않는다. 값이 저장되어 있는 메모리 공간

의 주소 '1244996'에 1을 더함은 int형(4byte) 로 포인터 변수가 선언 되었다면 메모리 공간의 4byte를 증가시켜 메모리주소

'1244996+4' 가 되는것이다.

유형

연산자

산술 연산자

+,-,++,--

주소 연산자

&,*

대입 연산자

=,+=,-=

기타 연산자

sizeof

이러한 연산자만 포인터 변수에 사용할 수 있고 곱하거나 나누기 같은 연산은 수행하지 못한다. 다만, 포인터 변수끼리는 뺄셈만 가능하고

덧셈은 처리할 수 없음 을 반드시 알아두어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
void main(){
   int num,*p;
   num=28;
   p=&num;
   
   printf("일반 변수 num의 값[%d] \n",num);
   printf("포인터 변수 *p의 값[%d] \n",*p);
   printf("포인터 변수 p-1의 값[%d] \n",p-1);
   printf("주소 &num의 값을 대입한 p의 값[%d] \n",p);
   printf("포인터 변수 opt+1의값[%d] \n",p+1);
}
 
출력결과:
일반 변수 num의 값[28]
포인터 변수 *p의 값[28]
포인터 변수 p-1의 값[6487616]
주소 &num의 값을 대입한 p의 값[6487620]
포인터 변수 opt+1의값[6487624]
 

 

포인터 변수에서의 증감 연산자 활용 예

활용 예

설명

*po + 1

포인터 변수 po가 가르키고 있는 주소에 저장된 값을 1증가

*(po+1)

포인터 변수 po가 갖고 있는 주소를 1증가 시킨 후 주소의 값을 구함

*po++

포인터 변수 po가 가리키는 주소의 저장된 값을 구한 후 p를 1증가

(*po)++

포인터 변수 po가 가르키고 있는 주소의 저장된 값을 구한 다음 그 값에 1을 증가시킴

*++po

포인터 변수 po를 1 증가 시킨 다음에 해당 주소에 있는 값을 구함

++*po

포인터 변수 po가 가르키고 있는 값을 구한 다음에 그 값을 1을 더함

예제) 포인터를 사용하여 배열 요소의 합을 구하는 프로그램

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
//포인터를 사용하여 배열 요소의 합을 구하는 프로그램 
int main()
{
    int i;
    int hap=0;
    int arr[5= {10,20,30,40,50};
    int* p;
    p = arr; //배열은 & 사용하지 않음 왜냐? 배열은 그 자체로 배열 시작주소를 가짐 
    
    for(i=0;i<5;i++)
    {
        hap+= *(p+i); 
    }
    printf("배열의 각 원소의  합은 %d 입니다",hap);
    
}
실행결과
배열의 각 원소의  합은 150 입니다