C 18Day (20160201)
by jennysgap저번 시간에 배열은 결국 '포인터'라는 것을 배웠습니다.
그 둘의 차이점이 있는데요 차이점을 알아보겠습니다.
arr와 ptr의 차이점
arr (상수형태의 포인터) : 주소값이 변경 안됨, 무조건 첫번째 주소값만 갖는다.
ptr (변수형태의 포인터) : 첫번째든 두번째든 상관없이 주소값 변경이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main(void) { int arr[3]={10, 20, 30}; int * ptr = arr; //&arr[0] ptr=&arr[1]; //변수성향의 포인터 //arr=&arr[1]; x 상수성향의 포인터 printf("%d\n", *ptr); return 0; } |
문자열의 표현방법
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main(void) { char str1[]="I like C"; //배열을 이용한 문자열 표현 (1) char * str2="I hate C"; //포인터변수를 이용한 문자열 표현 (2) puts(str1); puts(str2); } | cs |
문자열 표현하는 방법에도 차이점을 확인할 수 있음 "문장 변경"
I like C 문장은 I hate C로 변경하고
I hate C 문장은 I like C로 변경해보세요
1. 배열을 이용한 문자열 표현은 수정이 불가능 하고
2. 포인터변수를 이용한 문자열 표현은 수정이 가능하다
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main(void) { char str1[]="I like C"; //배열을 이용한 문자열 표현 (1) char * str2="I hate C"; //포인터변수를 이용한 문자열 표현 (2) //str1="I hate C"; 변경 X str2="I like C"; // 변경 O puts(str1); puts(str2); } | cs |
str1 은 배열이고, 상수형태의 포인터기 때문에 수정이 불가능
str2 는 포인터변수고, 변수형태의 포인터기 때문에 수정이 가능
그렇다면 문장이 아닌 문자만 바꿔볼까요? '문자 변경'
I like C와 I hate C에서 C를 D로 변경해보세요
1. 배열은 변수형태로 문자열을 저장하기 때문에 수정이 가능하고
2. 포인터변수는 상수형태로 문자열을 저장하기 때문에 수정이 불가능하다.
배열과 포인터의 총정리!!
char str1[] = "I like C";
- 배열
- 상수형태의 포인터 (주소값 수정 불가능)
- 변수 성향의 문자열 (수정 가능)
- ex) 문자 변경 : 'C' ---> 'D' "I like D"
- 포인터변수
- 변수형태의 포인터 (주소값 수정 가능)
- 상수 성향의 문자열 (수정 불가능)
- ex) 문장 변경 : "I like C" ---> "I hate C"
예제 (무조건 이해해야 합니다. 나중에 C++, 자료구조에 많이 적용됨)
(출력의 결과를 예상해 보세요. 포인터 함수를 제대로 이해할 수 있는 예제)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int go_south_east(int lat, int lon) { lat = lat -1; lon = lon + 1; } int main() { int latitude = 32; int longitude = -64; go_south_east(latitude, longitude); printf("현재 위치 : [%d, %d]\n", latitude, longitude); return 0; } | cs |
예제의 값이 그대로가 아닌 변경되도록 해보자
아래의 그림처럼 변경해보세요 (함수간의 메모리 공유하기!)
방법1 : 전역변수를 사용 그러나 되도록 사용하지 않는게 좋기 때문에 pass
방법2 : static변수 사용
방법3 : 포인터 변수 사용!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> int go_south_east(int *lat, int *lon) { *lat = *lat -1; // *lat -=1; *lon = *lon +1; // *lon +=1; } int main() { int latitude = 32; int longitude = -64; go_south_east(&latitude, &longitude); printf("현재 위치 : [%d, %d]\n", latitude, longitude); return 0; } | cs |
면접질문!!
Q : 포인터변수를 사용하는 이유가 뭔가요? (100% 질문 나옴)
A : 함수 간의 메모리 공유를 목적으로 사용합니다.
다중포인터
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main(void) { int num=10; int * ptr=# int ** dptr=&ptr; // 이중포인터, 다중포인터, 더블포인터, 포인터에 포인터 int *** tptr=&dptr; // 삼중포인터 return 0; } | cs |
쉽게 생각하려면 int*를 자료형이라고 생각하면 됨
(실재로도 '인트포인터형' 자료형 맞음)
자료형
int * ptr=#
int* * dptr=&ptr;
int** * tptr=&dptr;
'BOX' 카테고리의 다른 글
C 20Day (20160203) (0) | 2016.02.03 |
---|---|
C 19Day (20160202) (0) | 2016.02.02 |
C 17Day (20160129) (0) | 2016.01.31 |
C 16Day (20160128) (0) | 2016.01.31 |
C 15Day (20160127) (0) | 2016.01.31 |
블로그의 정보
jennysgap
jennysgap