Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

zyeon's 작심삼일 코딩 공부

포인터와 배열 본문

c++ 정리

포인터와 배열

젼뀨 2024. 6. 20. 23:17

배열은 포인터와 밀접한 관계를 가지고 있다.

 

우선 배열의 이름은 포인터이다. 배열의 이름은 배열의 시작 주소와 같다는 말이다. 

또한 배열의 요소들은 메모리에서 연속된 공간을 차지한다. int형 배열의 요소들의 주소를 출력해보면, 4바이트 크기 차이를 가진 연속된 주소값을 가진다. 

int arr[] = {10, 20, 30};​

 

위와 같은  배열이 존재할 때, &arr[i]arr+i 는 동일한 주소값을 가지며 arr[i]*(arr+i) 와 동일하다.

++arr; //컴파일 오류, 상수포인터로 취급한다.

int *p = arr;
++p; //가능

배열의 이름이 포인터이긴 하지만 배열의 이름은 포인터 상수이기 때문에 다른 변수의 주소를 대입할 수는 없다.

하지만 포인터 변수에 배열을 대입하게 되면 값을 변경할 수 있게 된다.

int arr[] = {10, 20, 30};
int *p = arr;

printf("arr[0]=%d arr[1]=&d arr[2]=%d", a[0], a[1], a[2]); //10 20 30 출력
printf("p[0]=%d p[1]=&d p[2]=%d", p[0], p[1], p[2]);       //10 20 30 출력

p[1] = 40; // arr[1] = 40;과 같은 결과

포인터에 배열의 이름을 대입하면 p[i]를 사용하여 배열과 똑같이 배열 요소 값에 접근할 수 있다. 

 

일반적인 자료형의 매개변수는 값이 복사가 되어 함수로 전달되며, 지역변수로 동작한다.

하지만 매개 변수를 배열로 선언하게 되면 배열의 주소를 저장하는 포인터로 생성된다.

void sub(int a[], int size){ 
    *a = 4;       //포인터를 통해 원본 배열 변경, a[0] = 4;와 같은 결과
    *(a+1) = 5;   //a[1] = 5;
    *(a+2) = 6;   //a[2] = 6;
}

int main(){	
    int arr[3] = { 1, 2, 3 };
    sub(arr, 3); //arr의 주소 전달
    
    retun 0;
}

함수 호출 시 배열의 이름을 전달하면 배열의 주소가 전달 된다. 위 코드에서 arr을 전달받은 매개변수 a는 배열을 참조하는 포인터가 된다. 

또, 매개변수를 *a 로 해도 완전히 동일하다.

 

배열은 다른 변수들과 달리 원본 배열에서 복사본 배열 전체 내용을 복사하는데 상당한 시간을 필요로 할 수 있기 때문에 이런 차이가 있다.

'c++ 정리' 카테고리의 다른 글

void 포인터  (0) 2024.06.21
const와 포인터  (0) 2024.06.21
포인터  (0) 2024.06.17
지역변수, 전역변수, 정적변수, 외부변수  (2) 2024.06.14
비트 연산자, 플래그  (1) 2024.06.05