[완료]C에서의 배열과 포인터...

ystory의 이미지

안녕하세요.
우선 다들 새해 복 많이 받으세요.
얼마전에도 비슷한 질문 올렸는데 의문이 가는 부분이 있어 다시 질문 드립니다.

int a[2][2] = {1, 2, 3, 4};

이와 같은 2차원배열(1차원도 마찬가지지만)에서 a[0] == *(a+0)으로 이놈들은 행을 가르키는 상수 포인터, 즉 1차원에서의 배열이름과 같은 의미를 지닌다고 나름대로 해석했습니다. -_-;; 그런데 a+1과 a[1], *(a+1) 이 셋은 모두 같은 곳을 가르킵니다.포인터 연산을 해봐도 똑같이 행단위로 연산 되구요. 하지만 차이점이라면 크기가 다릅니다. a[0] = *(a+0)은 행 전체의 크기정보를 지니지만 a+0은 4바이트의 크기를 가지며 배열의 크기나 자료형에 관계없이 똑같은 결과를 갖더군요. 그렇다면 제 허접한 결론으로 이녀석은 a+0, a+1, a+2 라는 놈은 이름이 있는 포인터라는 소리인데 역시나 다른값으로 조작은 불가능 하더군요. 물론 &(a+0)도 오류구요. 그런데 여기서 의문점입니다. 뭐 위에 늘어놓은 글과 관계 없이 도대체 a+0 이라는 것이 왜 문법적으로 있어야 하는것인지 궁금합니다. 아니 a+0 이라는걸 문법적으로 무엇이라고 해석해야 하는건가요. 실제로 a+0 이라는 문법이 쓰이긴 하나요? 굳이 a[0], *(a+0) 과 구분이 되어야 한다거나 구분이 되는 문법적인 요소가 있다면 알려 주셨으면 합니다. 새해부터 허접한 질문으로 송구스럽습니다. 감사합니다. 그럼 수고하세요.
kaeri17의 이미지

일단 a+1은 포인터 타입(개수가 2개인 int형 배열을 가리키는)이고 a[1]이랑 *(a+i)는 포인터가 아니죠. 위의 예제에서는 두개짜기 int 배열이 되겠죠.

그리고

for(int i=0;i < n;i++)
    std::cout << a[i];

라 할때 실제 컴파일러에서는 a[i] 를 *(a+i)로 바꾼다고 알고 있습니다. 이때 a[0]가 없으면 난감하겠죠

a+n으로 메모리의 데이터를 접근하는 방법은 꽤나 많이 씁니다.

ystory의 이미지

a+1이 포인터인데 그 조작이 문법적으로 오류라는것은 이해가 가지만 a+n을 활용하여 메모리에 접근해야 할만한 예가 있는지 궁금합니다. 제 좁은 생각으로는 a[0]이나 *(a+0)을 이용하는 편이 문법적 이해로도 간편하고 또 size 정보까지 가지고 있는데 궂이 a+0, a+1등과 같이 복잡한(배열이름과 그 이름으로의 연산시 매칭되지 않는 다른결과) 문법이 반드시 쓰여야 한다거나 실수나 편의를 위한 예가 있다면 좀 알려주세요. 궁금합니다. 답변감사합니다.
--------------------------------------
http://www.ystory.kr
mail@ystory.kr
Kongju national Univ.
Information Technology

--------------------------------------
으휴

익명 사용자의 이미지

일단 질문에 대해 답부터 드리자면, 객체 그 자체 대신에 포인터를 요구하는 상황(함수의 매개변수라던가)이라면
a[0]이 아니라 a+0 또는 &a[0]이 들어가야 합니다.

a+0과 동일한 의미를 갖고 있는 것은 a[0] 또는 *(a+0)이 아니라 &a[0]입니다.
a[0]과 a+0은 쓰임새가 전혀 틀립니다. (우선 타입부터 틀립니다)
따라서 왜 a+n을 써야 하는가를 물으시는건 무의미한 질문입니다.

a+0과 &a[0] 중에서 어느 것을 써야 하는가 하는 문제라면,
둘 다 큰 차이는 없다고 생각합니다.
후자 쪽이 더 의미상 명확하다고 생각하시는 분들도 계시겠지만
어느정도 수준 이상의 C프로그래머라면 어느 쪽을 쓰던지간에
제대로 의미를 이해하지 못하는 일은 없을 것입니다.

select99의 이미지

"a+1이 포인터인데 그 조작이 문법적으로 오류라는것.."
이게 왜.. 오류라고 생각하시죠? 오류아닌데..

"a+n을 활용하여 메모리에 접근해야 할만한 예가 있는지 궁금합니다."
접근하는 예는 무지 많죠.. 사실 대부분 이런식으로 접근하지 않나요? 이렇게 접근안하면 어찌 접근한다는건지..ㅡㅡ;

"제 좁은 생각으로는 a[0]이나 *(a+0)을 이용하는 편이 문법적 이해로도 간편하고"
편하고 안편하고가 문제가 아니라.. 님이 착각하시는듯합니다. a+n 은 a[n]하고 의미가 다릅니다.

물론 a+0 은 그냥 a 라하면될일이지 궂이 0을 왜붙였냐라고 물으신다면.. 글쎄요.. 왜붙였을까요.. 저도 묻고싶지만 아마도
모양? 을 좋아하시는분이 그냥 가시적인의미(0번째란 의미)로 붙여놨을듯.

freestyle의 이미지

얼렁뚱땅 법칙

배열명에 관하여
1. 배열명은 그 배열의 첫 번째 element의 시작 주소 값이다.
2. 배열명은 포인터 상수로서, 값을 assign할 수 없다.

'+' 연산자의 두 가지 역할에 관하여
1. '값 + 값'에 쓰여 2개의 '값'의 합을 반환하는 역할
2. '주소 + 값'에 쓰여 주소에서 sizeof element type * 값(개수의 의미)만큼 떨어진 곳의
'주소'를 반환하는 역할

'[]' 연산자의 역할에 관하여
1. 주소[값], 값[주소]로 사용할 수 있음
2. 위의 + 연산자를 이용하여 표현하면 *(주소+값)의 의미임

배열에서 특정 element만큼 건너 뛸 때는 그 element가 또 하나의 배열이나 구조체 등의 복합적인 형태인지,
단순한 type의 element인지 꼭 따져봐야 함.

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

익명 사용자의 이미지

자료형에 대한 개념이 부족해 보입니다.
int, int[], int[][], int[][][]는 다 다른 자료형입니다.

int a[10];
이라고 선언할때
a[0]의 자료형은 int이고
a의 자료형은 int[]입니다.

물론 a[0]와 a의 메모리 시작주소는 같습니다.
하지만 자료형이 다릅니다.
다시한번 얘기하지만 하나는 int고 하나는 int[]입니다.

비유적으로 얘기하자면 sizeof의 결과가 다른 것은
sizeof(double)와 sizeof(float)의 결과가 다른 것과 비슷한 이치이지
(해당 자료형이 가지는 크기가 다름)

*(a+0)따위와 아무런 관련이 없습니다.

댓글 달기

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