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
*/
Code language: PHP (php)
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
*/
Code language: PHP (php)
3. 배열 == 포인터 상수?
배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같습니다.
따라서 배열을 포인터 상수(constant pointer)라고 하기도 합니다.
- 포인터 상수(constant pointer)란 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미한다.
- 상수 포인터(pointer to constant)란 상수를 가르키는 포인터를 의미합니다.
출처 : http://www.tcpschool.com/c/c_pointerArray_relation
#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;
}
Code language: PHP (php)
//출력
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
Code language: JavaScript (javascript)
확인해보니 포인터 상수와 배열은 엄연히 다르다.
배열의 이름(arr)의 주소는 포인터 상수와 달리 배열의 첫 번째 요소의 주소를 가진다.
포인터 상수는 자기 자신의 주소를 가진다.
배열은 배열이고 포인터 상수는 포인터 상수다.
아래 블로그 글에서 배열과 포인터에 관하여 이야기 한다.
C/C++ Array Decay: 배열이 있었는데요 없었습니다 – 인하대학교 인트아이
Array decay를 통해서 포인터와 배열이 같지 않음을 설명한다.
참고
변수와 메모리의 관계를 이해하기 위해서 읽으면 좋은 포스팅을 찾았다.
심벌 테이블(Symbol table)을 통해서 변수가 메모리의 실제 주소를 할당받는 방법을 이해할 수 있을 것.

