일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- algorithm
- const
- RootMotion
- C
- IFileDialog
- directx
- NRVO
- Programmers
- 프로그래머스
- 팰린드롬 만들기
- RVO
- Unreal Engine5
- 오블완
- UE5
- DeferredRendering
- 백준
- softeer
- UnrealEngine4
- Frustum
- winapi
- UnrealEngine5
- 티스토리챌린지
- DirectX11
- GeeksForGeeks
- C++
- 2294
- 1563
- baekjoon
- 줄 세우기
- 언리얼엔진5
- Today
- Total
Game Develop
[C++] 포인터와 배열의 차이. 본문
배열은 선언과 동시에 정의를 해줘야한다.
그래서 보통 아래처럼 정의한다.
int arr[30];
int arr[]; // Error.
그리고 선언된 배열은 포인터변수와 다르게 상수이다. 해당 변수에 다른 값을 대입하지 못한다.
값을 대입하려 할 경우 l-value가 아니라며 컴파일에러가 뜬다.
이런점만 빼면 거의 대부분이 유사하긴 하다.
이외에 차이점을 좀 더 나열하자면 아래와 같다.
1. sizeOf를 사용할 때.
sizeof(포인터변수)
-> 포인터변수의 크기가 리턴된다. 포인터변수의 크기는 32bit컴파일러인지, 64bit컴파일러인지에 따라 다르다.
sizeof(배열)
-> 배열전체의 총 크기를 변환한다. int arr[3]인 경우, sizeof(int) * 3이 될 것이다.
2. 문자열
문자열을 char의 배열에 선언,정의 할 때와 char*에 선언,정의할 때 꽤 큰 차이가 있다.
char arr[] = "abcdefg";
위와 같은 경우, arr은 스택메모리에 할당되어있기 때문에 자유롭게 접근해서 값을 변경하는 등의 작업이 가능하다.
arr[2] = 'a' 등등...
그러나
char* temp = "abcdefg";
라고 선언할 경우, abcdefg는 스택이 아닌 메모리구조중 하나인 Data섹션에 ReadOnly로 저장되어진다.
그렇기 때문에 배열처럼 접근해서 값을 변경하는게 불가능하다.
애초에 최신버전의 C++인 경우, char* temp = "abcdefg"; 로 선언할 경우 컴파일에러를 띄워버린다.
abcdefg는 어차피 ReadOnly에 저장되기 때문에 앞에 const키워드를 붙이라고 에러를 띄운다.
그래서 애초에
const char* temp = "abcdefg" 이렇게 선언해야한다.
'C++ > C++' 카테고리의 다른 글
[C++] map에서 원소 넣을때 insert도 활용하자. (0) | 2022.10.29 |
---|---|
[C++] String 성능에 관하여 (0) | 2022.10.26 |
[C++] Hash (0) | 2022.09.11 |
[C++] C++에서 배열초기화하기 (0) | 2022.09.08 |
[C++] 클래스의 멤버함수에서, 속한 클래스의 인스턴스에 대해선 private접근 가능하다. (0) | 2022.09.05 |