[C++] 포인터 vs 배열
포인터 vs 배열
인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다.
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!
포인터 vs 배열
문자열 = 문자 배열
const char msg1[] = { 'H','e', 'l', 'l', 'o', '\0' }; // 끝났다는 의미로 아스키코드 null인 '\0' 입력
cout << msg1 << endl;
" " 형태의 문자열은 const char[ ] 형태이다.
"Hello World"를 받을 때는 아래의 코드와 같이
const char* test1 = "Hello World"; (O)로 받아야 한다.
char* test1 = "Hello World"; (X)와 같이 const를 빼면 에러가 난다.
char test2 [] = "Hello World"; (O)와 같이 포인터를 빼면 가능하다.
// .data 주소[H][e][l][l][o][][W][o][r][l][d][\0]
// test1[ 주소 ] << 8바이트(64비트 프로그램)
const char* test1 = "Hello World"; // 세어보면 11개이지만 '\0'인 null이 포함되어 12개이다.
// test1[0] = 'R'; 다음과 같이 수정은 불가능하다
cout << test1 << endl;
- test1 [ 주소 ] 는 8바이트(64비트 프로그램)짜리 주소를 담는 바구니
- const로 막아두었기 때문에 문자열의 원소를 수정할 수 없다.
// .data 주소[H][e][l][l][o][][W][o][r][l][d][\0]
// [][][][][][][][][][][][]
// [H][e][l][l][o][][W][o][r][l][d][\0]
// test2 = 주소
char test2[] = "Hello World"; // char test2[12] == "Hello World"; 와 같다. []으로 나두면 자리수만큼 자동으로 인식
test2[0] = 'R';//다음과 같이 데이터를 수정할 수 있다.
- test2는 그 자체가 주소이다.
포인터 vs 배열
- 포인터는 [주소를 담는 바구니]
- 배열은 [닭장] . 즉, 그 자체로 같은 데이터끼리 붙어있는 '바구니 모음'.
- [배열 이름]은 '바구니 모음'의 [시작 주소]
"
포인터와 배열은 다른 개념이다!
"
배열을 함수 인자로 넘기는 경우 - 컴파일러가 포인터로 치환한다
배열은 함수 인자로 넘기면, 컴파일러가 알아서 포인터로 치환한다 ( char[] → char* )
즉, 배열의 내용 전체를 넘긴게 아니라, 시작 주소(포인터)만 넘긴 것
void Test(int a)
{
a++;
}
// 배열은 함수 인자로 넘기면, 컴파일러가 알아서 포인터로 치환한다 (char[] -> char*)
// 즉 배열의 내용 전체를 넘긴게 아니라, 시작 주소(포인터)만 넘긴 것
void Test(char a[])
{
a[0] = 'x';
}
int a = 0;
// [매개변수][RET][지역변수(a=0)]
Test(a);
cout << a << endl;
// test2 = "Hello World";
// test2가 바뀔까? 안 바뀔까? -> 바뀐다!
Test(test2);
cout << "Test(test2) : " << test2 << endl;
실행화면
전체 코드
더보기
#include <iostream>
using namespace std;
// 포인터 vs 배열
void Test(int a)
{
a++;
}
// 배열은 함수 인자로 넘기면, 컴파일러가 알아서 포인터로 치환한다 (char[] -> char*)
// 즉 배열의 내용 전체를 넘긴게 아니라, 시작 주소(포인터)만 넘긴 것
void Test(char a[])
{
a[0] = 'x';
}
int main()
{
// 문자열 = 문자 배열
const char msg1[] = { 'H','e', 'l', 'l', 'o', '\0' }; // 끝났다는 의미로 아스키코드 null인 '\0' 입력
cout << msg1 << endl;
// .data 주소[H][e][l][l][o][][W][o][r][l][d][\0]
// test1[ 주소 ] << 8바이트(64비트 프로그램)
const char* test1 = "Hello World"; // 세어보면 11개이지만 '\0'인 null이 포함되어 12개이다.
// test1[0] = 'R'; 다음과 같이 수정은 불가능하다
cout << test1 << endl;
// .data 주소[H][e][l][l][o][][W][o][r][l][d][\0]
// [][][][][][][][][][][][]
// [H][e][l][l][o][][W][o][r][l][d][\0]
// test2 = 주소
char test2[] = "Hello World"; // char test2[12] == "Hello World"; 와 같다. []으로 나두면 자리수만큼 자동으로 인식
test2[0] = 'R';
cout << test2 << endl;
// 포인터는 [주소를 담는 바구니]
// 배열은 [닭장] 즉, 그 자체로 같은 데이터끼리 붙어있는 '바구니 모음'
// 다만 [배열 이름]은 '바구니 모음'의 [시작 주소]
int a = 0;
// [매개변수][RET][지역변수(a=0)]
Test(a);
cout << a << endl;
// test2가 바뀔까? 안 바뀔까? -> 바뀐다!
Test(test2);
cout << "Test(test2) : " << test2 << endl;
return 0;
}
'⭐ Programming > C++' 카테고리의 다른 글
[C++] 다중 포인터 (이중 포인터) (0) | 2022.03.27 |
---|---|
[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기 (0) | 2022.03.27 |
[C++] 배열 기초 (0) | 2022.03.26 |
[C++] 포인터 vs 참조, const (0) | 2022.03.26 |
[C++] 참조 기초 (0) | 2022.03.26 |
댓글
이 글 공유하기
다른 글
-
[C++] 다중 포인터 (이중 포인터)
[C++] 다중 포인터 (이중 포인터)
2022.03.27 -
[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기
[C++] 배열과 Swap함수를 활용한 연습: 로또 번호 생성기
2022.03.27 -
[C++] 배열 기초
[C++] 배열 기초
2022.03.26 -
[C++] 포인터 vs 참조, const
[C++] 포인터 vs 참조, const
2022.03.26