본문 바로가기
언어 정리/C++_개념_lib

char , 배열과 포인터 차이

by 알 수 없는 사용자 2024. 1. 4.

 

char str[] = "Hello";

 - 배열 스택에,        할당된 문자열 데이터는 힙에
const char *str = "Hello"; 

 - 포인터는 스택에, 문자열 상수는 정적 메모리에
char *str = new char[6];

 - 포인터는 스택에, 할당된 문자열 데이터는 힙에

ps>

str_instance << std::string 타입의 객체고 스택에 저장

"Hello" << 할당된 문자열 데이터는 힙에
str_4 << 포인터는 스택에

string str_instance = "Hello";  // std::string 타입의 객체고 스택에 저장. std::string 클래스는 동적 메모리 할당을 내부적으로 관리하므로, 개발자가 직접 메모리 해제를 신경 쓸 필요가 없다
string *str_4 = &str_instance;  // 포인터로서, 스택에 저장

비교 1

char *p[10]  VS  string *p[10]

 

비교 2

char s[] = "geeksquiz";  VS  char *s  = "geeksquiz";


ex) 예제

#include <iostream>

#include <string>
#include <string.h>

using namespace std;
typedef typename std::string string;

int main()
{
    // 1
    char str_1[] = "Hello"; // 스택에 할당
    str_1[0] = 'h'; // "hello"로 변경 가능
    cout << str_1 << endl;  // 출력 : hello
    // std::cout 스트림은 char 포인터 타입의 인자를 전달받을 때, 널 종료 문자('\0')가 나타날 때까지 연속된 문자들을 출력하는 것으로 정의됨
    // 함수가 끝나면 str 배열은 자동으로 해제됨

    // 2
    const char *str_2 = "Hello"; // 포인터는 스택에, 문자열 상수는 정적 메모리에
//    str_2[0] = 'h'; // 컴파일 오류 : assignment of read-only location ‘* str_2’
    cout << str_2 << endl; // 출력 : Hello
    // 함수가 끝나면 포인터 str은 해제되지만, "Hello" 문자열 상수는 남아 있음

    // 3
    char *str_3 = new char[6]; // 포인터는 스택에, 할당된 문자열 데이터는 힙에
    strcpy(str_3, "Hello");
//    *str_3 = "Hello";  // 컴파일 오류 : invalid conversion from ‘const char*’ to ‘char’
    // ... 사용 후에 메모리 해제 필요
    str_3[0] = 'h'; // "hello"로 변경 가능
    cout << str_3 << endl; // 출력 : hello
    delete[] str_3; // 힙 메모리 해제
    // 함수가 끝나면 포인터 str은 해제되지만, 힙에 할당된 메모리는 delete[]로 해제해야 함

    // 4
    string str_instance = "Hello";  // std::string 타입의 객체고 스택에 저장. std::string 클래스는 동적 메모리 할당을 내부적으로 관리하므로, 개발자가 직접 메모리 해제를 신경 쓸 필요가 없다
    string *str_4 = &str_instance;  // 포인터로서, 스택에 저장
    *str_4 = "bye";
    cout << *str_4 << endl; // 출력 : bye
    // 모든 변수들이 스택에 저장되므로 스코프가 끝나면 자동으로 메모리가 해제됨.

    return 0;

}

 

 

 

 

 

 

 

 

 

 

'언어 정리 > C++_개념_lib' 카테고리의 다른 글

정적변수, 전역변수  (0) 2024.01.16
this, function return 자료형  (0) 2024.01.16
스마트 포인터, casting  (1) 2024.01.03
typedef  (0) 2024.01.03
#if, 초기화리스트, const, namespace  (0) 2024.01.02

댓글