KPlay의 코딩 그리고 잡동사니

1. 문자열은

https://blog.naver.com/rtem9005/222064527309

 

2. NULL 문자

C언어의 NULL문자는 문자열의 끝을 표시하기 위해 만들어진 키워드입니다.​우리가 프로그래밍을 하면...

blog.naver.com

에서도 서술했듯이 뒤에 NULL문자가 붙어있어야 합니다.

설령 "Hello"라고 표현되어 있다고해도 뒤에 NULL문자가 붙어있지 않다면

C에서는 이것을 단지 5개의 '문자'로 인식합니다.

"Hello"라는 문자열을 int arr이라는 배열을 선언해서 저장해봅시다

코드는 char arr[100] = "Hello"; 이고

메모리 공간에는 char 형arr배열을 선언할때 할당된 100바이트의 메모리 공간에

'H', 'e', 'l', 'l', 'o', '\0'(널문자) 이렇게 총 6개의 문자가 한 문자열로 저장됩니다.

2. 포인터

흔히 포인터는 포인터 변수로 인식됩니다만 사실

포인터 상수 / 포인터 변수 두가지로 나뉩니다.

1번에서 설명한 배열에서 배열의 이름이 포인터 상수에 해당되고 이는 밑에서 따로 쓰도록 하겠습니다

아무튼, char 포인터형 arr 포인터 변수에 "Hello" 문자열을 저장하는 방식은

char * arr = "Hello"; 이고

이때는, 배열과 다르게 특정 메모리 공간이 먼저 할당되어있는게 아니기때문에

컴파일러는 "Hello"라는 문자열을 먼저 임의의 메모리공간에 저장합니다.

똑같이 널문자를 합쳐 6개의 문자로 이루어진 문자열이 임의의공간에 저장되고

제일 앞문자인 'H'가 저장된 메모리공간의 주소값을 arr 포인터 변수에 저장하게 됩니다.

3. 배열의 이름과 포인터

앞서 서술했듯이 포인터는 포인터 상수와 포인터 변수로 나뉩니다

포인터 변수는 2번에서 설명했지만 포인터 상수는 무었일까요?

상수는 그 자체로 값이 고정되어 변하지않는 수라는 뜻으로

'배열의 이름'이 이에 해당됩니다.

앞에서 정의한 char arr[100] = "Hello"; 에서

배열의 이름은 arr이고 이는 배열의 첫번째 인자인 arr[0]의 주소값을 담고 있습니다.

따라서 arr = "Bye"라는 같이 대입연산자의 왼편에 올 수 없기때문에

배열의 이름은 포인터이자 상수의 특성을 가져 포인터 상수라고 불립니다.

반대로,

포인터변수 int * arr = "Hello"같은 경우에는

int * arr = "Bye"처럼 문자열을 바꿀 수 있습니다

따라서 배열의 이름과 포인터 변수 둘다 포인터이므로 []연산자와 *연산자를 사용할 수 있습니다

포인터 변수는 char * ptr = arr처럼 배열을 포인터 변수에 대입연산 했을때

ptr[0]같은 []연산이 가능하고,

배열의 이름도 *(arr + 1) == arr[1] 같이 *연산이 가능합니다.

왜냐하면 arr + 1은 arr의 자료형이 char이기때문에 1을 더하면 1바이트가 증가해

arr[0]의 다음 인수인 arr[1]을 가리키게 됩니다.

마지막으로 *(애스터리스크)연산자는 가로안에 있는 인자가 가리키는 주소값에 접근하겠다는 의미이며

&연산자는 뒤에오는 인자의 주소값을 반환 하겠다는 의미의 연산자입니다.

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band