pointer array and array pointer {Pointer Artithmetic}
what do you mean by
int (*ptr)[10]
A) ptr is an array of pointers to 10 integers
B) ptr is a pointer to an array of 10 integers
C) ptr is an array of 10 integers
D) Invalid statement
์ ๋ต์ D์ธ ์ค ์์์ผ๋ B์๋ค. ๊ผญ ๋ณ์๋ช
์์ *
์ ๋ถ์ด๊ณ ๊ดํธ๋ก ๊ฐ์ผ๋ค๊ณ ๊ทธ๊ฒ์ด ํจ์ํฌ์ธํฐ๋ผ๋ ๊ฒ์ ์๋๋ค. ์ฒ์์ ํจ์ํฌ์ธํฐ์ ํํ type (*var_name)(args)
๊ฐ ์๋๋ผ๊ณ ํ๋จํ์ฌ D๋ฅผ ์ฐ์ ๊ฒ์ด์๊ณ , ์ฌ์ค ์ด๊ฒ์ ํฌ์ธํฐ ๋ฐฐ์ด๊ณผ ๋ฐฐ์ด ํฌ์ธํฐ ์ฌ์ด์ ๊ด๊ณ์ ๋ํ ๋ด์ฉ์ ์ดํดํ๊ณ ์๋์ง์ ๋ํ ๋ฌธ์ ์๋ ๊ฒ์ด๋ค.
int *ptr[10]
๋ ์ฐ์ฐ์ ์ฐ์ ์์ ๊ท์น์ ์ํด int * (ptr[10])
์ผ๋ก ๋ณํ๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋๋ก ์ฝ์ผ๋ฉด int * ์์ 10๊ฐ๋ฅผ ๋ด์ ptr์ด ๋๋ค. ํ์
์ int *[10]
์ด๋ค. stride๋ 10์ด๋ค.
int (*ptr)[10]
๋ int ์์ 10๊ฐ๋ฅผ ๋ด์ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๋ค. ํ์
์ int (*)[10]
์ด๋ค. stride๋ 10์ด๋ค.
int ptr[10]
๋ int ์์ 10๊ฐ๋ฅผ ๋ด์ ๋ฐฐ์ด์ด๋ค. ํ์
์ int [10]
์ด๋ค. stride๋ 10์ด๋ค. ์ค์ํ ์ ์ ptr == &ptr
์ด๋ผ๋ ์ ์ด๋ค. ์์ธํ ์ ๋ณด๋ #array pointer๋ฅผ ์ฐธ๊ณ ํ๋ผ.
int *ptr
๋ int ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๋ค. ํ์
์ int *
์ด๋ค. stride๋ 1์ด๋ค.
array pointer and array
์ ์ ํ ์์๋ค์ด ์๊ธฐ์ ๊ฐ์ ธ์๋ค. ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ ptr
๋ arr
์ ์ฃผ์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ์๋ค. *ptr
์ arr
์ ์ฒซ๋ฒ์งธ ์์์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ ํ
๋ฐ, ์ฌ์ค ๋ ๊ฐ์ ๊ฐ๋ค! ๋๋ ์ฒ์์ ๋ณ๋์ arr
๋ฅผ ์ํ ๊ณต๊ฐ๊ณผ ๋ฐฐ์ด {1, 2, 3, 4, 5}
๋ฅผ ์ํ ๊ณต๊ฐ์ด ๋ง๋ จ๋ ๋ค์ arr
์ด ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์์ ์ฃผ์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ผ๋ก ์๊ฐํ์ผ๋ ๋์ ์๊ฐ์ด ํ๋ ธ๋ค.
๋ค๋ง, arr
๊ณผ &arr
์ด ์์ ํ ๊ฐ์ ๊ฒ์ ์๋๋ค. ์๋์ ์์๋ฅผ ํตํด ๋ณด๊ฒ๋๋ฉด, sizeof(arr) = 20
์ธ๋ฐ ๋ฐํด sizeof(&arr) = 8
์ด๋ผ๋ ์ ์ด๋ค. ๋ ์ฐจ์ด์ ์ ๊ถ๊ธํด ํ ์ด๋ค ์ฌ๋์ด ์ง๋ฌธ์ ์ฌ๋ ธ๊ณ https://stackoverflow.com/a/2528328/21369350 ์์ ํ์ธํด ๋ณด๊ธฐ ๋ฐ๋๋ค.
ํ ๋ง๋๋ก ์ ๋ฆฌํ์๋ฉด, arr
์ stride๋ 1์ด๊ณ , &arr
์ stride๋ N์ด๋ค.
arr
sizeof(arr)
is number of element * size of element type- stride of
arr
is 1
&arr
sizeof(&arr)
is size of pointer type- stride of
&arr
is N
long arr[] = {1, 2, 3, 4, 5};
long *p = arr;
long(*arrptr)[5] = &arr;
long *ptrarr[5] = {arr, arr + 1, arr + 2, arr + 3, arr + 4};
p: 140731009609168
arrptr: 140731009609168 # arrptr๋ &arr์ด๋ค
ptrarr: 140731009609200 # ptrarr๋ ๋ณ๊ฐ์ ๋ฐฐ์ด์ด๋ค.
arr: 140731009609168 # stride 5์ง๋ฆฌ ๋ฐฐ์ด์ ์ฃผ์
&arr: 140731009609168 # stride 1์ง๋ฆฌ
*p: 1
*arrptr: 140731009609168 # *arrptr๋ arr์ด๋ค
*ptrarr: 140731009609168 # *ptrarr๋ arr์ด๋ค
*arr: 1
sizeof(p): 8 # pointer 8byte
sizeof(arrptr): 8 # pointer 8byte
sizeof(ptrarr): 40 # pointer 8byte * 5
sizeof(arr): 20 # int 4byte * 5
sizeof(&arr): 8 # pointer 8byte
sizeof(*p): 4
sizeof(*arrptr): 20
sizeof(*ptrarr): 8
sizeof(*arr): 4
&arr[5]: 140731009609188
&arr + 1: 140731009609188
arrptr + 1: 140731009609188
ptrarr + 1: 140731009609208