- 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)
- 차이점
=> int list2[5]로 선언했을 시 5개의 int를 담을 memory space를 미리 예약하는 것
=> int * list1 으로 선언했을 시 memory 동적할당이 나중에 필요함
- list2 : list2[0]을 가리키는 포인터 (배열의 첫번째 위치 가리킴)
- list2+i : list2[i]를 가리키는 포인터 (포인터는 위치 담는 아이)
- (list2+i) : &list2[i] 와 같은 의미
- *(list2+i) : list2[i]와 같은 의미
(ex) 아래의 두 결과값은 같다
printf("%d", list2[i]);
printf("%d", *(list2+i));
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");
}
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 과 더해서 재할당
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 해제
}