반응형
*는 자리에 따라 뜻이 다르다
int *p = &x; // 1
*p = 100; // 2
1. 선언 : p는 주소를 담는 변수다. 타입의 일부
2. 사용 : p가 가리키는 그 자리에 100. 역참조 연산 동작
스택과 힙은 다른 동네다

int arr[5]; // 스택 - free 금지, 크기 변경 불가
int *p = malloc(5* sizeof(int)); // 힙 - free 필수
- int arr[5] 는 컴파일 시점에 크기가 박제되는 거라 나중에 늘릴 수 없다. 크기를 바꾸고 싶으면 처음부터 힙으로 잡아야 한다.
- malloc 으로 힙에 잡았으면 반드시 free(arr) 로 돌려줘야 한다.
배열을 함수에 넘기면 주소가 간다
C 에서 배열 이름은 함수에 넘어갈 때 첫 원소의 주소로 바뀐다.
func(arr, 5); // arr -> 사실은 &arr[0], 즉 첫 칸의 주소이다.
배열을 통째로 복사해 넘기지 않아, 받는 쪽은 아래와 같이 받는다.
void func (int *arr, int size){
for (int i = 0; i < size; i++) arr[i] += 1;
}
int *arr 로 받든 int arr[] 로 받든 똑같이 포인터이다. 원본 주소를 받았기 때문에 함수 안에서 고친 게 main 배열에 그대로 남는다.
'a' 는 숫자, "a" 는 주소
printf 의 첫 인자는 주소를 받게 되어 있다. printf('a') 를 하면 97번지로 가서 읽으라는 뜻이 된다.
'a' // 문자 상수 -> 정수 97 (아스키 코드)
"a" // 문자열 리터럴 -> 'a', '\0' 이 저장된 곳의 주소
-> 에는 이미 * 가 들어있다.
cur->next = (*cur).next
-> 가 "주소 따라가서 멤버 꺼내기" 라서 역참조가 이미 포함되어 있다. *cur -> next 로 사용하면 두 번 역참조한 게 되고, 주소 담는 칸에 구조체를 통째로 넣으려해서 에러가 발생한다.
전반적으로 현재 다루고 있는게 주소인지, 그 자체인지에 대해 헷갈린다. 앞으로 C 언어를 사용할 때 "지금 다루는 게 주소인가? 그 값인가?" 를 생각하면서 다룰 것.
반응형