문자열
#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와 같이 변수를 먼저 선언하고 값을 할당해야 한다. 주소값을 지정해 줘야 한다.
참고
'c++' 카테고리의 다른 글
[C++]연산자 오버로딩의 이해와 유형 (0) | 2023.04.30 |
---|---|
[C++]클래스와 함수에 대한 friend 선언 (0) | 2023.04.30 |
[C++]this 포인터 (0) | 2023.03.04 |
[C++]객체 배열과 객체 포인터 배열 (0) | 2023.03.01 |
[C++]멤버 이니셜라이저(Member Initializer)를 이용한 멤버 초기화 (0) | 2023.02.27 |