포인터 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;
}