딩굴댕굴

C 18Day (20160201)

by jennysgap

BOX

저번 시간에 배열은 결국 '포인터'라는 것을 배웠습니다.

그 둘의 차이점이 있는데요 차이점을 알아보겠습니다.


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]={102030};
    int * ptr = arr; //&arr[0]
 
    ptr=&arr[1];          //변수성향의 포인터
    //arr=&arr[1];  x        상수성향의 포인터
 
    printf("%d\n"*ptr);
    return 0;
}

cs





문자열의 표현방법

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"

char * str2 = "I like C";
  • 포인터변수
  • 변수형태의 포인터 (주소값 수정 가능)
  • 상수 성향의 문자열 (수정 불가능)
  • 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=&num;
    int ** dptr=&ptr;      // 이중포인터, 다중포인터, 더블포인터, 포인터에 포인터
    int *** tptr=&dptr;    // 삼중포인터
    return 0;
}
cs



쉽게 생각하려면 int*를 자료형이라고 생각하면 됨

(실재로도 '인트포인터형' 자료형 맞음)


자료형

 int          * ptr=&num;

 int*         * dptr=&ptr;

 int**        * tptr=&dptr;










20160201 c언어 18day.txt




반응형

'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

활동하기