Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- php
- backend
- Web
- ChatGPT
- BOF
- 파이썬
- Scala
- Linux
- hackthissite
- Javascript
- 러닝스칼라
- mysql
- 웹해킹
- 딥러닝
- 경제
- deep learning
- hackerschool
- Python
- 러닝 스칼라
- c++
- hacking
- 인공지능
- BOF 원정대
- 리눅스
- 챗GPT
- flask
- c
- 백엔드
- Shellcode
- webhacking
Archives
- Today
- Total
jam 블로그
[C] 18. 다차원 배열 그리고 포인터 본문
728x90
I. 2차원 배열 이름의 포인터 타입
2차원 배열 이름이 가리키는 것은?
- 1차원 배열이름과 마찬가지로 배열의 첫번째 요소를 가리키는 포인터 이다. 다음의 소스를 보자
- #include <stdio.h>
- int main()
{
int a[3][2] = {1,2,3,4,5,6}; - printf("a[0] : %d\n",a[0]);
printf("a[1] : %d\n",a[1]);
printf("a[2] : %d\n",a[2]); - printf("a : %d\n",a);
- printf("a[0][0] : %d\n",&a[0][0]);
return 0;
}
- 위의 소스의 결과값을 보다 시피 a나 a[0]나 &a[0][0] 다 같은 주소값이 나온다.
- 2차원 배열 이름 +1 : 배열 이름을 이용한 포인터 연산
- #include <stdio.h>
- int main()
{
int a[3][2] = {1,2,3,4,5,6}; - printf("a : %d\n",a);
printf("a+1 : %d\n",a+1);
printf("a+2 : %d\n",a+2);
printf("a[0] : %d\n",a[0]);
printf("a[1] : %d\n",a[1]);
printf("a[2] : %d\n",a[2]);
return 0;
}
위에서 보면 a == a[0], a+1 == a[1], a+2 == a[2] 와 같은 결과가 나온다.
- 즉 2차원배열 이름은 포인터 연산시 행 단위로 이동을 한다.는 것이다.
포인터의 타입에는 이동에 대한 정보가 들어 있다.
- 임의의 두 포인터 타입이 일치 한다면, 기본적으로 포인터 연산에 의해 증가 및 감소되는 값의 크기가 일치해야 한다고 결론 내릴수 있다.
- #include <stdio.h>
- int main()
{
int a[3][2] = {1,2,3,4,5,6};
int b[2][3] = {0,}; - printf("a : %d\n",a);
printf("a+1 : %d\n",a+1);
printf("a+2 : %d\n",a+2);
printf("b : %d\n",b);
printf("b+1 : %d\n",b+1);
printf("b+2 : %d\n",b+2);
return 0;
}
위의 소스의 결과를 보다 시피 주소값들의 차이는 데이터형의 크기 * 열의 수 이다.
- 따라서 2차원 배열 이름의 포인터 타입은 어떤 데이터형이자, 포인터 연산 시 배열요소를 몇칸씩 건너 뛰는 포인터 라는 것을 알수 있다.
최종 결론! 배열 이름의 포인터 타입
배열 포인터
- int (*pArr)[4]와 *pArr[4] 차이점
- int *pArr[4] 는 pArr[][4] 이런식으로 생각을 하면 편할 것이다.
- 2차원 배열에서의 arr[i]와 *(arr+1)
- #include <stdio.h>
- int main()
{
int a[3][2]={0,}; - printf("a[0] : %d\n",a[0]);
printf("*(a+0) : %d\n",*(a+0)); - printf("a[1] : %d\n",a[1]);
printf("*(a+1) : %d\n",*(a+1)); - printf("a[2] : %d\n",a[2]);
printf("*(a+2) : %d\n",*(a+2)); - printf("%d, %d\n",a[1][0],(*(a+1))[0]);
return 0;
}
- 위와 같이 arr[i]와 *(arr+1)는 같은 거라는 것을 알 수 있다. 또 2차원 배열 같은 경우 a[1][0],(*(a+1))[0] 이런식으로 나타 낼수 있다.
문제
18 -1
문제 1
a와 a[0]가 같고 a+1과 a[1]이 가 같은 의미를 지니는 것으로 보인다. 실제로 가리키는 주소 값은 같지만 특성에 있어서는 다소 차이를 지닌다. 다음 예제를 직접 실행해 보고, 어떠한 특성적 차이가 있는지 결론을 내려보기 바란다.
- #include<stdio.h>
- int main()
- {
- int arr[3][2] = {1,2,3,4,5,6};
- printf("arr : %d\n,",sizeof(arr));
- printf("arr[0] : %d\n",sizeof(arr[0]));
- printf("arr[1] : %d\n",sizeof(arr[1]));
- printf("arr[2] : %d\n",sizeof(arr[2]));
- return 0;
- }
18 -2
문제 1
다음 코드를 보고 빈칸에 들어갈 적절한 포인터 선언을 해보자
- #include<stdio.h>
- int main()
- {
- int* arr1[5];
- int* arr2[3][5];
- = arr1;
- = arr2;
- return 0;
- }
'개발 및 관련 자료 > C' 카테고리의 다른 글
[C] 21. 문자와 문자열 처리 함수 (0) | 2013.05.12 |
---|---|
[C] 19. 함수포인터와 void 포인터 (0) | 2013.05.12 |
[C] 17. 포인터의 포인터 (0) | 2013.05.12 |
[C] 16. 다차원 배열 (0) | 2013.05.12 |
[C] 14. 포인터와 함수에 대한 이해 (0) | 2013.05.12 |
Comments