: 배열, 포인터, 구조체 포인터, 동적 메모리는 지역 함수 가 종료되어도 메모리 자체를 수정하는 개념이기 때문에
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;
}
#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;
}
#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;
}
#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;
}