제일 첫 줄에 int len(char* p); 가 있는데요. len 이라는 함수에 대해서 프로토타입을 선언을 해놓은 것입니다. len 이라는 함수는 정수형이고, 인수를 전달 받게 되면 char* p 라는 매개변수가 받게 된다는 것을 알 수 있습니다.
P1 이라는 문자형 포인터 변수를 선언하면서 2022 라는 값을 가리키는 주소로 초기화하는 것을 볼 수 있습니다.
예를 들어서 메모리 주소가 위와 같다고 했을 때, 주소는 알아보기 쉽게 10진수로 표현했습니다. 만약, 2022 라는 값이 1000 번 이라는 주소에 저장이 되어 있다고 해보겠습니다. 그러면 위에서 보는 것과 같이 문자열이 끝났습니다를 의미하는 \0이 들어가게 됩니다. \0 은 Null 값으로, 문자열의 끝임을 의미하고, 실제로 출력할 때 같이 출력되지는 않습니다. 즉, 문자형 포인터 변수 p1 은 2022 가 들어있는 주소인 1000을 가리키고 있는 것이라고 이해할 수 있는 것입니다.
문자형 포인터 변수 p1 과 p2 는 위에서 보는 것과 같이 주소를 갖고 있게 됩니다. 그래서 len(p1) 을 실행하게 되면 len 의 매개변수인 char* p 라는 문자형 포인터 변수가 받게 됩니다. 즉 len(p1) 은 len(1000) 과 마찬가지고 p 라는 문자형 포인터 변수는 1000이라는 값을 가지게 되는 것이죠.
1000 이라는 주소에는 위와 같이 데이터가 입력이 되어 있을 건데요. char 는 각각이 1바이트의 크기를 갖습니다. p라는 포인터 변수는 1000은 가리키고 있는데요. 1000 번지에는 '2' 가 1바이트의 크기를 가지고 자리하고 있고, 이어서 1001 번지에 '0', 1002 번지에 '2' ... 이런 식으로 저장되어 있다고 이해할 수 있습니다. 그래서 이것을 표로 표현하면 위와 같습니다. 따라서 len( ) 이라는 함수는 문자의 개수를 세어주는 함수라는 것을 알 수 있습니다.