본문 바로가기

자료구조

배열, 포인터, 동적 메모리 - 2

반응형

배열 (int a[10]) : 10개의 정수를 수용할 메모리 40byte 를 할당한 변수

배열의 이름은 배열의 시작 주소를 저장하는 포인트 변수이며 이를 활용 할 수 있다.

(다만 그 포인트 주소의 값을 변경할 수는 없음)

 

a[10] 배열은 a 라는 포인터 변수를 갖고 있다.

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