Pointers and Arrays Structures adopted from KNK C Programming : A Modern Approach
요약 2
Pointers and Arrays 3
배열의주소 #include <stdio.h> int main(){ int c[] = {1, 2, 3, 4}; printf("c\t%p\n", c); printf("&c\t%p\n", &c); printf("&c[0]\t%p\n", &c[0]); return 0; } 0x7fff574dbfd0 $ gcc -o a.out addr.c $./a.out c 0x7fff574dbfd0 &c 0x7fff574dbfd0 &c[0] 0x7fff574dbfd0 0x7fff574dbfd4 0x7fff574dbfd8 0x7fff574dbfdc 31 배열시작주소 = 배열인덱스 0 의주소 1 0 c[0] 2 c[1] 3 c[2] 4 c[3] 4
배열의주소를포인터로확인하는방법 #include <stdio.h> int main(){ int c[] = {1, 2, 3, 4}; int *p = c; printf("c\t%p\n", c); printf("&c\t%p\n", &c); printf("&c[0]\t%p\n", &c[0]); printf("&*p\t%p\n",&*p); return 0; 0x7fff574dbfd0 } 0x7fff574dbfd4 $ gcc -o a.out addr.c $./a.out c 0x7fff574dbfd0 &c 0x7fff574dbfd0 &c[0] 0x7fff574dbfd0 &*p 0x7fff58497fd0 0x7fff574dbfd8 0x7fff574dbfdc 31 0 0x7fff511e5fd0 p 1 c[0] 2 c[1] 3 c[2] 4 c[3] 포인터로배열참조가능 5
포인터변수의덧셈 #include <stdio.h> int main(){ int c[] = {1, 2, 3, 4}; int *p = c; for (int i = 0; i<4; i++) printf( p+%d, addr: %p, i, p+i); return 0; } 0x7fff574dbfd0 $ gcc -o a.out addr.c $./a.out p+0 0x7fff574dbfd0 p+1 0x7fff574dbfd4 p+2 0x7fff574dbfd8 p+3 0x7fff58497fdc 0x7fff574dbfd4 0x7fff574dbfd8 0x7fff574dbfdc 31 0x7fff511e5fd0 1 0 p c[0] 2 c[1] 3 c[2] 4 c[3] 포인터변수를증감하면형의크기만큼증감 6
포인터변수의덧셈 II #include <stdio.h> int main(){ int c[] = {1, 2, 3, 4}; int *p = c; for (int i = 0; i<4; i++) printf( p++, addr: %p, p++); return 0; } 0x7fff574dbfd0 $ gcc -o a.out addr.c $./a.out p++ 0x7fff574dbfd0 p++ 0x7fff574dbfd4 p++ 0x7fff574dbfd8 p++ 0x7fff58497fdc 0x7fff574dbfd4 0x7fff574dbfd8 0x7fff574dbfdc 31 0x7fff511e5fd0 1 0 p c[0] 2 c[1] 3 c[2] 4 c[3] ++, -- 증감연산자도형의크기만큼증감 7
Putting it together 1. 배열시작주소 = 배열인덱스 0 의주소 2. 포인터로배열참조가능 3. 포인터변수의증감 à 형의크기만큼증감 포인터로배열인덱스참조가능 8
포인터로배열인덱스지정하기공식 시작주소 +( 변수의타입 )* 인덱스 int c[] = {1, 2, 3, 4}; int *p = c; p+2; 500 504 508 512 516 520 524 31 0 512 pc 1 c[0] 2 c[1] 3 c[2] 4 c[3] c[2] 의주소 = 512 + 4*2 = 520 9
포인터로배열인덱스지정하기 포인터변수는형의크기만큼증감함 int c[] = {1, 2, 3, 4}; int *p = c; 31 0x7fff511e5fd0 0 p 연습문제 *p c 주소의값 1 을읽음 0x7fff511e5fd0 0x7fff511e5fd4 0x7fff511e5fd8 0x7fff511e5fdc 1 c[0] 2 c[1] 3 c[2] 4 c[3] 10
포인터로배열인덱스지정하기 포인터변수는형의크기만큼증감함 int c[] = {1, 2, 3, 4}; int *p = c; 31 0x7fff511e5fd0 0 p 연습문제 *p c[0] 을읽음 *p+2 c[2] 를읽음 0x7fff511e5fd0 0x7fff511e5fd4 0x7fff511e5fd8 0x7fff511e5fdc 1 c[0] 2 c[1] 3 c[2] 4 c[3] 11
구조체 (structures) 12
꼭알아야할것 구조체란 메모리에서의표현 구조체선언 구조체초기화 구초제값의접근 구조체활용 구조체로형선언 13
구조체란 복합저장공간 하나이상의서로다른형의변수를저장가능 구조체안에구조체포함가능 관련있는데이터의모음 모이면풍성해지는구조체 예 : 좌표계의한지점의위치값 (x, y, z) 성적표의과목마다받은성적 ( 국, 영, 수,...) 연락처에들어가는정보 ( 이름, 전화 1, 전화 2, 생일, 주소,...) 도서관서지정보 ( 책제목, 페이지수, 출판사, 출판일, ) 14
구조체선언 : 기본구조 struct { 변수형변수이름 ; 변수형변수이름 ; } 구조체명 ; 멤버변수 좌표계의한지점의위치값 (x, y, z) 지점의좌표 struct { int x; int y; int z; } PointA; 성적표의과목마다받은성적 ( 국, 영, 수,...) 성적표 struct { float Kor; float Eng; float Math; } Score; 15
구조체선언 : 기본구조 struct { 연락처에들어가는정보 ( 이름, 전화1, 전화2, 생일, 주소,...) 전화번호 struct { 변수형변수이름 ; 변수형변수이름 ; } 구조체명 ; char Name[20]; char Phone[13]; char Birth[10]; char Addr[100]; } PersonInfo; 도서관서지정보 ( 책제목, 페이지수, 출판사, 출판일, ) 서지정보 struct { int Title; int Page; int Pub; int Year; } Book; 멤버변수 16
구조체초기화 : 선언시초기화 struct { 변수형변수이름 ; 변수형변수이름 ; } 구조체명 = { 값 1, 값 2, }; 배열처럼 초기화 지점의좌표 struct { int x; int y; int z; } PointA = { 30, 40, 50 }, PointB = {50, 30, 20 }; 17
구조체값의접근 지점의좌표 struct { int x; int y; int z; } PointA = { 30, 40, 50 }, PointB = {50, 30, 20 }; 새로운연산자. 점 구조체의멤버변수접근 PointA.x; PointA.y; PointA.z; 18
구조체초기화 : 선언후초기화 지점의좌표 struct { int x; int y; int z; } PointA; PointA.x = 30; PointA.y = 40; PointA.z = 50; 19
메모리에서의표현 지점의좌표 struct { int x; int y; int z; } PointA; 500 504 508 512 516 31 30 40 50 0 x y z PointA.x = 30; PointA.y = 40; 520 524 PointA.z = 50; 20
구조체활용 : 함수의인자, 매개변수 struct point { }; int x; int y; int z; struct point savepoint(int x, int y, int z) { struct point p; int main() p.x = x; { p.y = y; p.z = z; struct point pointa; return p; pointa = savepoint(30, 40, 50); } 구조체변수리턴 구조체의선언 리턴타입 : struct point } 리턴받은정보를 PointA에저장 21
구조체형선언 태그로형선언 지점의좌표 struct Point{ int x; int y; int z; } ; typedef 로형선언 구조체에반복사용할수있는이름을부여함 struct Point A = {30, 40, 50}; struct Point B = {40, 30, 20}; 구조체태그가있기때문에구조체재선언없이같은타입의구조체를재활용하여선언할수있음태그가없으면구조체선언부를매번다시써야함 22
구조체형선언 태그로선언하여쓰는방법의단점 struct 구조체태그명 을반복하여써야함 typedef 으로선언하는방법 선언한구조체가새로운형이됨 지점의좌표 typedef struct { int x; int y; int z; } Point; typedef 새로운형을만들때쓰는키워드 새로운형의이름 Point A = {30, 40, 50}; Point B = {40, 30, 20}; 다른형들처럼변수명앞에씀 23
구조체의할당 지점의좌표 typedef struct { int x; int y; int z; } Point; 구조체는 = 연산자로복사됨 A.x 에 30, A.y 에 40, A.z 에 50 을저장 B = A; 문장으로통해 B.x 에 30, B.y 에 40, B.z 에 50 을저장 Point A = {30, 40, 50}; Point B; B = A; 단, 모든구조체가동일하게동작하는것은아님상세자료참고 24