자료구조 002 | Arrays and Structures (1)

Yunny.Log ·2021년 9월 25일
post-thumbnail

Arrays

1. int list2[5] 이라는 integer array 선언

1) 주소

  • list2[0] = 주소 a
  • list2[1] = 주소 a + sizeof(int)
  • list2[2] = 주소 a + 2*sizeof(int)
  • list2[3] = 주소 a + 3*sizeof(int)
  • list2[4] = 주소 a + 4*sizeof(int)

2) int * list1 이라는 포인터와 동일한 type

  • 차이점
    => int list2[5]로 선언했을 시 5개의 int를 담을 memory space를 미리 예약하는 것
    => int * list1 으로 선언했을 시 memory 동적할당이 나중에 필요

3) int list2[5] 선언 후 이를 포인터로 사용 가능

  • list2 : list2[0]을 가리키는 포인터 (배열의 첫번째 위치 가리킴)
  • list2+i : list2[i]를 가리키는 포인터 (포인터는 위치 담는 아이)
  • (list2+i) : &list2[i] 와 같은 의미
  • *(list2+i) : list2[i]와 같은 의미

(ex) 아래의 두 결과값은 같다

printf("%d", list2[i]);
printf("%d", *(list2+i));

2. 배열 포인터 사용해 위치 & 값 출력

void print1(int*, int);
void main() {
	int one[] = {0, 1, 2, 3, 4};
	print1(one, 5);
	}
	void print1(int *ptr, int rows) {
	/* print out a one-dimensional array using a pointer */
	int i;
	printf("address contents\n");
	for(i = 0; i < rows; i++) 
		printf("%8p%5d\n", ptr+i, *(ptr+i));
	printf("\n");
}
  • %p : 위치 출력용 / ptr + i == &ptr[i] / *ptr[i] == ptr[i]

3. 1차원 배열 동적할당

  • 배열을 매개변수로 사용해서 넘겨줄 때 선언된 자체는 포인터
    => 포인터를 매개변수로 넘겨줄 때 그 주소 넘겨주면 되는데 배열의 주소는 배열의 이름과 같음
void main() {
	int i, n, *data;
	printf("How many integers do you want to generate? ");
	scanf("%d", &n);
	data = malloc(n*sizeof(int));
	for(i=0; i<n; i++) {
		data[i] = rand();
		printf("%d\n", data[i]);
	} 
	free(data);
	}

(+) C언어 : rand()%범위 해주면 입력한 범위 안의 숫자들로만 랜덤하게 지정됨
(ex) rand()%100 => 100이내의 숫자들만 랜덤하게 등장

(+) 1차원 배열 재동적할당

void main() {
	int i, n, m, *data;
	printf("How many integers do you want to generate? ");
	scanf("%d", &n);
	data = malloc(n*sizeof(int));
	for(i=0; i<n; i++) data[i] = rand();
		printf("How many integers do you want to generate additionally? ");
		scanf("%d", &m);
		data = realloc(data, (n+m)*sizeof(int));
	for(i; i<n+m; i++) data[i] = rand();
		for(i=0; i<n+m; i++) printf("%3d: %8d\n", i+1, data[i]);
	free(data);
}

=> data = realloc(data, (n+m)*sizeof(int));
1) data : 처음에 데이터 할당된 배열의 이름을 주소로 입력
2) (n+m)*sizeof(int) : 사용자가 입력한 더 늘리고 싶은 데이터 양 m 을 기존의 데이터 양인 n 과 더해서 재할당

4. 2차원 배열 동적할당

int** make2dArray(int rows, int cols) {
	int **x, i;
/* allocate memory for row pointers */
	x = malloc(rows*sizeof(*x));
	/* allocate memory for each row */
	for(i = 0; i < rows; i++) 
		x[i] = malloc(cols * sizeof(**x));
	return x;
}

(+) main 함수와 활용했을 때

#include <stdio.h>
#include <stdlib.h>

int** make2dArray(int, int);

void main() {
    int i, j;
    int **matrix; //2차원 배열이라 이중포인터 설정(row,col 둘다 접근 needed)

    matrix = make2dArray(5, 5);

    for(i = 0; i < 5; i++) { //row 먼저
        for(j = 0; j < 5; j++) { //col 은 그 다음
            matrix[i][j] = i*5 + j + 1;
            printf("%2d ", matrix[i][j]);
        }
        printf("\n");
    }

    /* free memory */ //이떄 row, col 둘다 해제해줘야 해서 그냥 하던 것처럼 free(배열)하면 안됨
    //우선 col 먼저 해제하기 위해 i=0;i<row;i++ 로 row에 접근해서 col해제
    for(i = 0; i < 5(=row); i++) 
        free(matrix[i]); //col먼저 해제
    free(matrix); //row 해제
}

0개의 댓글