270 likes | 397 Views
Pointer & Linked List. 1. Pointer. 포인터란 ?. 포인터와 포인터 변수 메모리의 주소 값을 저장하기 위한 변수 " 포인터 " 를 흔히 " 포인터 변수 " 라 한다 . 주소 값과 포인터는 다른 것이다. int main(void) { char c='a'; int n=7; double d=3.14;. 포인터란 ?. 포인터와 포인터 변수 변수의 위치를 가리키는 하나의 변수. int main(void) { int n=7; int * pN = & n;
E N D
포인터란? • 포인터와 포인터 변수 • 메모리의 주소 값을 저장하기 위한 변수 • "포인터"를 흔히 "포인터 변수"라 한다. • 주소 값과 포인터는 다른 것이다. int main(void) { char c='a'; int n=7; double d=3.14; . . . . .
포인터란? • 포인터와 포인터 변수 • 변수의 위치를 가리키는 하나의 변수 int main(void) { intn=7; int *pN = &n; . . . . .
포인터란? • 포인터의 타입과 선언 • 포인터 선언 시 사용되는 연산자 : * • A형 포인터(A*) : A형 변수의 주소 값을 저장 int main(void) { int *a;// a라는 이름의 int형 포인터 char *b;// b라는 이름의 char형 포인터 double *c;// c라는 이름의 double형 포인터 . . . . .
포인터란? • 주소 관련 연산자 • & 연산자 : 변수의 주소 값 반환 • * 연산자 : 포인터가 가리키는 메모리 참조 int main(void) { int a=2005; int *pA=&a; printf(“%d”, a); //직접 접근 printf(“%d”, *pA); // 간접 접근 . . . . .
포인터의 타입 • 포인터에 다양한 타입이 존재하는 이유 • 포인터 타입은 참조할 메모리의 크기 정보를 제공 #include <stdio.h> int main(void) { int a=10; int *pA = &a; double e=3.14; double *pE=&e; printf(“%d %f”, *pA, *pE); return 0; }
Q1. 포인터의 사용 • Question 1-1 • Question 1-2 int main(void) { int *pA; *pA=10; return 0; } int main(void) { int* pA=100; *pA=10; return 0; }
Assignment #1 해설 • 배열의 이름 • 배열 이름은 첫 번째 요소의 주소 값을 나타낸다. int a[5]={0, 1, 2, 3, 4}
Assignment #1 해설 • 배열 이름의 포인터 활용 • 배열 이름을 포인터처럼, 포인터를 배열 이름처럼 활용 하는 것이 가능하다. #include <stdio.h> int main(void) { intarr[3]={0, 1, 2}; int *ptr; ptr=arr; printf("%d, %d, %d \n", ptr[0], ptr[1], ptr[2]); return 0; }
Assignment #1 해설 • Question 2. #include <stdio.h> int main(void) { int a[2][2] = { {1,2},{3,4}}; int**ptr=a; printf("%d\n", ptr[0][0]); return 0; }
Assignment #1 해설 • 2차원 배열의 포인터 활용 #include <stdio.h> int main(void) { intarr[3][3]={{0, 1, 2},{2, 3, 4},{5, 6, 7} }; int(*ptr)[3]=arr; printf("%d, %d, %d \n", ptr[0][0], ptr[1][0], ptr[2][0]); return 0; } arr arr[0] arr[1] arr[2] ptr arr[1][0] arr[2][0] arr[0][0] 0 2 5 1 3 6 2 4 7
Call by Value & Call by Reference • 값의 복사에 의한 전달 • 해당 변수를 직접 인자로 넘긴다. • 참조를 인자로 전달 • 해당 변수를 가리키는 주소를 인자로 넘긴다.
Call by Value • 기본적인 인자의 전달 방식 • 값의 복사에 의한 전달
Call by Value-SWAP int main(void) { int val1=10; int val2=20; swap(val1, val2); printf("val1 : %d \n", val1); printf("val2 : %d \n", val2); return 0; } void swap(int a, int b) { int temp=a; a=b; b=temp; printf("a : %d \n", a); printf("b : %d \n", b); }
Call by Reference(1) • Call-By-Reference • 참조(참조를 가능케 하는 주소 값)를 인자로 전달하는 형태의 함수 호출
Call by Reference(2) • 배열의 함수 인자 전달 방식 • 배열 이름(배열 주소, 포인터)에 의한 전달 #include <stdio.h> void fct(int *arr2); int main(void) { int arr1[2]={1, 2}; fct(arr1); printf("%d \n", arr1[0]); return 0; } void fct(int *arr2) { printf("%d \n", arr2[0]); arr2[0]=3; }
Call by Reference-SWAP • Call-By-Reference에 의한 swap int main(void) { int val1=10; int val2=20; printf("Before val1 : %d \n", val1); printf("Before val2 : %d \n", val2); swap(&val1, &val2); //val1, val2 주소 전달 printf("After val1 : %d \n", val1); printf("After val2 : %d \n", val2); return 0; } void swap(int* a, int* b) { int temp=*a; *a=*b; *b=temp; }
& Operator • scanf함수에서 &연산자를 사용하는 이유 int main(void) { intval; scanf("%d", &val); . . . . .
연결 리스트 기본 • typedefstructnode{ int Data; 노드 내부의 실제 데이터 또는 레코드 node* Next; Next가 가리키는 것은 node 타입 } node; 구조체에 node라는 새로운 타입명 부여 typedef node* Nptr; Nptr타입이 가리키는 것은 node 타입 Nptr p, q; Nptr타입 변수 p, q를 선언
연결 리스트-노드만들기 • 노드 만들기, 이어 붙이기 p = (node *)malloc(sizeof(node)); p->Data = 33; p->Next = (node *)malloc(sizeof(node)); p->Next->Data = 22; p->Next->Next = NULL;
연결 리스트-노드삽입 • 간단한 삽입 p = (node *)malloc(sizeof(node)); p->Data = 8; p->Next = Temp->Next; Temp->Next = p;
연결 리스트-노드 삭제 • 간단한 삭제 p = Temp->Next; Temp->Next = Temp->Next->Next; delete p;
연결 리스트-노드디스플레이 • 디스플레이 Temp = Head; While (Temp != NULL) { cout<<“ Temp->Data=“<< Temp->Data<<endl ; Temp = Temp->Next; }
Assignment #3 해설 • 단일 연결 리스트의 역순