# 포인터 연산

## TYPE형 포인터를 대상으로 `n`의 크기만큼 값을 증가 및 감소 시, `n * sizeof(TYPE)`의 크기 만큼 주소 값이 증가 및 감소

```c
#include <stdio.h>

int main(void)
{
    int arr[3]={11, 22 ,33};
    int * ptr=arr;      // int * ptr=&arr[0]과 같은 문장
    printf("%d %d %d \n", *ptr, *(ptr+1), *(ptr+2));

    printf("%d ", *ptr); ptr++;     // printf 함수 호출 후, ptr++ 실행
    printf("%d ", *ptr); ptr++;
    printf("%d ", *ptr); ptr--;
    printf("%d ", *ptr); ptr--;
    printf("%d ", *ptr); printf("\n");
    return 0;
}

/* 결과
11 22 33 
11 22 33 22 11 
*/
```

## 중요한 결론! `arr[i] == *(arr+i)`

---

# 상수 형태의 문자열을 가리키는 포인터

## 두 가지 형태의 문자열 표현

`⁠char str1[ ] = "My String";  // 배열의 길이는 자동으로 계산된다.`⁠

* 이는 배열을 기반으로 하는 ‘변수 형태의 문자열'
    

`⁠char * str2 = "Your String";`⁠

* 이렇게 선언을 하면 메모리 공간에 문자열이 저장되고, 문자열의 첫 번째 문자 `Y`의 주소 값이 반환
    
* 반환 값이 포인터 변수 `str2`에 저장
    

### 배열 이름 `str1`은 계속해서 문자 `M`이 저장된 위치를 가리키는 상태이어야 하지만 포인터 변수 `str2`는 다른 위치를 가리킬 수 있습니다.

```c
#include <stdio.h>

int main(void)
{
    char str1[]="My String";        // 변수 형태의 문자열
    char * str2="Your String";      // 상수 형태의 문자열
    printf("%s %s\n", str1, str2);

    str2="Our String";      // 가리키는 대상 변경
    printf("%s %s\n", str1, str2);

    str1[0]='X';        // 문자열 변경 성공!
    // str2[0]='X'; -> 실행 시 오류로 프로그램 종료 됌.        // 문자열 변경 실패!
    printf("%s %s\n", str1, str2);
    return 0;
}

/* 결과 
My String Your String
My String Our String
Xy String Our String */
```

---

# 포인터 변수로 이뤄진 배열: 포인터 배열

## 포인터 배열의 이해

* 포인터 배열: 포인터 변수로 이뤄진, 주소 값의 저장이 가능한 배열
    

`⁠int * arr1[20];  // 길이가 20인 int형 포인터 배열 arr1`

`double * arr2[30];  // 길이가 30인 double형 포인터 배열 arr2` 

```c
#include <stdio.h>

int main(void)
{
    int num1=10, num2=20, num3=30;
    int * arr[3]={&num1, &num2, &num3};

    printf("%d\n", *arr[0]);
    printf("%d\n", *arr[1]);
    printf("%d\n", *arr[2]);
    return 0;
}

/* 결과 
10
20
30 */
```

## 문자열을 저장하는 포인터 배열

`⁠char * strArr[3];`⁠

```c
#include <stdio.h>

int main(void)
{
    char * strArr[3]={"Simple", "String", "Array"};
    printf("%s\n", strArr[0]);
    printf("%s\n", strArr[1]);
    printf("%s\n", strArr[2]);
    return 0;
}

/* 결과
Simple
String
Array */
```
