c++ 배열 초기화에 관련된 질문입니다.

stella770의 이미지

안녕하세요. 반갑습니다.
저는 신입 개발자입니다. wpf 로 c# 만 코딩하다가 갑자기 c++ 로 넘어오게되서 오랜만에

다시 훍어보는데

배열초기화에 관련된걸 훑어보면서 복습하던 중 의문점이 생겨서 질문드립니다.

제가 알고있는 내용은

배열의 이름은 각 메모리에 할당된 첫번째 주소값을 가리키는 상수 포인터이다. 인데요

문자열에 관한 걸 훑어보던중

문자열은 문자 배열이지 않습니까

char carr[10] = "hellow"; 문자열 리터럴상수는 첫번째 문자의 주소값을 반환하게 되고

결국 char 배열에 문자하나씩 할당되고 마지막에 널문자가 들어가게되는데

요기서 궁금한점이

char carr_1[10] = carr; 를 넣으면 왜 초기화가 안되는지 궁금합니다.

char *const test1 = "hellow";
char *const test2 = test1; 을넣으면 되는데 위에 것은 왜 안되는지 궁금합니다.

ㅠㅠ 구글링을 해도 안나오길래 여쭈어봅니다. 읽어주셔서 감사합니다.

 의 이미지

1. 배열의 이름은 각 메모리에 할당된 첫번째 주소값을 가리키는 상수 포인터가 아닙니다.

배열은 배열입니다. 많은 경우에 배열 이름이 그 배열의 첫째 원소를 가리키는 포인터 상수로 변환될 뿐입니다.
두 표현의 미묘한 차이는 C언어에서 아주 가끔 중요하고, C++에서는 더 많은 경우에 중요합니다.

2. 포인터는 다른 포인터로 초기화할 수 있지만 배열은 다른 배열로 초기화할 수 없습니다.

char뿐만이 아니에요. 아래 코드도 똑같이 컴파일 안 됩니다.

int arr1[10] = {0,1,2,3,4,5,6,7,8,9};
int arr2[10] = arr1; // error

배열을 초기화하려면 arr1에서와 같이 중괄호 안에 초기값들을 넣어 줘야 합니다. 아니면 아예 나중에 for문을 돌려서 초기화하던가요.

3. 문자열 리터럴을 이용한 문자 배열 초기화는 문법적으로 볼 때 편의를 위해 예외적으로 허용되는 것입니다.

char carr[10] = "hellow";char carr[10] = {'h', 'e', 'l', 'l', 'o', 'w', '\0'};와 같습니다. 문자열 리터럴의 첫번째 문자의 주소를 반환하고 뭐고 없습니다. 그냥 이런 꼴의 초기화를 이런 식으로 처리해주는 것뿐입니다. 편의를 위해서요.

stella770의 이미지

원래 저렇게 생각없이 당연하다는 듯이 쓰고는 있었지만 다시 훑어보면서 곰곰히 생각해보니
책이나 인터넷에서 배울때는 배열이름이 첫번째 원소를 가리키는 상수 포인터다!
라고 정의만 해줘서 문법적인 혼란이 왔었습니다. 정말 감사합니다. 그냥 예외적으로 허용되는 것이였군요

속이 다 시원합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.