인수를 배열로 받을때 질문입니다.

jhugestar의 이미지

#include <iostream>

void encoding(char star[])
{
cout << sizeof(star) <<" "<< star <<endl;
}

int main()
{
char star[] = "0123456789";
cout << sizeof(star) <<" " << star <<endl;
encoding(star);
}

====

위의 코드의 결과값이
11 0123456789
4 0123456789

이렇게 나옵니다만

encoding 함수내에서 star의 사이즈가 4로 나오는건 어캐 해석해야하나요?

선언은 배열로 해도 결국 포인터로 인식되는건가요??

구체적인 이유를 알고 싶습니다.
답변 부탁드립니다 (__)

agrumpy의 이미지

C에서 일반적으로 array와 pointer는 다른 것이지만, 다음과 같은 경우에 array를 pointer로 다룬다고 합니다.

1. expression안에 array 이름이 나올 때, array 이름은 array의 첫번째 요소를 가리키는 pointer로 처리한다.

2. array의 첨자는 pointer에 offset을 취한 것과 동일하다.

3. 함수 인자로 선언된 array는 그 array의 첫번째 요소를 가리키는 pointer로 처리한다.

님이 보여주신 예제에서 encoding()이란 함수의 인자로 char[]를 선언하셨더라도 3번 규칙에 의해 컴파일러는 이것을 char *로 처리하므로 그 크기를 구하면 4가 나오는 것으로 이해할 수 있습니다.

정태영의 이미지

jhugestar wrote:
선언은 배열로 해도 결국 포인터로 인식되는건가요??

배열은 상수 포인터입니다... :)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

ixevexi의 이미지

정태영 wrote:
jhugestar wrote:
선언은 배열로 해도 결국 포인터로 인식되는건가요??

배열은 상수 포인터입니다... :)

배열은 그저 배열이라고 알고 있습니다.

agrumpy님 말씀이 정확합니다.
일반적으로 array와 pointer 는 형이 다릅니다.

C++, 그리고 C++....
죽어도 C++

girneter의 이미지

cinsk 님

Q.6.19 에 보면

[C9X]는 가변 크기 배열을 제공하며, [C9X] 확장 기능을 제공하는 컴파일러가 널리 퍼지게 되면, 이 방법이 가장 바람직한 방법이 될 수 있을 것입니다. (GCC는 이미 가변 크기 배열을 제공합니다.)

라고 되어 있는데 이건 무슨 의미인가요?

여기서 말하는
'이 방법' 이 무엇을 말하는지 모르겠습니다

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

happyjun의 이미지

girneter wrote:
Q.6.19 에 보면

[C9X]는 가변 크기 배열을 제공하며, [C9X] 확장 기능을 제공하는 컴파일러가 널리 퍼지게 되면, 이 방법이 가장 바람직한 방법이 될 수 있을 것입니다. (GCC는 이미 가변 크기 배열을 제공합니다.)

읽어보지 않았으나 C99에서 지원하는 가변 크기 배열은 다음을 말하는 것 같습니다.

int someFunc( int size )
{
    int intArray[ size ];

    ....
}

----------------------------------------
http://moim.at
http://mkhq.co.kr

doldori의 이미지

girneter wrote:
여기서 말하는 '이 방법' 이 무엇을 말하는지 모르겠습니다

가변 길이 배열(variable length array)를 뜻하는 것입니다. 예를 들면
double total(int r, int c, double a[r][c])
{
    double ret = 0.0;
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            ret += a[i][j];
    return ret;
}
girneter의 이미지

doldori wrote:

예를 들면
double total(int r, int c, double a[r][c])
{
    double ret = 0.0;
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j)
            ret += a[i][j];
    return ret;
}

오.. 이거 신기하네요.
좋은 정보 감사합니다

개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?

익명 사용자의 이미지

[quote="정태영
배열은 상수 포인터입니다... :)

제가 이상하게 생각했던점은
main 에서는 sizeof(star) 에서 4가 아닌 12로 나왔고
이것은 star 라는것이 포인터 상수임에도 불구하고
sizeof연산자의 경우에는 예외적으로 배열자체로 인식하기 때문이라고 알고 있습니다.

따라서 제가 생각하기로는
encoding 함수 내에서도 똑같은 이유로 배열명 자체는 포인터일지라도 선언을 배열로 하였기 때문에 sizeof 시에 배열의 크기가 나와야할것이라고 생각했는데요.
이경우를 어떻게 해석해야 하나요;;

doldori의 이미지

Anonymous wrote:
제가 이상하게 생각했던점은
main 에서는 sizeof(star) 에서 4가 아닌 12로 나왔고
이것은 star 라는것이 포인터 상수임에도 불구하고
sizeof연산자의 경우에는 예외적으로 배열자체로 인식하기 때문이라고 알고 있습니다.

이런 이유로 배열을 포인터 상수라고 설명하는 것은 모순을 낳게 됩니다. 위에서
ixevexi님이 지적하셨듯이 배열과 포인터는 *전혀* 다른 형입니다.

Anonymous wrote:
따라서 제가 생각하기로는
encoding 함수 내에서도 똑같은 이유로 배열명 자체는 포인터일지라도 선언을 배열로 하였기 때문에 sizeof 시에 배열의 크기가 나와야할것이라고 생각했는데요.
이경우를 어떻게 해석해야 하나요;;

main()에서 star가 배열이건 포인터이건 상관없이 encoding() 내에서 star는
항상 포인터이기 때문입니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.