[211109] 교육 9일차

oxllz·2022년 1월 25일
0

교육

목록 보기
7/41

C

이중포인터

#include <stdio.h>
typedef struct abcd {
	int name;
	struct abcd* next;
} Node;
/*
	보통 함수로 쪼갤때는 '동작' 하나를 함수로 구현하는것이 일반적이다 
*/
Node* init() {
	Node *t;
	t = (Node*)malloc(sizeof(Node));
	t->name = 0;
	t->next = NULL;
	return t;
}
void init_v2( Node** a, Node** b ) {
	*a = (Node*)malloc(sizeof(Node));
	(*a)->name = 0;
	(*a)->next = NULL;
	(*b) = (*a);
}
//
Node* add( Node* t, int name2 ) {
	Node* temp;	
	temp = (Node*)malloc(sizeof(Node));
	temp->name = name2;
	temp->next = NULL;
	t->next = temp;
	return temp;
}
//
void print_all( Node* hd ) {
	Node* temp;
	for( temp = hd->next ; temp != NULL ; temp = temp->next ) {
		printf("%d\n", temp->name );
	}
}
//
Node* delete_all( Node* hd ) {
	Node* pre;
	Node* post;
	post = hd;
	pre = hd->next;
	while( pre != NULL ) {
		post = pre;
		pre = pre->next;
		free( post );
	}
	return hd;
}
int main() {
	Node* head;
	Node* tail;
	Node* temp;
	Node* post;
	Node* pre;
	// 초기상황
	/*  위에 선언된 init 을 호출하여 초기상황을 만든다
		head = init();
		tail = head;	
		init_v2( head, tail ); -- 이 방법으로는 왜 안되는지 정리하자.
	*/
	init_v2( &head, &tail );
	// 아래의 함수 호출이 입력과정을 수행하도록 함수를 선언하세요.
	tail = add( tail, 10 );
	tail = add( tail, 20 );
	//
	print_all( head );
   	 //
	tail = delete_all( head );
	// 앞에서 부터 차례로 삭제하고 초기상황으로 돌림
	free( head );
	return 0;
}
void init_v2( Node* a, Node* b ) {
...
}
init_v2( head, tail ); // 왜 안될까??

포인터의 메모리 주소는 &head, &tail 로 나타내야 하므로 이중 포인터를 사용한다.


이중 포인터가 a 가 head를 가리키고 head가 Node 를 가리키게 된다.

포인터 a가 가리키는 공간 => *a
포인터 a가 가리키는 공간의 값 => **a


add함수 동작과정


JAVA

Garbage Collection

떠돌이 개와 개장수에 비유

class 시고르자브 {
	int 위장;	
}
//
public class Test073 {
	public static void main( String[] args ) {
//	한마리의 개를 여러 이름으로 부르는 집이 3개 있다고 가정
		시고르자브 mary = new 시고르자브();
		시고르자브 zzong = mary;
		시고르자브 happy = mary;
//		
		mary.위장   = mary.위장 + 200;
		zzong.위장 += 200; 
		happy.위장 += 200;
//		
		System.out.println( mary.위장 );
// 	개에게 밥을 주던 집들이 이사를 간다면?
		mary = null;	// 밥줄 하나 끊김: 2개 
		zzong = null;   // 밥줄 하나 더 끊김 : 1개
		happy = null;   // 밥줄 다 끊김 : 유기견 - 자신을 가리키는 포인터가 0개 되는 순간 
		// 그 시점에서 Garbage Collector ( 개장수 ) 가 메모리를 회수한다.
	}
}

가베지 콜렉션 : 자신을 가리키는 참조형 변수가 0개가 되는 순간 Garbage Collector 가 메모리를 회수한다. C 에서의 free() 를 대신하는 역할
C 는 free() 호출 시 곧바로 메모리를 회수하는데 java 는 보관하고 있다가 메모리가 부족할때 한꺼번에 회수한다.

0개의 댓글