선언이랑 초기화는 별개이다.
초기화는 값 할당이 일어나는 것이다.
(초기화 또한 첫번째 값 할당이란 뜻이기에 값할당 자체와 별개의 개념 이다)
선언:
선언이 바로 그 변수가 무슨 타입인지 연결해주는 그 코드이다.
영어로 declaration이다 (지금 구글로 찾아봄 이 단어가 정확한 번역임을 100%확실함)
정확히 이 것을 선언이라고 함을 외우자. declaration임도 암기하고.
그리고 선언때 아예 NULL을 할당하는게 일반적이더라.
즉 선언 그 줄에서 바로 할당까지 한다. 이래야 예측 불가능한 오류(쓰레기값이
들어가서) 나는 것이 방지된다고 한다!
================
실행구문에서의 포인터 문법
실행구문은 단지 포인터 변수 정의가 아닌 구문들..
실행 구문은 두가지로 나뉜다.
1>값 할당
2>값 찾아서 쓰는 것
이 두가지 모두 두가지 경우가 있다.
즉 마치 이진트리 처럼 / 그래서 2*2의 경우의 수가 있다.
두 경우는 한개는 그냥 포인터 변수를 쓰는 것과 *기호를 써서 쓰는 두가지 경우가 있는 거다.
->역시 틀린 말이다.
값 할당에서는 *를 써서 대입하는 것이 불가능하다.
(<- 두번째에서 또한 파악을 잘못했다.
위의 두줄은 오른쪽 즉 대입할 대상 변수에 *를 넣는 것이 불가능한것이고,
대입을 받는, 즉 포인터 변수는 할당때 가능한 모양은 *p랑 p 두가지 경우의 수가 있다!)
->지금 jdoodle 에서 실험해봤다.
int *p; 일때
p = *x나 p=x둘다 안된다.
값 할당 문법은 오직 p=&x밖에 존재하지 않는다.
이제 그럼 쉬워졌다. 외울 것이 하나로 줄었다.
-->
위의 저 설명은 이제 저 두번째 파악도잘못된 것을 알기 전의 생각이다.
*p = 의 경우 값을 대입 가능하다.
==>
대신 이 주제가 엄청 중요하다
지금 실험해보니
저 지적이 맞다.
즉 이제 새로운 앎에서
*p = 로 대입을 해보면, x 나 *x 둘다 불가능하다.
즉 = 다음에 오는 것은 단 두개이다.
아예 값 자체나 혹은 &x이다.
즉 포인터 관련의 연산자가 붙은 것으로는 &만이 가능하다는 저 위의 말은 참이다.
단지 p = 랑 *p 로 또 나뉘는 것은 몰랐던 것이다.
===>
예외 또 발견!
혹시나 &가 안 붙어 있다면 그게 배열이라서 배열이름은 메모리 주소자체인 것을
이용한 것이다.
대신 출력/ 즉 값을 찾아서 '쓰는'(use) 경우(영어로 accessing)는
두개다.
*와 *가 없이 주소를 출력하는 모드
===========================
이제 위의 것을 알았으면
새로운 신택스 아주 중요한게 챕터에 등장한다.
이걸 모르면 나중에 애로사항이 있으므로 지금 나오는 것이다.
쉽다
(*p)++
*p++
보니까 두번째의 '해석'이 중요하다; 존재의 이유 자체를 반문을 하면 된다.
두번째를 보고 그럼 왜 하필 괄호문법이 존재할까? 라고 물으면 모든 내용이
바로 전개가 되어 생각이 나게 된다.
두번째 문법으로 그 내용 value자체가 증가하면 애초에 첫번째처럼 쓸 필요가 없을 것이다.
즉 괄호는 저 *를 포함하도록 ++가 바로 p에 침투되어 적용되는 것을 방지하는
역할로 이해하면 바로 끝난다.
물론 이 후자는 주소값을 +1시키는 것이다.
====================
이제 저 챕터 후에 바로 call by value 랑 call by reference가 나온다.
근데 한국어로 설명이 나오는 것을 보면
(edu.goorm.io/learn/lecture/201/한-눈에-끝내는-c언어-기초/lesson/1271949/call-by-value-call-by-reference)
이를 인자를 전달하는 방식이라고 소개한다.
call이랑 인자 전달이랑 관계가 있지만 번역 자체가 1:1로 정확하지 않게 설명이 나온 것이다.
즉 이 둘을 종합하면 call 중에서도 인자 전달의 매커니즘에 대해서 두개로 나눈 것임을
짐작할 수 있다.
즉 call by value 의 대항개념이 reference인데
그렇다면 여기서 밸류란
레퍼런스 진짜 값이 아니고 그냥 밸류 자체 / 또한 이게 레퍼런스의 대항개념이라는 말이므로
즉 레퍼런스가 아닌 밸류이므로
그 밸류가 카피값을 말하는 밸류라는 단어로 쓰인 것임을 추론해낼 수 있다.
즉 밸류라는 말 자체가 여기서 단어가 앞에 생략된 것이다 (copied, not reference) value
이거다.
근데 c는 call by address이지 진짜 call by reference는 아니고
구현만 해준것이다.
swap 함수가 헷갈린 이유가 드러났다.
결론은 왜냐면
c언어에서 포인터 기초로 배울 때 예시문들을 보면
포인터 선언때 바로 값을 할당하지는 않는다.
근데 그게 같이 한 줄에 결합된 하이브리드로 되어 헷갈린 것이다.
근데 지금 해보니 원래 포인터 선언하면서 바로 &로 다른 변수 할당이 가능하더라.
즉
int x=10;
int *p = &x;
이렇게 가능하다!
swap 함수를 보면
내가 지금까지 6월 15일 2022년 까지 파이썬에서도
이제 말할 개념을 구분을 안 해온 것이 드러난다.
뭐냐면
swap 함수 정의를 보면 거기에 *인가 &인가가 헷갈렸는데
내가 여기 블로그에 할당의 경우 단한가지의 문법만 존재한다고 했다.
할당실행문의 경우 무조건 그 다른 변수앞에 &를 달아준다.
함수를 콜 한다는 것은 어떤 변수에 대입연산 즉 assignment를 하는 것이다.
그래서 swap함수 콜할 때는 &를 붙여준 것이고
swap함수 정의문에서 파라미터는 본질이 포인터 선언문이다.
즉 할당문이 아니고 선언 즉 declaration이다.
선언, 할당, 이 둘 중에 하나라는 것으로 구분을 하면 된다.