c++ 배열 초기화에 관련된 질문입니다.
글쓴이: stella770 / 작성시간: 화, 2017/04/18 - 9:37오후
안녕하세요. 반갑습니다.
저는 신입 개발자입니다. wpf 로 c# 만 코딩하다가 갑자기 c++ 로 넘어오게되서 오랜만에
다시 훍어보는데
배열초기화에 관련된걸 훑어보면서 복습하던 중 의문점이 생겨서 질문드립니다.
제가 알고있는 내용은
배열의 이름은 각 메모리에 할당된 첫번째 주소값을 가리키는 상수 포인터이다. 인데요
문자열에 관한 걸 훑어보던중
문자열은 문자 배열이지 않습니까
char carr[10] = "hellow"; 문자열 리터럴상수는 첫번째 문자의 주소값을 반환하게 되고
결국 char 배열에 문자하나씩 할당되고 마지막에 널문자가 들어가게되는데
요기서 궁금한점이
char carr_1[10] = carr; 를 넣으면 왜 초기화가 안되는지 궁금합니다.
char *const test1 = "hellow";
char *const test2 = test1; 을넣으면 되는데 위에 것은 왜 안되는지 궁금합니다.
ㅠㅠ 구글링을 해도 안나오길래 여쭈어봅니다. 읽어주셔서 감사합니다.
Forums:
1. 배열의 이름은 각 메모리에 할당된 첫번째
1. 배열의 이름은 각 메모리에 할당된 첫번째 주소값을 가리키는 상수 포인터가 아닙니다.
배열은 배열입니다. 많은 경우에 배열 이름이 그 배열의 첫째 원소를 가리키는 포인터 상수로 변환될 뿐입니다.
두 표현의 미묘한 차이는 C언어에서 아주 가끔 중요하고, C++에서는 더 많은 경우에 중요합니다.
2. 포인터는 다른 포인터로 초기화할 수 있지만 배열은 다른 배열로 초기화할 수 없습니다.
char
뿐만이 아니에요. 아래 코드도 똑같이 컴파일 안 됩니다.배열을 초기화하려면
arr1
에서와 같이 중괄호 안에 초기값들을 넣어 줘야 합니다. 아니면 아예 나중에for
문을 돌려서 초기화하던가요.3. 문자열 리터럴을 이용한 문자 배열 초기화는 문법적으로 볼 때 편의를 위해 예외적으로 허용되는 것입니다.
char carr[10] = "hellow";
는char carr[10] = {'h', 'e', 'l', 'l', 'o', 'w', '\0'};와 같습니다. 문자열 리터럴의 첫번째 문자의 주소를 반환하고 뭐고 없습니다. 그냥 이런 꼴의 초기화를 이런 식으로 처리해주는 것뿐입니다. 편의를 위해서요.
정말 감사드립니다.
원래 저렇게 생각없이 당연하다는 듯이 쓰고는 있었지만 다시 훑어보면서 곰곰히 생각해보니
책이나 인터넷에서 배울때는 배열이름이 첫번째 원소를 가리키는 상수 포인터다!
라고 정의만 해줘서 문법적인 혼란이 왔었습니다. 정말 감사합니다. 그냥 예외적으로 허용되는 것이였군요
속이 다 시원합니다.
댓글 달기