C 8장. 포인터 #include <stdio.h> int main(void) { int num;

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
포인터란? 사전적 의미로써 지시자 혹은 가리키는 것으로 풀이할 수 있으나, C프로그래밍 언어에서는 메모리의 주소를 저장하는 변수이다. 포인터 자체가 하나의 변수이기 때문에 포인터도 메모리 내에서 선언이 되며 일반 상수를 저장하는 변수가 아닌 주소값을 저장하는 변수라는 점에서.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 9 장 구조체와 공용체.
-Part2- 제3장 포인터란 무엇인가.
11장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
C 11장. 포인터의 활용 #include <stdio.h> int main(void) { int num;
윤 홍 란 포인터 윤 홍 란
자료 구조: Chapter 3 (2)구조체, 포인터
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
5장 배열 작성자 : 변재현.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
제 3장. C보다 나은 C++ II.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
포인터 활용 포인터 활용.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
2주차: 변수, 수식, Control Flow.
14장. 포인터와 함수에 대한 이해.
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터.
C#.
C 2장. C 프로그램 시작하기 #include <stdio.h> int main(void) { int num;
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
C 3장. 변수와 데이터형 #include <stdio.h> int main(void) { int num;
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
Chapter 08. 함수.
에어 PHP 입문.
Chapter 09. 포인터 1.
7주차: Functions and Arrays
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
어서와 C언어는 처음이지 제21장.
C 4장. 연산자 #include <stdio.h> int main(void) { int num;
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

C 8장. 포인터 #include <stdio.h> int main(void) { int num; printf(“Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("Is negative.\n"); printf("num = %d\n", num); return 0; }

학습목표 ■ 포인터란 무엇인지 알아보고, 포인터를 선언하고 사용하는 방법을 알아본다. ■ 포인터를 사용할 때 주의사항을 알아본다. ■ 포인터 연산에 대하여 알아본다. ■ 배열과 포인터의 관계에 대하여 알아본다. ■ 문자열 상수와 문자열 포인터에 대하여 알아본다. 8장. 포인터

목차 8장. 포인터 포인터의 기본 포인터란 포인터 사용 시 주의사항 배열과 포인터의 관계 포인터와 문자열 문자열 상수 포인터의 연산 포인터로서의 배열 배열의 원소를 가리키는 포인터 배열과 포인터의 차이점 포인터와 문자열 문자열 상수 문자열 포인터 const 포인터 8장. 포인터

포인터란 포인터의 기본 다른 변수의 주소를 저장하는 변수 포인터 변수는 주소를 저장하기 위해서 주소 크기만큼 메모리를 사용하는데, 주소의 크기는 시스템에 따라 다르다. 포인터 변수는 다른 변수를 가리키는 변수이다. 포인터는 주소를 이용해서 특정 변수에 접근할 수 있도록 도와준다. 8장. 포인터

포인터의 기본 포인터의 선언 포인터 변수를 선언할 때는 데이터 형을 먼저 쓰고, *를 쓴 다음, 변수 이름을 적어준다. 8장. 포인터

포인터변수는 포인터 형에 관계 없이 항상 크기가 4바이트이다. (32비트 플랫폼 기준) 포인터의 기본 포인터의 선언 포인터변수는 포인터 형에 관계 없이 항상 크기가 4바이트이다. (32비트 플랫폼 기준) 8장. 포인터

포인터형의 크기 포인터의 기본 포인터의 선언 8장. 포인터 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* Ex08_01.c */ #include <stdio.h> int main(void) { char *pc; short *ps; int *pi; float *pf; double *pd; printf("char* 의 크기 : %d\n", sizeof(pc)); printf("short* 의 크기 : %d\n", sizeof(ps)); printf("int* 의 크기 : %d\n", sizeof(pi)); printf("float* 의 크기 : %d\n", sizeof(pf)); printf("double*의 크기 : %d\n", sizeof(pd)); return 0; } 포인터 변수의 선언 8장. 포인터

간접 참조 연산자 포인터의 기본 포인터 변수 이름 앞에 *를 사용하면 포인터 변수가 가리키는 변수에 접근할 수 있다. 포인터의 사용 간접 참조 연산자 포인터 변수 이름 앞에 *를 사용하면 포인터 변수가 가리키는 변수에 접근할 수 있다. * 연산자는 반드시 포인터 변수 앞에만 사용할 수 있으며, 포인터 변수가 아닌 일반 변수 앞에 사용해서는 안된다. 8장. 포인터

주소 구하기 연산자 포인터의 기본 변수 이름 앞에 &를 사용하면 변수의 주소를 구할 수 있다. 포인터의 사용 주소 구하기 연산자 변수 이름 앞에 &를 사용하면 변수의 주소를 구할 수 있다. 반드시 변수 이름 앞에만 사용할 수 있으며, 상수나 수식에는 사용할 수 없다. & 연산자로 구한 주소를 포인터 변수에 대입할 때 형이 일치하는 경우에만 대입하도록 주의해야 한다. 8장. 포인터

포인터 변수의 선언 및 사용 예 포인터의 기본 포인터의 사용 8장. 포인터 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: /* Ex08_02.c */ #include <stdio.h> int main(void) { int x; int *p; p = &x; *p = 10; printf("*p = %d\n", *p); printf("x = %d\n", x); printf("p = %p\n", p); printf("&x = %p\n", &x); printf("&p = %p\n", &p); return 0; } int형 변수의 선언 int*형 변수의 선언 p는 x의 주소 저장 p가 가리키는 변수에 접근 8장. 포인터

이중 포인터 포인터의 기본 포인터 변수도 주소를 갖기 때문에 포인터 변수의 주소를 저장하는 포인터 변수를 선언할 수있다. 포인터의 사용 이중 포인터 포인터 변수도 주소를 갖기 때문에 포인터 변수의 주소를 저장하는 포인터 변수를 선언할 수있다. int*형 변수의 주소를 저장하는 변수는 int**형으로 선언할 수 있는데, 이때 사용된 int**를 이중 포인터(double pointer)라고 한다. 8장. 포인터

이중 포인터 포인터의 기본 이중 포인터가 가리키는 변수에 접근할 때도 간접 참조 연산자인 *를 사용한다. 포인터의 사용 이중 포인터 이중 포인터가 가리키는 변수에 접근할 때도 간접 참조 연산자인 *를 사용한다. 만일 이중 포인터가 가리키는 포인터를 이용해서 다시 int 변수에 접근하려면 **처럼 두 번 간접 참조(indirection)를 해야 한다. 8장. 포인터

포인터 변수의 데이터 형은 반드시 포인터 변수가 가리키는 변수의 데이터 형과 일치해야 한다. 포인터의 기본 포인터 사용 시 주의사항 포인터 변수의 데이터 형은 반드시 포인터 변수가 가리키는 변수의 데이터 형과 일치해야 한다. 포인터 변수가 가리키는 변수의 데이터 형과 일치하는 포인터 형으로 선언하고 사용해야 한다. 8장. 포인터

선언 시 초기화를 하지 않으면 쓰레기 값을 갖는다. 포인터의 기본 포인터 사용 시 주의사항 선언 시 초기화를 하지 않으면 쓰레기 값을 갖는다. 잘못된 메모리에 접근하므로 실행 에러 발생 포인터 변수는 초기화 후에 사용하는 것이 좋다. 널 포인터 0으로 초기화된 포인터 아무것도 가리키지 않는다는 의미 8장. 포인터

배열과 포인터의 관계 포인터의 연산 포인터와 +,-연산 포인터 변수에 정수 n을 더하거나 빼면 '포인터가 가리키는 데이터 형 x n'만큼 주소를 더하거나 뺀 값이 만들어진다. 8장. 포인터

포인터의 더하기, 빼기 배열과 포인터의 관계 포인터의 연산 8장. 포인터 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: /* Ex08_03.c */ #include <stdio.h> int main(void) { char ch; char* pc = &ch; int n; int *pi = &n; double d; double *pd = &d; char*형 변수의 선언 int*형 변수의 선언 double*형 변수의 선언 8장. 포인터

포인터의 더하기, 빼기 배열과 포인터의 관계 포인터의 연산 8장. 포인터 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: int i; for(i = 0 ; i < 3 ; i++ ) printf("pc + %d = %p\n", i, pc + i); printf("pi + %d = %p\n", i, pi + i); printf("pd + %d = %p\n", i, pd + i); return 0; } 8장. 포인터

배열과 포인터의 관계 포인터의 연산 포인터와 ++,-- 연산 8장. 포인터

포인터의 증감 연산자 이용 배열과 포인터의 관계 포인터의 연산 8장. 포인터 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: /* Ex08_04.c */ #include <stdio.h> int main(void) { int arr[5] = {10, 20, 30, 40, 50}; int *p = &arr[0]; int i; for(i = 0 ; i < 5 ; i++, p++) printf("%d\n", *p); return 0; } int*형 변수의 선언 포인터 변수의 증가 연산 8장. 포인터

배열을 인덱스 없이 이름만 사용하면 배열의 시작 주소가 된다. 배열과 포인터의 관계 포인터로서의 배열 배열을 인덱스 없이 이름만 사용하면 배열의 시작 주소가 된다. arr와 &arr[0]은 같다. 8장. 포인터

배열의 이름인 arr는 배열의 시작 주소이므로 포인터인 것처럼 사용할 수 있다. 배열과 포인터의 관계 포인터로서의 배열 배열의 이름인 arr는 배열의 시작 주소이므로 포인터인 것처럼 사용할 수 있다. arr[i]는 *(arr + i)와 같은 의미이다. 배열 이름은 마치 포인터 변수인 것처럼 사용할 수 있다. 8장. 포인터

포인터로서의 배열의 사용 예 배열과 포인터의 관계 포인터로서의 배열 8장. 포인터 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* Ex08_05.c */ #include <stdio.h> int main(void) { int arr[5] = {10, 20, 30, 40, 50}; int i; for(i = 0 ; i < 5 ; i++) printf("&arr[%d] = %p\n", i, &arr[i]); } printf("arr + %d = %p\n", i, arr + i); int 배열의 선언 배열 원소의 주소 구하기 8장. 포인터

포인터로서의 배열의 사용 예 배열과 포인터의 관계 포인터로서의 배열 8장. 포인터 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: for(i = 0 ; i < 5 ; i++) { printf("arr[%d] = %d\n", i, arr[i]); } printf("*(arr + %d) = %d\n", i, *(arr + i)); return 0; 배열 원소의 값 구하기 8장. 포인터

배열과 포인터의 관계 포인터로서의 배열 실행결과 8장. 포인터

배열과 포인터의 관계 배열의 원소를 가리키는 포인터 포인터 변수가 배열의 첫 번째 원소(arr[0])를 가리키고 있을 때, 포인터를 이용해서 배열의 해당 원소와 나머지 원소에 접근할 수 있다. *(p + i)는 p[i]와 같은 의미이다. 포인터 변수를 마치 배열 이름인 것처럼 인덱스로 사용할 수 있다. 8장. 포인터

포인터를 배열처럼 사용하는 경우 배열과 포인터의 관계 배열의 원소를 가리키는 포인터 8장. 포인터 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* Ex08_06.c */ #include <stdio.h> int main(void) { int arr[5] = {10, 20, 30, 40, 50}; int *p = arr; int i; for(i = 0 ; i < 5 ; i++) printf(“arr + %d = %p\n", i, arr + i); } printf(“p + %d = %p\n", i, p + i); 배열의 시작 주소로 초기화된 포인터 배열 원소의 주소 구하기 8장. 포인터

포인터를 배열처럼 사용하는 경우 배열과 포인터의 관계 배열의 원소를 가리키는 포인터 8장. 포인터 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: for(i = 0 ; i < 5 ; i++) { printf("arr[%d] = %d\n", i, arr[i]); } printf(”p[%d] = %d\n", i, p[i]); return 0; 배열 원소의 값 구하기 8장. 포인터

배열은 연속된 같은 데이터 형의 변수들의 모임이고, 포인터는 다른 변수의 주소이다. 배열과 포인터의 관계 배열과 포인터의 차이점 배열은 연속된 같은 데이터 형의 변수들의 모임이고, 포인터는 다른 변수의 주소이다. 배열은 일단 메모리에 할당되고 나면 배열의 시작 주소를 변경할 수 없다. 포인터 변수는 변수이고, 따라서 포인터 변수에 보관된 주소를 변경할 수도 있다. 8장. 포인터

배열과 포인터의 관계 배열과 포인터의 차이점 배열과 포인터의 차이점 8장. 포인터

문자열 리터럴은 다른 상수와 다르게 메모리에 보관해두고 사용한다. 포인터와 문자열 문자열 상수 문자열 리터럴은 다른 상수와 다르게 메모리에 보관해두고 사용한다. 문자열 리터럴은 실제로는 문자열 리터럴의 주소를 의미한다. 문자열 리터럴도 상수이므로 값을 변경할 수 없다. 8장. 포인터

포인터와 문자열 문자열 상수 char* 변수가 문자열 리터럴을 가리키고 있을 때 문자열 리터럴의 내용을 변경할 수는 없지만 char* 변수에 다른 문자열 리터럴의 주소를 대입하는 것은 가능하다. 8장. 포인터

문자열 리터럴의 의미 포인터와 문자열 문자열 상수 8장. 포인터 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex08_07.c */ #include <stdio.h> #include <string.h> int main(void) { char *p = "abcde"; printf("p = %s\n", p); printf("p = %p\n", p); printf("p = %p\n", "abcde"); p[0] = 'A'; strcpy(p, "hello"); return 0; } 문자열 리터럴의 주소로 초기화된 포인터 실행 에러 실행 에러 8장. 포인터

문자열 포인터의 변경 포인터와 문자열 문자열 상수 8장. 포인터 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* Ex08_08.c */ #include <stdio.h> #include <string.h> int main(void) { char *p = "abcde"; printf("p = %s\n", p); printf("p = %p\n", p); printf("p = %p\n", "abcde"); p = "hello"; printf("p = %p\n", "hello"); return 0; } 문자열 리터럴의 주소로 초기화된 포인터 문자열 포인터 변경 8장. 포인터

포인터와 문자열 문자열 상수 문자 배열에 문자열을 저장하려면 = 연산자 대신 strcpy 함수를 이용해야 하고, 문자열을 비교하려면 == 연산자 대신 strcmp 함수를 이용해야 한다. 8장. 포인터

char* 변수에는 문자열 리터럴의 주소를 저장할 수도 있고, 문자 배열의 주소를 저장할 수도 있다. 포인터와 문자열 문자열 포인터 char* 변수에는 문자열 리터럴의 주소를 저장할 수도 있고, 문자 배열의 주소를 저장할 수도 있다. 문자열 포인터가 문자열 리터럴을 가리킬 때는, 문자열 포인터로 가리키는 문자열을 변경하는 것은 모두 실행 에러가 된다. 하지만 문자열 포인터에 다른 문자열 리터럴의 주소를 저장하는 것은 가능하다. 8장. 포인터

문자열 포인터가 문자 배열을 가리킬 때는, 배열은 변경할 수 있으므로 문자열 포인터로 가리키는 문자열을 변경할 수 있다. 포인터와 문자열 문자열 포인터 문자열 포인터가 문자 배열을 가리킬 때는, 배열은 변경할 수 있으므로 문자열 포인터로 가리키는 문자열을 변경할 수 있다. 8장. 포인터

포인터 변수를 선언할 때 const 키워드를 사용할 수 있다. 포인터와 문자열 const 포인터 포인터 변수를 선언할 때 const 키워드를 사용할 수 있다. const가 포인터가 가리키는 데이터 형 앞에 오는 경우 포인터가 가리키는 값을 변경할 수 없다. 포인터 변수 자신의 값인 주소를 변경하는 것은 가능하다. 8장. 포인터

const가 포인터 변수 이름 앞에 오는 경우 포인터와 문자열 포인터가 가리키는 값은 변경할 수 있지만 포인터 변수 자신의 값(주소)를 변경할 수 없게 된다. 8장. 포인터

const가 데이터 형 앞과 포인터 변수 이름 앞 양쪽 모두에 오는 경우 포인터와 문자열 const 포인터 const가 데이터 형 앞과 포인터 변수 이름 앞 양쪽 모두에 오는 경우 포인터가 가리키는 값도 변경할 수 없고 포인터 변수 자신의 값(주소)도 변경할 수 없게 된다. 8장. 포인터

포인터의 기본 학습정리 포인터란 : 다른 변수의 주소를 저장하는 변수 포인터의 선언 : 데이터 형, *, 변수명이 필요하다. int * p; 포인터의 사용 : 변수의 주소를 구할 때는 주소 구하기 연산자 &를 이용하고, 포인터가 가리키는 변수에 접근할 때는 간접 참조 연산자 *를 이용한다. int *p = &x; *p = 10; 포인터 사용 시 주의사항 : 포인터 변수는 포인터가 가리키는 변수의 데이터 형과 일치하도록 선언해야 한다. 잘못된 포인터를 사용하는 것은 위험하므로, 포인터가 가리키는 변수가 없을 때는 NULL을 저장한다. 8장. 포인터

포인터와 배열의 관계 학습정리 포인터로서의 배열 배열의 원소를 가리키는 포인터 배열과 포인터의 차이점 배열의 이름은 배열의 시작 주소이므로 포인터처럼 사용할 수 있다. arr[i]는 *(arr + i)와 같다. 배열의 원소를 가리키는 포인터 배열의 원소를 가리키는 포인터는 배열처럼 사용할 수 있다. *(p + i)는 p[i]와 같다. 배열과 포인터의 차이점 배열의 시작 주소는 변경할 수 없지만 포인터에 저장된 주소는 변경할 수 있다. 8장. 포인터

포인터와 문자열 학습정리 문자열 리터럴 문자열 포인터 const 포인터 문자열 리터럴은 문자열 리터럴의 주소를 의미한다. char *p = "abcde";  p에는 "abcde"의 주소 저장 문자열 포인터 문자열 포인터가 문자열 리터럴을 가리킬 때는 문자열의 내용을 변경할 수 없지만, 문자열 포인터가 문자 배열을 가리킬 때는 문자열의 내용을 변경할 수 있다. const 포인터 포인터를 선언할 때 const의 위치에 따라서 의미가 다르다. const char *p = str1;  p가 가리키는 str1의 내용을 변경할 수 없다. char * const p = str1;  p에 저장된 주소를 변경할 수 없다. const char * const p = str1;  p가 가리키는 문자열도 변경할 수 없고 p도 변경할 수 없다. 8장. 포인터

8장. 포인터 수고하셨습니다. 질문 있습니까? NEXT Chapter 9장. 구조체