드디어 c언어의 그렇게도 어렵다는 포인터공부를 시작했다.
int num1 =10; 와 같이 변수를 지정할때 이변수는 컴퓨터의 메모리에 생성이된다.
즉 메모리에 일정 공간을 확보하여 원하는 값을 가져오거나 저장하는 방식이다.
보통 변수는 변수 이름이 있지만 메모리의 특정 위치에 위치하고 있으므로 메모리 주소로도 표현할수있다.
메모리 주소를 구할때는 &변수처럼 변수앞에 &을 써주면 되고 printf("%p\n", &변수);
서식 지정자는 %p , 16진수의 %x 를 사용해도 된다.
다음과 같이 포인터 변수는 *를 사용하여 선언합니다(포인터 변수는 포인터로 줄여서 부르기도 합니다).
- *자료형 포인터이름; 포인터 선언
- 포인터변수 = &변수; ← 변수의 주소값을 넣을때
- 이때 포인터변수에 *를 쓰지않는다. *포인터변수 = &변수; 는 자료형이 맞지않기때문에 컴파일 불가.
- 주소값이 아닌 value를 넣게 될때는 *포인터변수 = 변수; 가 맞다.
int *numptr , &num1 → pointer to int, address of int
int num1 , *n umptr → int
void 포인터
기본적으로 C 언어는 자료형이 다른 포인터끼리 메모리 주소를 저장하면 컴파일 경고가 발생한다. 하지만 void 포인터는 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장할 수 있습니다. 반대로 다양한 자료형으로 된 포인터에도 void 포인터를 저장할 수도 있다. 이런 특성 때문에 void 포인터는 범용 포인터라고 한다.
포인터에는 malloc함수로 원하는 만큼 메모리를 할당할수 있다. <stdlib.h>에 포함되어있다.
malloc함수로 메모리를 할당하고→ 사용 → free함수로 해제 시키는 방식으로 사용이된다.
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
int main()
{
int num1 = 10;
int *numPtr1;
numPtr1 = &num1;
int *numPtr2;
numPtr2 = malloc(size of (int)); // int의 크기 4바이트만큼 동적 메모리 할당
printf("%p\n", numPtr1);
printf("%p\n", numPtr2);
free(numPtr2); //동적으로 할당한 메모리 해제
return(0);
}
여기서 numPtr1에는 일반 변수의 메모리 주소를 할당했고, numPtr2에는 malloc 함수로 메모리를 할당했다. 같은 메모리 주소라도 내부적으로는 약간의 차이가 있다. 스택과 힙 두 가지인데 변수는 스택(stack)에 생성되며 malloc 함수는 힙(heap) 부분의 메모리를 사용한다
스택과 힙의 큰 차이점은 메모리 해제다. 스택에 생성된 변수는 사용한 뒤 따로 처리를 해주지 않아도 되지만 malloc 함수를 사용하여 힙에서 할당한 메모리는 반드시 해제를 해주어야 한다. 따라서 다음과 같이 free 함수로 메모리를 해제
memset 함수를 사용하면 메모리의 내용을 원하는 크기만큼 특정값으로 설정할 수 있다.
memset함수를 사용하기 위해서는 string.h 나 memory.h 헤더 파일을 사용하면된다,
- memset(포인터, 설정할값, 크기);
- void memset(void _Dst, int _Val, size_t _Size);
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
#include <string.h> // memset 함수가 선언된 헤더 파일
int main()
{
long long *numPtr = malloc(sizeof(long long)); // long long의 크기 8바이트만큼 동적 메모리 할당
memset(numPtr, 0x27, 8); // numPtr이 가리키는 메모리를 8바이트만큼 0x27로 설정
printf("0x%llx\n", *numPtr); // 0x2727272727272727: 27이 8개 들어가 있음
free(numPtr); // 동적으로 할당한 메모리 해제
return 0;
}
개념을 머리에 익힐려고 계속보고는 있지만 조금 헷갈린다 더 열심히해야지
'IT 공부 > C언어' 카테고리의 다른 글
[C언어] 버블정렬을 이용한 가장 작은수 출력하기 (배열) (2) | 2021.08.02 |
---|---|
[C언어] 배열, 2진수를 10진수로 10진수를 2진수로 (0) | 2021.08.02 |
[C언어] Continue (0) | 2021.07.29 |
[C언어] while문 , 1110번 백준 더하기싸이클 (3) | 2021.07.29 |
[C언어] for문을 이용한 quiz (0) | 2021.07.20 |