Computer Science/Algorithm

[배열과 포인터] 포인터 증감연산

해피단무지 2020. 10. 14. 12:39
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	/* test 1 */
	int arr[5] = {10,20,30,40,50};
    int *p = arr;
    
    printf("%d ", *p);
    printf("%d ", *p++);
    printf("%d ", (*p)++);
    printf("%d ", *(p++)); //왜 21이 나오지?, p++먼저 해서 p의 주소값을 하나 올리고 그 값을 출력하니까 30 아닌가?

    printf("%d ", *p);
    printf("\n\n");
    
    /* test 2 */
    int arr1[5] = {10,20,30,40,50};
    int *p = arr1;
    
    printf("%d ", *p);
    printf("%d ", ++*p);
    printf("%d ", ++(*p));
    printf("%d ", *(++p));
    printf("%d ", *++p);
    printf("%d ", *p);
    printf("\n\n");
    
    /* test 3 */
    int *arr2 = (int *)malloc(sizeof(int)*5);
    arr2 = arr1;
    *++arr2;
    
    /* test 4 */
    int arr3[5] = {10,20,30,40,50};
    *arr3++;	//error
    *++arr3;	//error
    
    /* test 5 */
    int a1 = 5;
    int a2 = 5;
    printf("%d ", a1++);
    printf("%d ", ++a2);
    
}

1. (test 1, test 2) 포인터로 받아온 배열은 증감 연산이 가능하다. 즉, 정적배열의 포인터를 copy한 것은 변경(증감연산)이 가능하다.

test 1 수행 결과: 10 10 20 21 30

test 2 수행 결과: 10 11 12 20 30 30

2. (test 3) 동적배열의 포인터는 증감연산이 가능하다.

3. (test 4) 배열 자체로는 증감 연산이 불가능하다. 즉, 정적배열의 포인터는 상수(const)포인터이므로 변경이 불가능하다. 정적배열은 내부에서 이름이 int * const 형태로 선언된다.

error 메세지: pointeradd.c:33:3: error: lvalue required as increment operand *++arr3;

4. (test 5) 기본 실험. 

수행 결과: 5, 6