C포인터 질문좀...

ekacl의 이미지

#include<stdio.h>

int main()
{
	char x[]="moldy\n",y[]="jello\n";
	char *p[]={x,y};
	static char **pp=p;

	**++pp-=2;
	printf("%s",*pp);

	*(p[0]+4)=*(*p+3);
	pp[-1][3]=*(*(pp-1)+2);
	++*--pp;
	*++*pp='r';
	*(*pp-2)=**p+5;
	printf("%s\n",pp[0]-2);
}

이소스 출력하면
hello
world
라고 출력이 되는데...hello까지는 이해가 되는데...그뒤로는
도저히 혼자서 아무리생각해도 어떻게 그렇게 되는지 모르겠어요..ㅜㅜ
차근차근 설명해 주시면 정말 감사하겠습니다 ^^;;

ㅡ,.ㅡ;;의 이미지

int main()
{
char x[]="moldy\n",y[]="jello\n";
char *p[]={x,y};
static char **pp=p;

**++pp-=2;
printf("%s",*pp);

위에는 j대신에 h 넣고 출력하라 (j-2 = h)
따라서 hello

*(p[0]+4)=*(*p+3);
첫번째 스트링에서 5번째배열에 4번째 문자를 넣어라
pp[-1][3]=*(*(pp-1)+2);
첫번째 스트링에서 4번째배열에 3번째문자를 넣어라
++*--pp;
pp포인터위치를 차라리 첫번째스트링(x) 의 두번째에 갔다놔라....
*++*pp='r';
어라 하나덜왔네.. 두번째가아니고 세번재로 옮기고 거기다가 r 을넣어두자
*(*pp-2)=**p+5;
어이쿠 이게아니었구나 다시두칸전의(그러니까 x배열의맨첨)에다가
r 보다 5큰문자(w) 를넣어두자 (따라서 현재 world 가완성)
printf("%s\n",pp[0]-2);
그럼 다시 금방넣었던곳부터 스트링을 출력해봐라...
끝...........
}[/code]


----------------------------------------------------------------------------

ekacl의 이미지

증말 감사 감사~~
이해가 팍팍 되네요 ^^

고물의 이미지

p : p[0], p[1] (포인터 2개를 가짐)
p[0]: moldy\n ( 배열 x[]를 가짐 )
p[1]: jello\n ( 배열 y[]를 가짐 )

pp : p를 가리키는 포인터

#include<stdio.h> 

int main() 
{ 
   char x[]="moldy\n",y[]="jello\n"; 
   char *p[]={x,y}; 
   static char **pp=p; 
   
   **++pp-=2;

<-------------------------------------------------------------------------------
pp가 1 증가되어 y[]를 가리키게 되고 그 첫번째 문자를 -2 해줌 j->h
:pp만 y[] 배열을 가리킴
:y[]:hello\n (첫문자가 -2됨)
------------------------------------------------------------------------------->
   printf("%s",*pp); 
   *(p[0]+4)=*(*p+3);

<-------------------------------------------------------------------------------
p의 첫번째 배열(x)의 +4한 5번째 문자(y)를 배열(x)에서 +3한 4번째 문자(d)로 대치
:x[]: moldd\n
------------------------------------------------------------------------------->
pp[-1][3]=*(*(pp-1)+2);
<-------------------------------------------------------------------------------
y[]를 가리키는 pp에서 -1을 해줘서 x[]를 가리키게 되고 그 4번째 문자(d)에
pp에서 -1을 한 x배열에서 +2한 3번째 문자(l)를 대입
:x[]: molld\n
------------------------------------------------------------------------------->
++*--pp;
<-------------------------------------------------------------------------------
pp가 y[]배열을 가리키는 것에서 -를 한 x[]배열을 가리키게 되고 그 배열을 지칭
하는 포인터를 ++해서 x의 2번째 문자를 가리키게 지정
:pp가 x[]배열을 가리키게 됨
:x[]배열의 주소를 가지고 있는 p[0]의 주소가 +1됨 -> x+1을 가리킴 (pp 종속)
------------------------------------------------------------------------------->
*++*pp='r';
<-------------------------------------------------------------------------------
p[0]의 주소를 1증가시켜서 x+2를 가리키게 하고 가리킨 3번째 문자를 'r'로 교체
:x+1의 주소를 가지고 있는 p[0]의 주소가 +1됨 -> x+2를 가리킴 (pp 종속)
:x[]: morld\n
------------------------------------------------------------------------------->
*(*pp-2)=**p+5;
<-------------------------------------------------------------------------------
x+2를 가리키고 있는 pp에서 -2를 한 x[0]의 값에 x+2의 값을 가리키고 있는
p의 값(r)에 +5한 문자(w)를 입력함
:x[]: world\n
------------------------------------------------------------------------------->
   printf("%s\n",pp[0]-2); 
   
}

댓글 달기

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