배열의 정확한 타입

vani2의 이미지

http://www.dal.kr/chair/cdata/cfaq_kr/node10.html

위 링크를 따르면

배열의 Data Type은 T (*)[] 이라고 볼 수 있는데

배열은 포인터가 아니라고 나와있던데..

그렇다면 저 타입은 배열 포인터로 밖에 볼 수 없다고 치면

배열의 정확한 타입은 무엇인가요?

익명 사용자의 이미지

> 배열의 Data Type은 T (*)[] 이라고 볼 수 있는데

이런 식으로 배열의 실체가 배열이 아닌 어떤 다른 것이라고 이해하지 마세요.
배열의 타입은 배열입니다.

배열이 특별한 것은 특별한 타입이기 때문이 아니라 수식 안에서의 특별한 변환규칙 때문입니다.
(그리고 이것에 더해, 함수 매개변수일때도 변환규칙이 하나 더 있습니다)
위 링크의 Q 6.3과 Q 6.4를 읽어보세요.

vani2의 이미지

그렇군요 제가 잘못 알고 있었네요.

답변 감사합니다.

익명 사용자의 이미지


개념에 집착한 나머지 원래의 의미를 잊으면 안됩니다.

배열의 이름은 그 배열의 시작주소를 가르킨다, 라고만 이해해 두시면 됩니다.

코드를 작성하면서 의미가 있는 문자를 사용하고

갖가지 개념들을 가지고 있는 언어에 함몰되어 본말이 전도되어선 안되겠죠.

굳이 C의 언어로 이해를 돕자면, const T* 겠지만 위에서 말씀하신 대로

배열을 배열이 아닌 다른 것으로 생각하는 것은 그에 기반하여 사고를 확장하게 되어 착오를 일으킬 수 있습니다.

vani2의 이미지

그렇군요.

그러고 보니 지금까지 저는 너무 개념정리하느라 다른것들을 개을리 한 것 같네요.

어제 코딩을 해보았는데 초보도 안 할만한 여러 실수를 했습니다.

부끄럽네요.

고쳐야겠습니다.

좋은 말씀 감사드립니다.

익명 사용자의 이미지

> 배열의 이름은 그 배열의 시작주소를 가르킨다.

배열의 이름만 그런 것이 아니고, 배열 타입의 결과값을 갖는 수식이면 다 적용됩니다.
따라서 별로 좋은 설명방식은 아닙니다.

int arr[2][3][4];
int (*pa)[3][4];
int (*pa2)[4];
 
pa = arr;
pa2 = *pa;    // * 연산자를 이용하여 배열 타입의 결과값을 만들어도 마찬가지 방식으로 변환됨

shint의 이미지

그러니까. 저도 잘 모르지만.

포인터'는 DWORD PTR [위치주소], 값
배열'은 BYTE PTR [위치주소], 값

입니다.

모두 4 바이트를 사용합니다. 그래서 32 비트 (4바이트 * 8비트) 컴퓨터라고 합니다. ㅇ_ㅇ;;

참고로. 포인터는 메모리 주소입니다. 4바이트 16진수 주소죠. ㅇ_ㅇ;;

//배열 변수 선언
char ca2[5];
 
//배열 변수에 값 넣기
ca2[0] = 1;
004119CA  mov         byte ptr [ebp-34h],1 
 
포인터는 dword ptr [], 값'을 사용했었는데.
배열은 byte ptr [], 값'을 사용한다.
 
//배열 변수를 선언과 동시에 초기값 넣기
char ca3[] = {"ca3"};
004119CE  mov         eax,dword ptr [string "ca3" (416850h)] 
004119D3  mov         dword ptr [ebp-40h],eax 

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

jick의 이미지

컴파일러는 실행속도를 빠르게 하기 위해 (혹은 그냥 맘대로) 코드를 만드는 과정에서 여러 가지 최적화를 합니다. 그렇기 때문에 고급언어로 "a와 b의 차이는 무엇일까?"가 궁금하다고 해서 a, b를 컴파일시켜 보고 어셈블러의 차이를 보는 것은 굉장히 위험한 방식입니다.

컴파일러 입장에서는 언어가 정한 규칙을 지키기만 하면 되기 때문에 a와 b가 실은 똑같은 의미라도 자기 맘대로 해당 상황에서 똑같은 행동을 하지만 겉보기에는 다른 어셈블리 코드를 만들어낼 수 있습니다. 그걸 보고 "같은 의미라면 컴파일러가 이렇게 다른 코드를 만들어낼 리 없잖아?" 해봤자 소용 없습니다. (불만 있으면 그 컴파일러 개발팀에 들어가든지 해야죠.)

마찬가지로 a와 b가 이러저러한 의미 차이가 있다고 해서 어셈블리 코드를 보고 그 차이를 배울 수 있을 거라는 기대는 안하는 게 좋습니다.

shint의 이미지

제가 이것저것 해봤는데. 문법적인건 책을 보는것이 맞고.
답이 맞건 틀리건... 경험상 이런 방식이. 가장 이해하기 쉬운 접근방식으로 생각되서요. ㅇ_ㅇ;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

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