1. 문자열 처리와 포인터, 배열, 그리고 문자열 종료 문자

: 배열, 포인터, 구조체 포인터, 동적 메모리는 지역 함수 가 종료되어도 메모리 자체를 수정하는 개념이기 때문에

main() 에 전달될때 스택에 저장되어 이동함(주소를 통하여 원본 메모리에 접근 , 수정 , 저장) ,

그렇기 때문에 값이 수정 됨

→ 반면 그냥 구조체나 변수 자체를 값으로 넘기게 되면 값의 복사본이 전달되기 때문에 main()에서는 영향 없음 그래서 인자를 넘길때 배열이나 포인터로 받는 경우가 많은것

#include <stdio.h>

// 배열을 가리키는 포인터를 인자로 받을때 포인터는 
// 배열 자체가 아닌 배열의 0번째 주소를 가리킨 상태로 전달됨 

void fn(char *d, const char *s) {
    while (*s) {
        *d = *s;   // s가 가리키는 문자 → d가 가리키는 위치에 복사
        d++;       // d 한 칸 이동 (str2 배열 내에서)
        s++;       // s 한 칸 이동 ("first" 문자열 내에서)
    }
    *d = '\\0';     // d의 마지막 인덱스 에 문자열 종료 문자 삽입
     // d -> "firsttring " 공백까지 총 11개 인덱스 
}
// 배열 자체는 main 함수의 스택 메모리에 존재하므로 함수가 끝나도 변하지 않음.

int main() {
    const char *str1 = "first";
    char str2[50] = "teststring";
    int result = 0;
****    int i;

    fn(str2, str1);
    for (i = 0; str2[i] != '\\0'; i++) {
        result += i; // 공백문자를 제외한 나머지 문자의 개수 
    }

    printf("%d", result); // 10 출력 
    return 0;
}

2. 2차원배열+포인터

#include <stdio.h>
int main() {
    int arr[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};
    
   // [0][0]: 1 [0][1]: 2 [0][2]: 3 
   // [1][0]: 4 [1][1]: 5 [1][2]: 6
   // [2][0]: 7 [2][1]: 8 [2][2]: 9
   
 
    int* parr[2]={arr[1], arr[2]};
    
   //parr[0] -> arr[1]
   //parr[1] -> arr[2]
   
   //parr[1][1] -> arr[2][1] = 8 
   //*(parr[1]+2) -> arr[2][2] = 9 
   //**parr = 이름만 나올 경우 0 번째 의 0번째를 의미함 
   //즉 arr[1]의 0번째 인덱스 를 의미 = 4 
   // 8+9+4= 21 
    printf("%d", parr[1][1] + *(parr[1]+2) + **parr);
    
    //21 출력 
    return 0;
}

3. 구조체 + 포인터

#include <stdio.h>

struct node {
    int n1;
    struct node *n2; // node를 가리키는 포인터 변수 
};

int main() {
    struct node *head=NULL; // node를 가리키는 포인터 변수 
    struct node a={10, 0}; 
    struct node b={20, 0};
    struct node c={30, 0};
    
    head=&a; //head 는 구조체 a의 주소를 가리킴 
    a.n2=&b; // a의 포인터 변수 n2는 b의 주소를 가리킴 
    b.n2=&c; // b의 포인터 변수 n2는 c의 주소를 가리킴
    
    printf("%d", head->n2->n1); 
    // head 가 가리키는 구조체 주소에 있는 n2 포인터변수가 가리키는 주소의 n1을 출력하라 
    // head -> a.n2 -> b.n1 
    // 20 출력 
    return 0;
}

4. 정적 변수 c

#include <stdio.h>

int increase() {
    static int x=0; // increase() 함수 내에서 계속 값이 저장됨
    // i = 0 첫번째 반복 
    // x = 2 
    // i = 1 두번째 반복 
    // x = 2 + 2 = 4  .. 
    
    x+=2; // x = x + 2 
    return x;
}

int main() {
    int x=0;
    int sum=0;
    int i=0;
    
    for(i=0; i<4; i++) { 
        x++;
        sum+=increase(); 
        // 반복문이 진행되는 4번 동안 increase()의 
        // 정적 변수 x 는 계속 2씩 증가 함 
    }
    
    printf("%d", sum); // 20 출력 
    return 0;
}