[C] C언어 기초

[C] C언어의 포인터 및 메모리_2

ITsubin 2022. 4. 8. 00:36

[C] C언어의 포인터 및 메모리 포스팅에서 배열의 주소와 그 배열의 첫 번째 index의 주소는 "같다"라고 말했습니다.

예시 코드로 알아보겠습니다.

 

아래 예시에서 길이가 3인 int형의 배열 a를 선언하는 동시에 a[0]은 10, a[1]은 20, a[2]는 30으로 초기화했습니다.

주소 연산자인 &를 사용해서 a[0], a[1], a[2]의 주소값을 불러왔습니다.

 

위 코드의 실행 결과는 아래와 같습니다. 메모리는 우리가 정하는 것이 아닌 컴퓨터가 자동으로 정해주는 것이기 때문에 아래에서의 주소값은 항상 바뀝니다.

주소값을 형식 문자(서식 지정자)를 사용하여 정수형으로 받았기 때문에 음수가 나올수도, 양수가 나올 수도 있습니다.

 

저희가 주목해야 할 것은 두 가지입니다.

 

첫 번째는 a[0], a[1], a[2] 주소값의 차이입니다.

a[0]은 a[1]과 4가 차이나고, a[1]도 a[2]과 4가 차이납니다.

우리는 배열을 int형(4byte)으로 선언했기 때문입니다.

만약 배열 a를 char형으로 선언했다면 주소값은 1씩 차이나게 됩니다.

 

두 번째는 배열 a의 주소값과 a[0]의 주소값이 같다는 점입니다. &a[0] == a 인 것입니다.

하지만, 위 코드에서는 배열 a의 주소값을 불러올 때 주소연산자( & )를 사용하지 않았습니다.

배열의 이름 그 자체가 배열의 첫 번째 주소를 나타내기 때문에 사용하지 않아도 됩니다.

배열 a의 주소값과 a[0]의 주소값이 같다는 것은 &a[0] == a 입니다.

a의 주소는 a[0]의 주소와 같습니다. 이는 당연하게도 &a[0] == a + 0과 같은 말입니다.

a + 1은 &a[1]과 같고, a + 2는 &a[2]와 같습니다. 이 것을 코드로 표현한다면 아래와 같습니다.

 

사실 우리는 주소 연산자( & )를 써왔습니다.

int num1; 로 변수를 선언했을 때

scanf("%d", &num1); 처럼 사용했습니다.

변수를 선언했지만, scanf로 num1의 주소에 값을 전달하기 위해 주소 연산자( & )를 사용했습니다.

 

변수가 아닌 배열을 선언했을 때는 배열 그 자체가 메모리의 시작 주소기 때문에 주소 연산자를 사용하지 않았습니다.

'[C] C언어 기초' 카테고리의 다른 글

[C] C언어의 포인터 및 메모리_3  (0) 2022.04.09
[C] C언어의 포인터 및 메모리  (0) 2022.04.07
[C] C언어 연습문제  (5) 2022.04.05
[C] C언어 기초 함수  (0) 2022.04.04
[C] C언어의 배열(array)  (0) 2022.04.03