C, C++

포인터 연산과 배열 표현(심화 연습편)

SuuuuuuuL 2018. 12. 19. 16:14
    int ary[3] ={10,20,30};
    int* ptr[3]= {ary, ary+1, ary+2}; // 주소를 담고 있는 배열 (포인터배열)
    int **p[3]= {ptr, ptr+1, ptr+2}; // 포인터의 값을 담고 있는 배열

    printf("%d, %d, %d\n",*ptr[0],*ptr[1],*ptr[2]);
    printf("%d, %d, %d\n",***p,***(p+1),***(p+2));
    printf("%d, %d, %d\n",**p[0],**p[1],**p[2]);
    // 셋 다 동일한 결과값이 나옴


포인터연산과 배열 


포인터연산에서의 +1은 대표값만큼 더해준다는 의미


배열명 +1 = 배열의 주소값이므로 

(단순한 +1연산이 아니라 해당 주소값이 나타내는 덩어리 = 해당 배열의 하나의 요소만큼을 더해준다고 생각하자) 

int main(){
    int a[]= {0,1,2,3,4};
    int *p[]= {a,a+1,a+2,a+3,a+4};
    int **pp= p;// 단일변수, 배열이 아님


    pp++;
    printf("%u %u %u\n", pp-p, *pp-a,**pp);

    *pp++; // 연산자 우선순위는 ++, * 은 같은 단항연산자라서 앞에서 순차대로...인데 맨앞의 *은 의미가 없다.
    printf("%u %u %u\n", pp-p, *pp-a,**pp);
    
    *++pp;
    printf("%u %u %u\n", pp-p, *pp-a,**pp);

    pp=p; // 초기화시켜줌

    **pp++; // 순서대로 뒤에서 앞으로 연산하면 된다
    printf("%u %u %u %u\n", pp-p, *pp-a,**pp, pp);
    *++*pp;
    printf("%u %u %u %u\n", pp-p, *pp-a,**pp, pp);
    ++**pp;
    printf("%u %u %u %u\n", pp-p, *pp-a,**pp, pp);
결과값 

1 1 1

2 2 2

3 3 3

------초기화 

1 1 1

1 2 2

1 2 3

 

---------풀이-----------


첫번째 pp++;의 경우 

pp=204 , pp값에+1 하면 204가 됨(포인터연산) 

p=200, a=100 , *pp=104 **pp =1 이 되므로 결과값은 1,1,1 이 됨 같은 방식으로 아래도 풀이가능 


PP

@200

 

 

 

 

P-주소

@200

@204

@208

@212

@216

@100

@104

@108

@112

@116

A-주소

@100

@104

@108

@112

@116

(int)

0

1

2

3

4