728x90

배열(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

728x90

+ Recent posts