char *p = "Hello"; 면 포인터 p에는 헬로의 주소값(H의 주소값)이 할당되어야 하는 거 아니냐? 근데 왜 &"Hello"; 라고 안쓰고 "Hello"; 라 씀? 그리고 헬로를 프린트하려면 %s로 *p를 프린트해야하는거 아님? p 프린트하면 주소값이 프린트되니까 *p를 프린트해야 주소값말고 실제 내용인 헬로가 프린트되는거 아님? 근데 왜 %s로 p를 출력해야 헬로가 나오는지 모르겠음
포인터 주소를 넘겨 받으면 그 주소에서 0이 나오는 값이 나올 때까지 for문을 포인터에 ++하면서 내부적으로 돌리거든
그래서 스트링이 0으로 끝날 때까지 출력 되는 거야
너 말대로 *p를 넘겨주게 되면 값만 받아서 다음 문자가 어딨는지 프로그램은 알 수가 없어
만약에 해커한테 문자 값만 넘겨주면 해커 입장에서는 다른 문자는 알아내는 게 운영체제의 메모리를 다 뜯어봐야해서 알 수가 없는데 주소를 넘겨주면 다음 문자는 어딨는지 그냥 알지 ㅇㅅㅇ
다른 언어는 *p에 레퍼런스까지 다 포함해서 넘겨서 알아서 연산이 되지만 c언어는 그게 다른 점이라고 생각해라 ㅇㅅㅇ
정확히 뭔소린진모르겠지만 일단ㄱㅅㄱㅅ..
주소 값 보려면 %s가 아니라 %p 해야함
그 컴퓨터는 문자 읽을 때 한 번에 읽는게 아니라 한 번에 2칸씩 읽음. char *p 여기서부터 넌 이미 포인터 선언을 한거고 그다음에 ='hello'를 썼으니 할당된 주소에 캐릭터를 집어 넣은거임
두 칸 -> 한 칸씩 읽음
그리고 포인터에도 주소가 따로 있음
구조체를 함수에 넣어주면 함수 내부에서 아무리 구조체를 바꿔도 함수 바깥의 구조체는 바뀌지 않음 즉 넣는 순간 카피가 일어나서 원래의 주소랑은 달라진단 뜻임
그래서 함수 바깥의 구조체를 건드리려면 c언어에서는 주소를 넣어주는 수밖에 없음
c언어에서 함수로 값을 전달할 때 원래의 주소는 사라진다는 뜻임
그러니까 char *p에 "hello"를 처넣으면 안 되고 a = "hello"를 미리하고 char *p에 a를 처넣어여 함
문자열 상수의 첫번째 주소를 가리킨다고 이해해라