• 포인터 : 어느 대상을 가리키기 위한 주소를 저장하는 데이터 타입
    • 포인터가 가리키는 대상은 포인터에 *연산을 통하여 접근
#include <stdio.h>

int main(void)
{
    int a = 10;
    int *p = &a; //int 자료형을 가리키는 포인터 = a의 주소

    printf("0x%p\n",&a); //a의 주소
    printf("0x%p\n",p);  //포인터가 가리키는 주소
    printf("%d\n",a);    //a의 값
    printf("%d\n",*p);   //포인터가 가리키는 대상의 값
  printf("%d\n", sizeof(p)); //포인터의 사이즈
  printf("%d\n", sizeof(*p));//포인터가 가리키는 대상의 사이즈
}
  • 포인터는 가리키는 대상 타입에 맞게 선언되어야 한다.
#include <stdio.h>

int main (void)
{
    char a = 'A';
  char *p = &a;

  double f = 3.14;
  double *q = &f;

  printf("%d\n", sizeof(*p)); //포인터가 가리키는 대상의 사이즈
  printf("%c\n", *p); //포인터가 가리키는 대상의 값
  printf("0x%p", p); //포인터가 가리키는 주소
  printf("0x%p", p + 1); //포인터가 가리키는 주소 + 1 : char크기(1바이트)만큼 주소 이동
    printf("0x%p", q); //포인터가 가리키는 주소
  printf("0x%p", q + 1); //포인터가 가리키는 주소 + 8 : double크기(8바이트)만큼 주소 이동

}
  • 함수에서 전달받은 변수 내용을 변경하려면 포인터로 변수의 주소를 받아야 한다.
#include <stdio.h>

//Call By Value
void f1 (int b)
{
    b = 100;
    printf("%d\n",b);
} 

//Call By Address
void f2 (int *p) //a를 가리키기 위한 포인터를 인자로 선언
{
    *p = 100; //포인터가 가리키는 대상의 값을 100으로 변경
    printf("%d\n",*p); //포인터가 가리키는 대상의 값을 출력
}

int main (void)
{
    int a = 10;

    f1(a); //Call By Value
    printf("%d\n",a);

    f2(&a);//Call By Address - a의 주소를 넘김
    printf("%d\n",a);
}
  • %s 포맷 지시자와 문자열
#include <stdio.h>

int main (void)
{
    char a[] = "Hello"; //배열은 포인터임
    char *p = "Hello"; //인쇄할 문자열의 첫번째 주소 대입

    //%s는 인쇄할 문자열의 첫 글자의 주소를 받음
    printf("%s\n", "Hello");
    printf("%s\n", &a[0]); //문자열의 첫번째 인자의 주소 
    printf("%s\n", a); //문자열
    printf("%s\n", p); //문자열의 주소

  printf("%s\n", "Hello"+1); //문자열의 주소를 이동시킴 -> ello 출력
    printf("%s\n", a + 1); //문자열 주소 이동 -> ello 출력
  printf("%s\n", p + 1); //포인터가 가리키는 주소 이동 -> ello 출력
}
  • 문자열 분석
#include <stdio.h>

char *func(char *q) // 반환형 : char * , 인자 : char *
{
    printf("%s\n", q);
    printf("%c\n", q[0]);
    printf("%c\n", q[1]);
    printf("0x%p\n", q);
    printf("0x%p\n", q+1);
    printf("0x%p\n", *q);
    printf("0x%p\n", *(q+1));

    return q + 2;
}

void main(void)
{
    char *p = "Hello"; //문자열은 char 배열이다.

    printf("%s\n", "Hello"); //Hello 출력
    printf("0x%p\n", "Hello");//Hello의 시작 주소 출력
    printf("0x%p\n", "Hello" + 1);//Hello 주소 + 1Byte 주소 출력
    printf("%c\n", "Hello"[0]); //Hello의 문자열의 첫번째 글자 H 출력
    printf("%c\n", "hello"[1]); //hello의 문자열의 두번째 글자 e 출력
    printf("%c\n", *"Hello"); //문자열은 포인터이므로 문자열의 첫번째 대상 H를 출력
    printf("%c\n", *("Hello" + 1));//문자열은 포인터이므로 포인터를 1Byte만큼 이동시킨 후 첫번째 인자 e출력
    printf("%s\n", func("Hello")); //문자열을 반환받는 func함수에 포인터(주소) 전달 후 llo 반환받음
}
  • *p++, *++p 의 동작
    • ++, — 연산자가 주소에 사용되면 주소가 가리키는 크기만큼 증가, 감소한다.
    • *++p : 먼저 포인터 p를 증가시키고 그 주소의 내용을 꺼내온다.
    • *p++ : p주소에서 먼저 내용을 꺼내고 포인터 p를 증가시킨다.
#include <stdio.h>

void main(void)
{
    int cnt = 0;
    char *p = "Embedded"; //문자열의 첫번째 글자를 가리키는 포인터

    while (*p) //*p가 \0(null 포인터)이 될 때 까지 
    {
        if (*p++ == 'd') cnt++; //문자열을 가리키는 포인터의 주소를 한칸씩 이동시키며 d가 있으면 1씩 증가
    }

    printf("%d\n", cnt);
}
#include <stdio.h>

void main(void)
{
    int cnt = 0, i = 0;
    char *p = "Embedded";

    while (p[i]) //E로 시작하는 포인터가 0(NULL Pointer)을 만날때 까지 반복
    {
        if (p[i++] == 'd') cnt++; //포인터를 한칸씩 이동시키며 cnt 증가
    }

    printf("%d\n", cnt);
}
  • 문자열 복사 함수
    • 문자열 복사 함수의 동작분석
#include <stdio.h>

void str_copy1(char * d, char * s) //주소를 받을 수 있도록 함수인자로 포인터 선언
{
    int i;

    for (i = 0; ; i++)
    {
        d[i] = s[i];
        if (d[i] == '\0') return; // \0(NULL PTR)을 만나면 탈출
    }
}

void str_copy2(char * d, char * s)
{
    while (*d++ = *s++); // 0이되면 탈출
}

void main(void)
{
    char a[5], b[5]; //문자열 배열 선언
    char c[5] = "ABCD"; //문자열 배열에 ABCD\0 대입

    str_copy1(a, c); //문자열 배열의 첫번째 인자의 주소 전달
    str_copy2(b, c);
    printf("%s %s %s\n", a, b, c);
}
  • 문자열 길이 측정 함수
    • 문자열 길이를 측정하는 함수 설계
#include <stdio.h>

unsigned int str_length(char * d)
{
    // 코드 작성
    int cnt = 0;
    for (int i = 0; ;i++)
    {
        if(d[i] == 0) //널문자 검사 우선 수행
        {
            return cnt;
        }
        else
        {
            cnt++;
        }
    }
}

void main(void)
{
    char a[] = "Willtek";

    printf("%d\n", sizeof(a)); // \0 을 포함하여 출력
    printf("%d\n", str_length(a)); // \0을 제외하여 출력
}
  • 문자열 연결 함수
    • 두개의 문자열을 하나로 이어주는 함수 설계
#include <stdio.h>

void str_add(char * d, char * s) //전달받은 a와 b를 합친다.
{
    for(int i = 0; ; i++)
    {
        if(d[i] == 0) // "Willtek\0"에서 \0을 만나면 해당 자리부터 " Corp."을 이어씀
        {
            for (int j = 0; ; j++)
            {
                if(s[j] == 0)
                {
                    return;
                }
                else
                {
                    d[i+j] = s[j];
                }    
            }
        }
    }
}

void main(void)
{
    char a[15] = "Willtek";
    char b[15] = " Corp.";

    str_add(a, b); //a와 b의 첫번째 주소를 전달

    printf("%s\n", a);
}
  • 문자열 비교 함수
    • 두개의 문자열의 크기를 비교하는 함수를 설계
    • 두 문자열 a,b중에서 a가 크면 1, b가 크면 -1, 같으면 0 리턴
#include <stdio.h>

int str_comp(char *a, char *b)
{
    // 코드 작성
    int result = 0;
    for (int i = 0;; i++)
    {
        if (a[i] > b[i]) // a가 크면
            return result = 1;
        else if (a[i] < b[i]) // b가 크면
            return result = -1;
        else if ((a[i] == b[i])&&(a[i]==0)) //널문자가 나타날 때까지 함수를 탈출 못하면 문자열이 모두 같다
            return result = 0;
    }

}

void main(void)
{
    printf("%d\n", str_comp("ABC", "BC"));
    printf("%d\n", str_comp("ABC", "AC"));
    printf("%d\n", str_comp("ABC", "AB"));
    printf("%d\n", str_comp("abc", "ABC"));
    printf("%d\n", str_comp("ab", " "));
    printf("%d\n", str_comp("A", "AB"));
}

+ Recent posts