티스토리 뷰

const는 상수로써 사용한다는 뜻


int num = 10, num2 = 20;

const int* ptr = # //다음과 같이 포인터 변수 타입의 앞에 const키워드가 위치할 경우..

*ptr = 20; //에러!! 포인터가 참조하고 있는 값의 변경을 허용하지 않는다.

ptr = &num2; //포인터가 참조하는 주소값의 변경은 허용


만약에 아래와 같이 포인터 변수앞에 const키워드가 붙는다면...위 와는 반대로

int* const ptr = #

ptr = &num2; //에러!! 포인터가 참조하고 있는 주소값의 변경은 불허

*ptr = 20; //포인터가 참조하는 값의 변경은 허용


const int* const ptr = #

처럼 포인터변수의 타입과 변수 앞에 둘다 const키워드가 오게된다면

실제 참조하고 있는 값과 주소값의 변경을 모두 허용하지 않는다.



포인터와 2차원 배열


1차원 배열에서

int arr[3] = {1,2,3};

int* ptr = arr;  //arr자체는 int[0]의 주소값을 가지고 있음

으로 하면

arr[i] == *(ptr+i) 와 같은 공식이 성립한다.


arr[0] == &(ptr+0) //같다.

arr[1] == &(ptr+1) //같다.

arr[2] == &(ptr+2) //같다.


ptr포인터 변수의 타입이 int형이므로 ptr에 +1연산을 진행할 때 마다 int형의 크기인 4바이트씩 증가한다.

arr도 마찬가지다. arr[0]이 4바이트를 가지고, arr[1]이 4바이트를 가진다.

이렇게 됨으로써 arr[i] == *(ptr+i)라는 공식이 성립하는 것이다.




이제 2차원 배열을 본다면..

int arr[2][2] = {

{1,2},

{3,4}

};


위 배열은 2차원 배열이지만 메모리의 주소값은 1차원 배열처럼 1차원의 형태이다.

예를 들어 1차원 배열이....

int arr[3] =  {1,2,3}; 이라면

메로리의 주소값은 예를 들자면

0x1000

0x1004

0x1008

이 될 것이다.


2차원 배열도 이와 같다.

2차원 배열이라고 해서

0x1000-0x1000

0x1000-0x1000

0x1000-0x1000

이런식의 2차원 형태의 주소값을 가지지는 않는다.


int arr[2][2] = {

{1,2},

{3,4}

};

int* ptr = &arr[0][0];

이 2차원 배열은 1차원 배열과 같이

차례대로

0x1000

0x1004

0x1008

0x100C

의 메모리 주소값을 가진다.


그러므로 

arr[0][0] == *(ptr+0);

arr[0][1] == *(ptr+1);

arr[1][0] == *(ptr+2);

arr[1][1] == *(ptr+3);

은 성립이 된다.

'C언어' 카테고리의 다른 글

[C언어] 배열  (0) 2014.03.02
[C언어]상수(리터럴) 형변환  (0) 2014.02.28
C언어에서 사용되는 서식문자 종류  (1) 2014.02.26
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday