[태그:] c언어

  • C언어 – 포인터 개념2

    C언어 – 포인터 개념2

    #include <stdio.h>
    int main() {
       int a[] = {0, 2, 4, 8};
       int b[3];
       int* p;
       int sum = 0;
       int i;
       for (i=1; i<4; i++) {
           p = a + i;
           b[i-1] = *p - a[i-1];
           sum = sum + a[i] + b[i-1]; }
       printf("%d", sum);
       return 0;
    }
    

    다음의 코드에서 포인터의 개념은 int* p 라고 포인터를 선언한 것과, for 문에서 p값이 a +i 를 합한 것과 같다는 부분에서 볼 수 있다.

    a는 4개가 할당되어 있고, b는 3개가 할당 되어있다. 0으로 시작하기 때문에

    a는 다음과 같고,

    0123
    a0248

    p는 0이 있는 위치부터 가리키고 있다고 할 수 있다. b는 아직 받은 값이 없으니 비어있고,

    012
    b

    p = a + i 부분은 i는 우선 1부터 2, 3 까지로 4보다 적은 숫자까지 돌아간다. 그렇다면 a는 주소 0부터 시작하기 때문에 0 + 1 로 p는 1의 값으로 우선 나온다.

    이 때 b[i-1] = *p – a[i-1]은 *p가 1이라는 주소에 있는 값을 반환받길 원한다.

    즉 a의 2. b[0] = 2 – a[0] = 2 – 0 = 2 이다.

    sum += a[i] + b[i-1]로도 표현할 수 있는데 sum = 0 + a[1] + b[0] = 0 + 2 + 2 = 4

    p = a + i 는 p가 a[i]에서 i값을 가지고 온다고 보면 되고 포인터 *p는 해당 a[i]값을 가지고 온다.

    p = 2,

    b[1] = *p – a[1] = 4 – 2 = 2

    sum = 4 + 4 + 2 = 10

    p=3, b[2] = 8 – 4 = 4, sum = 10 + 8 + 4 = 22

    저 코드를 돌린 값은 22이다.

    b도 for문이 다 돌고 난 뒤라서 채워진다.

    012
    b224
    실제 결과값

    코드를 돌기전에 일단 쭉 나열해서 풀어봤다.

    포인터의 개념은 주소와 값 중에 값을 빨리 반환 받기 위해서 사용하는 게 핵심인 것 같다.

    추가로 좀 더 배웠는데 이것도 포스팅할 예정이다.😎

  • C언어- 포인터 개념 설명 및 예시

    C언어- 포인터 개념 설명 및 예시

    C언어는 빛과 소금과 진리^^

    포인터 개념을 이해해보자!

    우선 다음과 같은 문제를 풀어보자! 정답은? 과연 두구두구두구두구…

    #include <stdio.h>
    int pointfunc (char *);
    int main() {
        char* p1 = "20210107";
        char* p2 = "20221008";
        int n = pointfunc(p1);
        int m = pointfunc(p2);
        printf("%d", n+m);
        }
    
    int pointfunc (char* p) {
    	int count = 0;
        while (*p != '
    #include <stdio.h>
    int pointfunc (char *);
    int main() {
    char* p1 = "20210107";
    char* p2 = "20221008";
    int n = pointfunc(p1);
    int m = pointfunc(p2);
    printf("%d", n+m);
    }
    int pointfunc (char* p) {
    int count = 0;
    while (*p != '\0') {
    count ++;
    p ++;
    }
    return count;
    }
    ') { count ++; p ++; } return count; }

    여기에서 괴상망측한 * 라는 표시가 있다. 이 표시에 대해서 교수님이 포인터 개념에 대해 한 주 수업 시간 내내 설명하시고 폭탄 과제를 잔뜩 내 주신 게 떠오른다. 그 이후로 난 저 * 만 보면 😣 … 인데 C언어 에서는 상당히 중요한 개념이다.

    예전에 삐뚤새뚤하게 포인터 개념에 대해서 정리해서 과제를 제출했다. 모범생 타입답게 제출 시각에 딱! 맞춰서 부랴부랴! 제출했다😎

    “c언어는 python과 다르게 데이터 타입을 반드시 적어주어야 한다. 변수 개념은 포인터 개념과 밀접하게 관련이 있는데, 변수의 값, 변수의 주소에 대해서 c언어가 매우 민감하기 때문이다. 포인터는 변수의 값을 찍는 게 아니라 주소를 알려준다. 역참조는 주소 안의 값이 무엇인지 대신 반환해주는 것이다. 이 포인터 개념은 C언어에서 중요하게 여기는 개념이다” – summerorange 과제 제출

    저 코드의 정답은 저 character 변수의 갯수를 더하면 된다. 갯수를 더하는 걸 코드로 표현한 거니까.

    표로 표현하면 이런 느낌?

    p01234567Null
    *p20210107\0
    count12345678
    Null사랑하지않아

    \0이 아닐 때까지, 즉 null 값이 아닐 때까지 카운트를 하는 거니 char* p1 = “20210107”; 은 총 count 8이 나온다. 그래서 int n = 8 로 할당되고,

    p01234567Null
    *p20221008\0
    count12345678
    계산은 꼼꼼하게

    \0이 아닐 때까지인 char* p2 =”20221008″;은 해당 pointfunc 함수 리턴값인 int m = 8이 나와서

    합한 값은 8 + 8 = 16이 나오게 된다.

    그리고 추가 문제가 더 있어서 추가 포스팅을 하겠다.

    개념 이해에는 문제를 많이 풀어보는 게 좋은 것 같다.

error: Content is protected !!