포인터 배우고있는데.... 설명좀해주세요...

익명 사용자의 이미지

제가 c언어 배우던 도중에 이해하기 어려운 코드가 나왔네요....

#include <stdio.h>
 
void main()
{
      char *apszList[3] = {"Test", "String", "Data"};
      char **ppszList = apszList;
 
      char szBuffer[32] = {"TestString"};
      char *pszBuffer = szBuffer;
 
      printf("%c\n", **apszList);
      printf("%c\n", *apszList[1]);
      printf("%c\n", *pszBuffer);
 
      printf("%s\n", apszList[0]);
      printf("%s\n", *(ppszList + 1));
}

이코드에서 왜 **apszList는 char형이되고, apszList[0]는 char*형이 되는지 잘모르겠어요......
pszBuffer는 char*형이여서 char형이되는건 알겠는데... 나머지 printf할때 왜 그런값이 나오는지 모르겠어요...

익명 사용자의 이미지

이 코드가 이해하기 어려운 이유는 어렵기 때문입니다.

배열, 포인터, 배열에서 포인터로의 암시적 변환, 문자 배열의 초기화 등등 다 모아놨네요.
텍스트만으로 설명하기 상당히 성가십니다. 귀하의 C언어 수준을 가늠하기 어려울 땐 더 그렇습니다.

오프라인에서 도움을 구해보세요.

jachin의 이미지

배열을 선언했을 때, 배열의 이름은 배열을 대표하는 값이기도 합니다. 보통 배열의 첫번째 항을 '가리키고' 있지요. 네, 배열이름은 포인터입니다.

헌데 szBuffer[32] 에 문자열을 할당할 때, 배열값을 할당할 때 쓰는 중괄호와 문자열을 표현하는 큰 따옴표를 썼다는 점에서 "왜 2중 포인터가 아니지?" 라는 생각은 당연합니다. 문자열의 배열값이면 이중포인터를 써야 정상일테니끼요. 이중포인터를 쓰고 싶으면 써도 좋습니다. 그러나 왜 단일포인터를 썼냐고 하냐면 똑같은 값이 출력되기 때문입니다.

배열의 첫 번째 항의 첫 문자주소를 반환하는 것은 똑같습니다. 그럼 어디에서 차이가 날까요? 각 포인터값을 1씩 늘렸을 때 차이가 납니다.

이 예제는 문자열의 속성과 문자열을 항으로 갖는 배열을 통해 2중 배열을 설명하고 포인터와의 관계를 설명하는 좋은예제입니다. 포인터의 값은 항상 주소값이지만 자료형을 무엇으로 결정하느냐에 따라 증가하는 주소의 단위가 달라진다는 사실을 보여줌으로써, 컴파일은 통과할 수 있지만, 다중배열에서 포인터를 범위에 맞게 잘 정의하는 것이 왜 중요한가에 대해 설명하고 있는 것입니다.

raymundo의 이미지

apszList[0] 이거야 apszList 가 char *의 배열이니 그 중 첫번째 원소인 apszList[0]은 char * 형이죠. int 배열의 원소 하나가 int 인 것과 똑같습니다.

이 apszList 배열은 원소가 3개이고 각각 "Test" 문자열의 시작 주소(즉 첫번째 글자인 T가 저장된 주소), "String"문자열의 시작 주소, "Data"문자열의 시작 주소이죠.

그 다음 **apszList는...

포인터 변수나 배열 이름 A가 있을 때
A[n] 은 항상 *(A+n) 과 동치입니다.

따라서

**apszList
=> *( *apszList )
=> *( *(apszList)  )
=> *( *(apszList+0)  )
=> *(  apszList[0]   )
 
apszList[0]이 char *타입이고 "Test"의 'T'의 주소이므로 그 앞에 *를 붙인
*apszList[0]은 char 타입이고 그 값은 해당 주소에 들어 있는 'T'

좋은 하루 되세요!

익명 사용자의 이미지

"char abc[3]"에서 abc[0]이 char이고 abc가 char*인 건 아시나요?
"char *abc[3]"과 "char* abc[3]"이 같은 거라는 건 아시나요?
그러면 "char* abc[3]"에서 abc[0]이 char*이고 abc가 char**가 되겠죠?

댓글 달기

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