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 |