C언어 [C언어 포인터의 연산]
포인터의 연산
포인터에 대한 증감 연산은 일반 연산처럼 증감값을 더하거나 빼라는 의미는 아니고 포인터 변수를 선언한 데이터 타입의
크기만큼 더하거나 빼라는 의미이다. 즉 프로그램에서 포인터 변수 '*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=# 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 입니다 |