배열 (int a[10]) : 10개의 정수를 수용할 메모리 40byte 를 할당한 변수
배열의 이름은 배열의 시작 주소를 저장하는 포인트 변수이며 이를 활용 할 수 있다.
(다만 그 포인트 주소의 값을 변경할 수는 없음)
int a[10] 이라는 배열을 선언시 *a 의 형태로 포인어 변수를 사용할 수 있다.
배열을 함수에서 매개변수로 받을 때 a[] 형태로 사용하거나 *a 의 형태로 사용할 수 있다.
이를 포인터 arithmetic 이라 하며 포인터에서 +1 을 하여 *(a+1) 의 형태로 사용하게 되면 단순히 주소값에 +1 을 하는 것이 아니라 데이터 타입에 맞는 다음 주소값을 가리키게 된다.
ex) a[] 배열의 데이터 타입이 int 고 주소가 1000 일 경우 *(a+1) 은 1004 이다. -> int 의 길이는 4byte
ex) a[] 배열의 데이터 타입이 long long 이고 주소가 1000 일경우 *(a+1) 은 1008 이다. -> long long 의 길이는 8byte
//array.c #include <stdio.h> int main(void) { int sum, i, average; int num[10]; for (i=0; i<10; i++) scanf("%d", &num[i]); sum = calculate_sum( num ); average = sum / 10; printf("%d\n", average); return 0; } int calculate_sum( int *array) // instead of array[] { int sum, i; sum = 0; for (i=0; i<10; i++) sum = sum + *(array+i); // instead of array[i] return sum; } |
//array.c 실행결과 1 2 3 4 5 6 7 8 9 10 5 |
num[10] 배열에 for 문과 scanf 를 이용하여 10개의 숫자를 입력 받은 뒤,
calculate_sum 함수를 통해 해당 배열에 입력받은 숫자들의 총합을 계산한 후,
average 변수에 총 합을 10으로 나누어 평균을 계산하여 출력하는 소스이다.
calculate_sum 함수에 배열을 입력 받는 부분과 특정 데이터를 선택하는 부분을
int calculate_sum( int *array)
sum = sum + *(array+i);
와 같이 배열 주소의 가장 앞 주소를 참조하는 포인터 형식으로 사용할 수도 있고
int calculate_sum(int array[])
sum = sum + array[i];
와 같이 배열 형태로도 사용이 가능하다.
두가지 모두 결과 값은 동일하다.
//arr2.c #include <stdio.h> int main() { int data[] = {1, 2, 3}; int *p = &data[0]; printf("%d %d %x\n", *p, p, p); printf("%d %d %x\n", *(p+1), p+1, p+1); printf("%d %d %x\n", *(p+2), p+2, p+2); return 0; } |
//arr2.c 실행결과 1 641841664 2641ba00 2 641841668 2641ba04 3 641841672 2641ba08 |
해당 소스는 data[] 라는 배열에 1, 2, 3 이라는 값을 저장한 후, 포인터 변수 p 에 data 배열의 가장 첫번째 주소를 저장하도록 변수를 생성하였다.
이후 출력문에서 포인터 배열 p 의 주소가 가리키는 데이터와, 그 주소의 10진수 출력, 16진수 출력을 수행하였고.
결과값 : 1 641841664 2641ba00
해당 출력값을 1씩 증가시켜서 출력하였을 경우에는
결과값 : 2 641841668 2641ba04
위와 같이 data[1] 의 변수를 *(p+1) 을 통해서 출력하고 주소값은 int 형이기에 4byte 씩 증가됨을 확인 할 수 있다.
'자료구조' 카테고리의 다른 글
문자열 - 3 (0) | 2022.11.17 |
---|---|
문자열 - 2 (0) | 2022.11.17 |
문자열 - 1 (0) | 2022.11.17 |
배열, 포인터, 동적 메모리 - 3 (0) | 2022.11.15 |
배열, 포인터, 동적 메모리 - 1 (0) | 2022.11.15 |