본문 바로가기
c++

[C++]문자열

by goblin- 2023. 4. 29.
문자열

 

#include <iostream>
#include <cstring>
using namespace std;

int main(){

    char a[10]={'a','b','c','d'};
    char b[]={"hi my name is"};
    cout<<a<<endl;
    cout<<b<<endl;
    cout<<sizeof(b)<<endl;
    cout<<b[12]<<","<<b[13]<<endl;
    return 0;
}

결과

abcd
hi my name is
14
s,

char형 배열 a를 크기 10으로 선언해 주었고 마지막에 0을 붙여서 문자열이 끝났다는 것을 알려주었다. 

char형 배열 b를 선언한 후 안에 문자열을 입력해 주었고 출력까지 잘 나오는 것을 확인할 수 있었다. 또한 b의 크기는 입력한 문자열의 크기+1이었고 +1은 마지막에 끝났다는 것을 알려주기 위한 NULL값이 들어가 있다는 것을 알 수 있었다. 따라서 b [13]은 NULL값이다.

 

배열과 포인터
#include <iostream>
#include <cstring>
using namespace std;

int main(){

    int a[2]={1,2};
    cout<<"a : "<<a<<endl;
    cout<<"&a[0] : "<<&a[0]<<endl;
    cout<<"&a[1] : "<<&a[1]<<endl;

    *a+=3;
    cout<<"*a : "<<*a<<endl;
    cout<<"a[0] : "<<a[0]<<endl;

    *(a+1)+=5;
    cout<<"a[1] : "<<a[1]<<endl;
    return 0;
}

결과

a : 0x16d3ff4e0
&a[0] : 0x16d3ff4e0
&a[1] : 0x16d3ff4e4
*a : 4
a[0] : 4
a[1] : 7

위의 코드를 통해 알 수 있는 점은 배열의 이름을 출력하게 되면 배열의 시작 주소값이 나오게 된다.  또한 int형은 4byte 이기 때문에 a [0]과 a [1] 주소값이 4byte씩 차이나느 것을 볼 수 있다.

 

a는 배열의 시작주소이기 때문에 *a을 사용하여 a[0]값에 3을 더한 것을 저장해 주면 결과값이 기존 있었던 값인 1에 3을 더한 값인 4가 나오는 것을 확인할 수 있었다.

*a는 a [0]와 같다.

 

따라서 배열의 이름은 포인터이다. a [i]=*(a+i)   i는 배열의 인덱스이다.

 

위의 코드에서 *(a+1)+=5; 의 의미는 a [0+1]이기 때문에 a [1]의 값을 기존값과 5를 더해서 a [1]에 저장하라는 뜻이다 따라서 기존값 2와 5를 더해 결괏값 7이 나오는 것을 확인할 수 있다.

 

포인터배열
#include <iostream>
#include <cstring>
using namespace std;

int main(){

    int a1=10, a2=20, a3=30;
    int *b[3]={&a1, &a2, &a3};
    char *c[3]={"a","b","c"};

    cout<<"b[0] : "<<b[0]<<endl;
    cout<<"*b[0] : "<<*b[0]<<endl;
    cout<<"*c[1] : "<<*c[0]<<endl;

    return 0;
}

결과

b[0] : 0x16f7674a8
*b[0] : 10
*c[1] : a

int *b [3]과 같이 포인터배열을 선언하게 되면 b [0]는 주소값으로 출력되게 되고 *b [0]는 b [0] 안에 있는 값이 출력된다.

 

또한 b배열과 c배열의 차이는

문자열은 C++에서 문자열 리터럴(작은따옴표나 큰 따옴표로 묶인 문자열)로 표현된다. 문자열 리터럴은 메모리 내 상수 영역에 저장되며, 컴파일러는 문자열 리터럴을 가리키는 포인터를 생성한다. 따라서 char *c [3]={"a", "b", "c"}; 와같이 문자열 리터럴의 주소를 char *포인터에 바로 할당할 수 있다. 하지만 b와 같이 정수변수를 사용할 때는 a1, a2, a3와 같이 변수를 먼저 선언하고 값을 할당해야 한다. 주소값을 지정해 줘야 한다.

 

참고

https://blog.naver.com/songsite123/223057180883