티스토리 뷰
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 |