우선 간단히 배열이란 무엇인지 생각해봐야한다.
int temp1;
int temp2[10];
temp라는 변수명을 가진 변수는 4바이트지만
temp2는 하나의 변수명으로 무려 10개의 int형 변수를 10개를 만든 것이다.
배열의 특징 세가지를 정리하면
1. 배열명은 주소를 뜻한다.
2. 배열명은 배열의 첫번째 배열 요소의 주소를 뜻한다.
int temp_array[3] = {1, 3, 5};
int *temp;
temp = temp_array;
cout<<*temp<<endl;
cout<<*(temp+1)<<endl;
cout<<*(temp+2)<<endl;
cout<<temp_array<<endl; //배열명을 출력해보았다. 주소가 나온다.
cout<<temp_array+1<<endl;
cout<<temp_array+2<<endl;
cout<<*temp_array<<endl; //이렇게 배열명을 역참조를 해보면 값이 나온다.
cout<<*(temp_array+1)<<endl;
cout<<*(temp_array+2)<<endl;
위와 같이 포인터랑 배열에 +1같은 연산을 함으로서 첫번째 배열에 있는 값이 아닌 값을 참조 할 수도 있다.
또 추가적으로
cout<<&temp_array<<endl;
cout<<&temp_array+1<<endl;
cout<<&temp_array+2<<endl;
이렇게 해보면 배열명에 주소에 접근한뒤 +1 이나 +2를 하면 주소값이 12씩 증가하게 되었다.
즉, 배열명의 크기만큼 증가하게 되었다.
근데 의문이 가는게 &temp_array+1 과 temp_array+1 이 값이 다르게 나오는게 이해가 가지않는다.
temp_array랑 &temp_array는 배열명이기 때문에 어차피 똑같은 주소(0012FF58)가 나오는데 그 주소에서 +1을 하면 둘다 같아야 되는게 아닌가? 누군가에게 물어봐야겠다 -_-
3. 배열명에는 주소를 할당 할 수 없다. 배열명은 포인터변수가 아니라 배열명 자체일 뿐이다.
말 그대로 할당 할 수 없다
temp = temp_array;
temp = temp_array+1;
가능하다. 포인터에 배열의 주소값들이 들어갈수있을것이다.
temp_array = temp;
temp_array = temp+1;
불가능하다. 배열에는 포인터가 아니라 값이 들어가야 한다.
--------------------------------------------------------------------------------------------------------
알아본 결과 예전에는 temp_array 는 배열 상수일뿐이고 저장된 영역이 없기때문에 출력하라는거 자체가 말이 안되서 오류가 났다고 한다. 하지만 ANSI에서 배열명에 &연산자를 허용해주어서 에러가 안나는것이라 한다.
그러므로 &temp_array 자체가 말이안되는 것이다. temp_array+1은 첫번째 주소에서 자료형크기만큼 &temp_array+1 는 배열명 크기만큼 커진다는 것만 이해해야겠다.
&temp_array는 어떠한 대상을 가르키고 있는것이 아닌 그냥 주소값일뿐 그래서 sizeof를 하게되면 4가나오게된다.
'프로그래밍 기초 > C포인터' 카테고리의 다른 글
문자열 포인터 (0) | 2010.05.25 |
---|---|
2차원 포인터 배열 (0) | 2010.05.25 |
배열포인터의 특징 (0) | 2010.05.25 |
2차원 배열포인터와 대상체 (0) | 2010.05.20 |
포인터란? (0) | 2010.05.19 |