일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 논문작성법
- 수치해석
- Statics
- 고체역학
- JAX
- Linear algebra
- teps
- IEEE
- pytorch
- 딥러닝
- 우분투
- 인공지능
- obsidian
- Julia
- Python
- 옵시디언
- Zotero
- 텝스공부
- matplotlib
- ChatGPT
- MATLAB
- 텝스
- Numerical Analysis
- WOX
- Dear abby
- 생산성
- 수식삽입
- LaTeX
- 논문작성
- 에러기록
- Today
- Total
뛰는 놈 위에 나는 공대생
[C/C++] 포인터와 배열의 관계 본문
혼자 끄적이는 포인터와 배열에 대한 관계에 대한 글입니다.
정식된 내용은 책이나 다른 자료를 참고하세요.
1. 배열 이름은 무엇을 가리키는가?
정수 배열 int a[3]이 있을 때
a를 출력하면 a[0]을 가리키는 주소값으로 리턴한다.
a는 a[0]에 대한 포인터처럼 사용되는 것이다.
2. 배열 이름은 포인터와 똑같은가?
그러면 배열 이름인 a와 포인터와 동일시해도 되는 것인지 의문이 든다.
하지만 배열 이름 a와 일반 포인터 int *p (p는 임의로 정한 것)와는 차이가 있다.
포인터를 ++연산자를 사용했을 때 포인터가 가리키는 타입이 차지하는 메모리 바이트만큼 포인터가 가리키는 주소값 + 메모리 바이트 수(int는 4바이트 등)로 리턴하는데
배열 이름 a는 a++처럼 사용해도 a 자체는 고정된 주소값이라 ++연산을 해도 소용이 없다.
심지어 (&a[0])++로 표현해도 &a[0]이 변경되지 않는 값이라해서 error가 뜬다.
즉, ++연산자를 사려면 &a[0] 또는 a 값을 포인터 변수에 넣고 연산을 해야한다.
3. 배열과 포인터의 차이점
배열 이름 a가 첫번째 원소를 가리키는 포인터처럼 사용되는 경우가 많지만, 예외적인 경우는 sizeof 와 주소값 연산자 &를 사용할 때다.
sizeof(a)는 배열 a가 차지하는 메모리 양을 리턴 (포인터라면 포인터가 차지하는 메모리 양을 리턴하지만 배열 a는 메모리를 차지하지 않기 때문에 a라는 이름 하에 저장되어있는 값들의 메모리 양을 리턴함)
&a는 배열을 가리키는 포인터에 대입할 때 사용한다.
예를 들면
int a[3] = {1,2,3};
int (*pointer)[3] = &a
이런 식으로 pointer 변수는 정수 3개로 이루어진 배열을 가리키기 위한 pointer가 된다.
만약 괄호없이 int *pointer[3]으로 하면 int를 가리키는 포인터로 구성된 배열이 된다.
'프로그래밍 Programming' 카테고리의 다른 글
[프로그래밍] MPI를 windows에서 사용하는 방법 (0) | 2022.07.26 |
---|---|
[매트랩MATLAB] Symbolic expression에서 미분 및 적분 수행 (0) | 2022.07.02 |
Git bash 명령어 정리 (5) 협업을 위한 관리 (0) | 2021.07.20 |
Git bash 명령어 정리 (4) 깃허브 (0) | 2021.07.20 |
Git bash 명령어 정리 (3) 브랜치 (0) | 2021.07.20 |