[C++] 배열과 포인터

2023. 7. 1. 03:16Algorithm/with C++

1. pointer

 

#include <iostream>
using namespace std;

int main(){
    string a = "hello world";
    string * b = &a;
    cout << b << endl;
    cout << *b << endl;
    return 0;
}
/*
0x6ffdf0
abcda
*/

 


2. array to pointer

 

#include<iostream>
using namespace std;

int a[3] = {1, 2,3};
int main(){
    int * b = &a[0];
    int * c = a;
    int * d = (a+1);
    cout << b << endl;
    cout << c << endl;
    cout << d << endl;
    cout << &a[1] << endl;
    return 0;
}
/*
0x1004c8000
0x1004c8000
0x1004c8004
0x1004c8004
*/

 


3. 배열 == 포인터 상수?

#include <iostream>
using namespace std;

int main(void)
{
    int arr[5] = {1, 2, 3, 4, 5};
    int * const arr2 = arr;
    string str = "hello world";

    printf("&arr : %p\n", &arr);
    printf("arr : %p\n", arr);
    printf("&arr[0] : %p\n", &arr[0]);
    printf("&arr2 : %p\n", &arr2);

    printf("&str : %p\n", &str);
    printf("c_str : %p\n", str.c_str());
    printf("&str[0] : %p\n", &str[0]);

    printf("str : %s\n", &str);
    printf("str : %s\n", str.c_str());
    printf("str[0] : %c\n", str[0]);
    return 0;
}
//출력
test1.cpp:19:23: warning: format specifies type 'char *' but the argument has type 'std::string *' (aka 'basic_string<char, char_traits<char>, allocator<char>> *') [-Wformat]
        printf("str : %s\n", &str);
                      ~~     ^~~~
1 warning generated.
// 시력 보호
&arr : 0x16f01f4b0
arr : 0x16f01f4b0
&arr[0] : 0x16f01f4b0
&arr2 : 0x16f01f4a0
// 시력보호
&str : 0x16f01f488
c_str : 0x16f01f488
&str[0] : 0x16f01f488
// 시력보호
str : hello world
str : hello world
str[0] : h

 

확인해보니 포인터 상수와 배열은 엄연히 다르다.

 

배열의 이름(arr)의 주소는 포인터 상수와 달리 배열의 첫 번째 요소의 주소를 가진다.

 

포인터 상수는 자기 자신의 주소를 가진다.

 

배열은 배열이고 포인터 상수는 포인터 상수다.

 

아래 블로그 글에서 배열과 포인터에 관하여 이야기 한다.

 

C/C++ Array Decay: 배열이 있었는데요 없었습니다 - 인하대학교 인트아이

 

C/C++ Array Decay: 배열이 있었는데요 없었습니다 - 인하대학교 인트아이

배열이 수식에서 사용될 때 포인터로 변환되는 현상 Array Decay는 Array to Pointer Decay라고도 불리며, C와 C++에서 배열을 다룰 때 암시...

int-i.github.io

Array decay를 통해서 포인터와 배열이 같지 않음을 설명한다.

 


참고

변수와 메모리의 관계를 이해하기 위해서 읽으면 좋은 포스팅을 찾았다.

 

 

메모리 주소와 컴파일

컴파일 과정에서 가장 중요한 것은 메모리를 확보하고 정리하는 부분이다. 컴파일러는 프로그래머가 지정한 자료형의 크기에 따라 메모리를 확보하고 그곳에 적당한 값을 집어넣는다. 모든 변

velog.io

 

심벌 테이블(Symbol table)을 통해서 변수가 메모리의 실제 주소를 할당받는 방법을 이해할 수 있을 것.

 


'Algorithm > with C++' 카테고리의 다른 글

[C++] iterator  (0) 2023.07.08
[C++] 메모리 할당  (0) 2023.07.07
[C++] pair와 tuple  (0) 2023.07.01
[C++] string  (0) 2023.03.20
[C++] 입력과 출력  (0) 2023.02.10