제일 중요한거
arr=&arr[0]
&arr+i=&arr[i]
*(arr+i)= arr[i] 사실상 *(&arr[0]+i)라 봐도 무방함
1번
1
2
3
|
int arr[3]={1,2,3};
int *ptr=arr;
|
cs |
이때 arr==ptr은 성립하지 않는다
그러나
arr=&arr[0]이고 ptr=&arr[0]인건 맞음
arr==ptr인것은 배열 포인터에서만!
2번,3번
int *ptr=arr;
*ptr+=2; --> *(&arr[0])+=2 즉 arr[0]의 값에 2를 더하겠다는것
ptr++; --> ptr+1 == &arr[0]+1==&arr[1] 그래서 ptr은 arr[1]을 가리킨다.
*(ptr+i) == *(&arr[0]+i)==*(arr+i)==arr[i]
4번
출력값을 생각해보자.
1번) &arr --> 2차원 배열의 주소값이므로 대표값인 arr[0][0]
또는 &arr=&arr[0] 근데 arr[0]은 배열이므로
arr[0]의 주소값이라는 것은 arr[0] 배열의 대표값이기에 &arr[0][0]
(배열의 주소값== 배열의 대표값== 배열의 맨 앞의 값)
2번) arr --> arr=&arr[0]=&arr[0][0] (1번과 같은 이유)
arr=&arr[0] 배열 그자체 = 배열의 주소값= 배열의 가장 첫번째 값(대표값)
arr[0]=&arr[0][0]
arr[0]도 배열이고 arr[0]은 arr[0][0]의 주소값을 가리킴 (배열의 가장 첫번째 대표값)
문제에서 arr=&arr[0] --> arr[0]배열의 주소값, 즉 대표값인 첫번째값 arr[0][0]의 주소값을 가리킴
3번) *arr --> *(&arr[0]) =arr[0] arr[0]은 배열이기에
arr[0]을 ARR이라고 치환하면 ARR=&ARR[0]
ARR은 arr[0]이니까 사실상 &ARR[0]==&arr[0][0]
그니까 *arr도 &arr[0][0]
또는 arr[0]은 배열이니까 이거의 대표값이 주소값이 될것임 arr[0]==&arr[0][0]
4번) &arr[0] =arr==&arr[0][0]
또는 arr[0]배열의 주소값은 arr[0]배열의 대표값인 arr[0][0]을 의미
5번 ) arr[0] 은 arr[0]배열의 주소값과 같고 이는 arr[0]의 대표값인 &arr[0][0]
6번) *arr[0] 은 arr[0]이 arr의 0번째행 배열! 이므로 arr[0]은 대표값인 arr[0][0]의 주소값이고
*(&arr[0][0]) ==arr[0][0] 즉 0 이다.
7번) &arr[0][0] arr[0][0]의 주소값 그자체
8번) arr[0][0]이므로 0
4-1
1
2
3
4
5
6
7
8
9
10
|
int main() {
int arr[5][5] = { 5,4,3,2,1 };
if (*arr == arr[0]) { printf("ok"); }//ok
if (*arr == arr[0]) { printf("ok"); } //ok
if (*arr == &arr[0][0]) { printf("ok"); } //ok
cout << (*arr == arr[0]) << endl;
cout << arr[0];
}
|
cs |
첫번째 if
*arr은 *(&arr[0]) ==arr[0]
앞과 뒤가 같기에 ok출력
(무조건 arr=&arr[0]만 생각!)
++) arr[0]==&arr[0][0]
세번째 if
*arr=*(&arr[0])==arr[0]
arr[0]==&arr[0][0]
arr[0]은 arr[0]배열의 주소값을 가리키고 그건 첫번째 값
'C > 기말고사 대비(2022 1학기)' 카테고리의 다른 글
[기말고사 기출문제 풀이] 2016년 기말(가) (0) | 2022.06.08 |
---|---|
[C언어 시험대비] 정규표현식 (0) | 2022.06.06 |
[c언어 시험대비] static과 재귀 (0) | 2022.06.06 |
[C언어/기말] 포인터를 사용하는 이유 (0) | 2022.05.17 |
[C언어] 포인터 (0) | 2022.05.03 |
댓글