배열(array)
- 주소값을 가지고 포인터 연산을 통해 배열의 모든 연소에 각각 접근할 수 있음
- 배열 선언 시, 메모리에 같은 크기의 공간들을 연속적으로 할당해놓고,
-->첫번째 요소의 주소값을 가지고 정수 연산
-->이어진 다음 요소의 주소를 계산할 수 있음
-->주소에 *를 붙여서 각 요소에 직접 전근 가능
예시1
int ary[5] = {1, 2, 3, 4, 5}
cout << art ; //4390184 첫 번째 원소의 주소 반환
cout << art+1 ; //4390188 두 번째 원소의 주소 반환(+4)
파이썬에서 그 배열이 아니다~~~!~!
c++에서 배열은 그 배열 첫번째 원소의 주소값을 반환한다!
이때, 'cout << 배열'을 하면, 해당 배열의 첫번째 원소 주소값이 저장되어있긴 하지만,
cout을 만났을 때 '얘는 배열이므로, 저장되어 있는 첫번째 원소의 주소값부터 null의 주소값까지의 value(chars)를 출력해주자
로 해석한다.
예시2
int* p = ary+1 // 포인터 p에 4390188 입력했다는 것.
이때, p - ary는 4가 아니라 1임. p와 ary 둘 다 '주소'이기 때문에 주소 연산을 수행함.
포인터+정수 → 포인터+(정수 x sizeof포인터)
pointer & new를 통해 동적 자료 만들기.
1.
#include <iostream>
#define SIZE 20
int main(){
using namespace std;
double* p3 = new double[3]; //double형 데이터 3개를 저장할 수 있는 공간을 대입
p3[0] = 0.2; //p3를 배열 이름처럼 취급
p3[1] = 0.5;
p3[2] = 0.8;
//new 연산자를 통해 동적 배열을 생성
//pointer를 사용하여, 해당 배열의 원소에 개별적으로 접근 가능
p3 = p3 + 1; //배열에 값을 더하는 행위//double의 크기만큼 더해짐
cout << p3 <<endl; //0x6000022e1188
cout << "Now p3[0] is " << p3[0] << " and "; //Now p3[0] is 0.5 //기존 p3[1]의 값
cout << "p3[1] is " << p3[1] << ".\n"; // p3[1] is 0.8.
p3 = p3 -1;
delete[] p3;
/**/
char animal[SIZE];
//char로 문자열을 지정할 때는, 문자열 크기를 미리 선언해야 함
//컴파일 시간에 배열의 크기를 결정하는 것
char* ps;
cout << "동물 이름을 입력하십시오\n";
cin >> animal;
ps = new char[strlen(animal)+1]; //사용자가 무슨 animal을 입력하든 그보다 한 칸 더 넉넉히.
//실행 시간에 배열의 크기를 결정하는 것이, 메모리 차원에서 훨씬 유리함
strcpy(ps, animal); //animal의 값을 ps에 복사
cout << "입력하신 동물 이름을 복사하였습니다" << endl;
cout << "입력하신 동물 이름은 " << animal << "이고, 주소는 " << (int*)animal << "인데," << endl;
//입력하신 동물 이름은 panda이고, 주소는 0x16f9235e4인데,
cout << "그것을 복사한 것의 이름은 " << ps << "이고, 주소는 " << &ps << "일까, " << (int*)ps <<"일까?";
//그것을 복사한 것의 이름은 panda이고, 주소는 0x16f9235d0일까, 0x600000b48030일까?
//복사된 값이 원래 주소와 다름
}
2.
#include <iostream>
#define SIZE 20
/**/
//동적(dynamic): 컴파일 시간이 아닌, 실행 시간에 size를 받음
//동적 구조체 생성
//temp* ps = new temp;
struct MyStruct{
char name[20];
int age;
};
int main() {
using namespace std;
MyStruct* temp = new MyStruct; //new 연산자를 통해, 구조체를 동적으로 생성
cout << "당신의 이름: ";
cin >> temp->name; //화살표 멤버 연산자
cout << "당신의 나이: ";
cin >> (*temp).age; // 화살표 대신, (*구조체 변수). 도 가능
cout << "안녕하세요! " << (*temp).name << "씨!\n";
cout << "당신은 " << temp->age << "살 이군요!";
cout << temp <<endl; //0x600000289180
cout << (int*)temp << endl; //0x600000a5d180
cout << &temp << endl; //0x16b0d75f8
// cout << temp[0] << endl;
cout << temp->name << endl; //fish
// char 배열이므로 저장된 건 첫번째 요소의 주소값이지만 cout을 통해 해당 주소값부터 null이 있는 주소값까지의 char들을 출력
cout << *(temp->name) << endl; //name에 영단어를 입력하면 첫번째 알파벳 f가 나옴(한글은 ?로 뜸)
cout << &(temp->name) << endl; //0x600000289180
/*번외*/
cout << (int*)(temp->name) << endl; //0x600000289180
// !=(int)(*변수) : 변수가 참조하는 대상을 int로 typecast한 결과
}
→ 여기서도 temp 구조체 포인터 안에 저장된 name은 배열이므로, 해당 배열 첫번째 원소의 주소값이 저장되어 있다.
따라서,
- temp->name: 해당 주소값~null의 주소값 범위에 해당하는 chars를 문자열로 출력해주고 : fish
- *(temp->name): 해당 배열 첫번째 원소의 주소값이 가리키는 char를 출력해주고 : f
- &(temp->name): 해당 배열 첫번째 원소의 주소값의 주소값을 출력해주고 : 0x6000~
- (int*)(temp->name): 얘는 아직 잘 모르겠다,, ㅎㅎ (int*)pointer는 pointer의 값 자체를 주소값으로 선언해준다는 건 읽었는데, 위 결과와 매칭을 잘 못 시키겠음...
"pointer를 이용하여 출력된 값은 정수 값이고 (int *)pointer를 이용해서 나오는 값은 번지 값이다"
출처:https://sunder4.tistory.com/150
'개발 > c++' 카테고리의 다른 글
[c++ 프로그래밍 입문] 4. Branch Syntax (분기 구문, 조건문) (1) | 2023.08.23 |
---|---|
[c++ 프로그래밍 입문] 3. 반복문 (0) | 2023.08.22 |
[C++ 프로그래밍 입문] 2-2. Complex Data (포인터) (0) | 2023.08.19 |
[C++ 프로그래밍 입문] 2-1. Complex Data(배열, 문자열, 입력 cin, string, struct, union, enum) (0) | 2023.08.19 |
[C++ 프로그래밍 입문] 1. 데이터 다루기 (1) | 2023.08.19 |