#include<stdio.h>
#include<stdlib.h>
// ---- 포인터와 배열의 관계 ----
// 포인터와 배열은 밀접한 관계를 갖고 있으나, 분명한 차이점이 있다.
// 배열은 선언하게 되면 기본적으로 배열 자기 자신의 시작 주소를 갖고 있다.
// 포인터와 배열은 둘 다 주소를 가지고 연산을 진행하기 때문에 포인터를 배열처럼 인덱스를 통해 접근할 수 있다.
// 배열은 자기 자신의 공간을 사용하고, 포인터는 다른 누군가의 공간을 빌려서 사용한다.
int main()
{
char str[10];
printf("str의 주소 : %p\n", &str);
printf("str의 값 : %p\n", str);
printf("입력 : ");
scanf("%s", str); // &없이 배열의 이름만 작성하는 이유 - 어차피 둘이 같다면 굳이 붙일 이유가 없기 때문이다.
printf("출력 : %s\n", str);
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------
int main()
{
char str1[10] = "Hello";
char* str2 = "Abcde";
printf("str1 : %s\n", str1); // 둘다 주소정보를 전달. %s는 주소를 넘겨받아서 해당 주소로 넘어가서 NULL이 나올 때까지 출력.
printf("str2 : %s\n", str2);
str1[0] = 'B';
// str2[0] = 'Z'; // 바꿀 수 없는 리터럴 상수형식. 리터럴 상수는 값의 변경이 불가능.
printf("str1 : %c%c%c%c%c\n", str1[0], str1[1], str1[2], str1[3], str1[4]);
// printf("str2 : %c%c%c%c%c\n", str2[0], str2[1], str2[2], str2[3], str2[4]);
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------
// ---- 동적 할당 ----
// 프로그램 중간에 메모리 공간의 크기를 지정해서 할당받고, 그 공간을 사용 후, 원하는 시점에 해제하는 방식.
// 메모리 공간을 할당받을 때는 malloc() 함수를 사용해서 할당받을 수 있다. (memory allocation)
// 이때 반드시 stdlib.h 헤더파일을 선언해줘야 한다.
// malloc() 함수의 원형 : 주소를 저장할 변수 = malloc(크기);
// 동적 할당을 통해서 할방받은 메모리 공간은 Heap 영역에 해당한다.
// 동적 할당받은 메모리 공간을 해제할 때는 free(해제할 공간의 주소); 형식으로 해제할 수 있다.
// 한 번의 동적 할당에는 반드시 한 번의 동적 해제가 진행되어야 한다.
// malloc() 함수에서 크기를 넘겨줄 때에는 기본적으로 sizeof() 연산자를 이용해서 넘겨준다.
int main()
{
// 저장할 공간의 자료형* 변수명;
// 주소를 저장할 변수 = malloc(크기);
// malloc 함수의 설명을 보고 void* 라는 보이드 포인터라는 자료형이 하나 존재한다고 생각해보자.
int* ptr;
ptr = (int*)malloc(4);
*ptr = 10;
printf("출력 %d\n", *ptr);
// free(해제할 공간의 주소)
free(ptr);
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------
// 다른 예제
int main()
{
int* ptr;
ptr = (int*)malloc(sizeof(int) * 2);
ptr[0] = 10;
ptr[1] = 20;
printf("출력 : %d %d\n", ptr[0], ptr[1]);
free(ptr); // 출력 결과 화면에서는 확인되지 않는다.
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------
// 동적 할당 문제
// 사용자에게 영단어를 입력받아 역순으로 출력하세요.
// 단 영단어를 입력받기 전에 입력할 영단어의 길이를 먼저 입력받아 그 길이만큼 공간을 할당하세요.
// ex) 영단어 길이 입력 : 5
// 영단어 입력 : hello
// 영단어 출력 : olleh
int main()
{
int len, i;
char* word;
printf("영단어 길이 입력 : ");
scanf("%d", &len);
word = (char*)malloc(sizeof(char)*len+1); // 널문자까지 고려
printf("영단어 입력 : ");
scanf("%s", word); // 입력값을 저장할 공간의 주소
printf("영단어 출력 : ");
for (i = len - 1; i >= 0; i--)
{
printf("%c", word[i]);
}
printf("\n");
free(word);
return 0;
}
'IT&코딩 > 자료구조' 카테고리의 다른 글
자료구조 - 8일차 (PUSH & POP) (0) | 2022.09.27 |
---|---|
자료구조 - 7일차 (퀴즈) (0) | 2022.09.19 |
자료구조 - 5일차 (구조체) (0) | 2022.09.15 |
자료구조 - 4일차 (재귀함수) (0) | 2022.09.15 |
자료구조 - 3일차 (변수) (0) | 2022.09.12 |