[질문] 포인터 사용시...일관성이 없는건지요?

hurryon의 이미지

아직은 하수라...이것이 일관성이 없어 보입니다. 혹은 배열의 특징때문에
이렇게 되는지요?

#include <stdio.h>

int main(void)
{
        char name[] = "leejonghyouk";
        char *nick = "hurryon";
        char *ptr;

        ptr = name;

        printf("%s\n", name);
        printf("%s\n", nick);
        printf("%s\n", ptr);
        printf("%s\n", *ptr); /* 세그먼테이션 에러 */

        return(0);
}

그리고...

#include <stdio.h>

int main(void)
{
        int a = 10; 
        int *a_ptr;

        a_ptr = &

        printf("%d\n", a);
        printf("%d\n", a_ptr); /* 잘못된 값 */
        printf("%d\n", *a_ptr);

        return(0);
}

위의 2개의 코드을 보시면 알겠지만 문자을 사용할때는 그냥
ptr을 사용해야 하고 정수을 사용할때는 *a_ptr 을 사용해야 제대로
된 결과값을 내 놓습니다. 왜 이런지요?

제가 알고 있는 포인터의 상식은

#include <stdio.h>

int main(void)
{
        int a = 10; 
        int *a_ptr;

        a_ptr = &

}

위와 같을때...

*a_ptr --> a_ptr 포인터가 가르키고 있는 a라는 변수의 값
a_ptr --> 포인터 변수(보통 주소가 들어감)
&a_ptr --> a_ptr 포인터 변수의 주소

이렇게 알고 있습니다. 왜 문자을 사용할때와 정수을 사용할때는 위와같이
포인터 사용에 일관성(?)이 없는지요?

[/code]

seoleda의 이미지

printf("%s\n", 12345); 이렇게 하면..
12345번 주소에 있는 값을 화면에 출력하는 것이고.

printf("%d\n", 12345); 하면

12345라는 값을 출력하라는 %s 와 %d 의 차이 같습니다.

^^

cinsk의 이미지

포인터에 일관성이 없는게 아닙니다.
관점의 차이인데, 문자(character)나 정수(integer)에 쓰는 포인터는 사용 방법이 같습니다.

int i = 123;
int *ip = &
char ch = 'a';
char *cp = &

printf("%d, %c\n", *ip, *cp);

문자열(string)은 C 언어에서 문자의 배열(array of character)로 취급되기 때문에 다른 것이죠. 예를 들어:

char s[] = "hello";
char *p = s;

printf("%s\n", p);	/* "hello\n"를 출력 */
printf("%s\n", &p[0]);	/* 위와 같음 */

다시 말하지만 문자열은 배열입니다. 그리고 배열의 특성상, 배열의 이름만 쓸 경우, 배열 0번째 요소를 가리키는 주소가 되므로, 위에서 `p'는 `&p[0]'과 같습니다.

wind772의 이미지

int main()
{
     int x, *p_x;
     char name[]="who";
     char *p_name;
    
     x = 10;
     p_x = &x ;
     p_name = name;

// 일반적인 포인터 사용

     printf("&x = %p\n", &x);
     printf("&x = %p\n", p_x);

     printf("x = %d\n", x); 
     printf("x = %d\n", *p_x); 

// 문자열에서의 포인터 사용

     printf("&name = %p\n", name);
     printf("&name = %p\n", p_name);

     // 문자열을 출력할 때는(%s) 주소를 넘겨줌.
     printf("name = %s\n", name);
     printf("name = %s\n", p_name);

     // 문자를 출력할 때는(%c) (아스키)값을 넘겨줌.
     printf("name[0] = %c\n", name[0]);
     printf("name[0] = %c\n", p_name[0]);
     printf("name[0] = %c\n", *p_name);      // == *(p_name + 0)
     printf("name[1] = %c\n", name[1]);
     printf("name[1] = %c\n", p_name[1]);
     printf("name[1] = %c\n", *(p_name+1));

    
    return 0;
}

===================================================
중요한건 얼마나 아느냐가 아니라 그것에 대한 열정이다.

charsyam의 이미지

포인터 변수와 일반 변수는 조금 목적이 틀립니다.

예를 들어서, int abc 는 어떤 정수값을 넣기 위한 공간을 할당하고
int *abc 는 int 형 정수를 넣을 공간을 가리키기 위해서 사용합니다.
그리고 포인터 abc가 가리키는 곳의 값을 가져오기 위해서는 *abc처럼
앞에 * 표를 사용합니다.

다시 한번 정리하면,
int abc = 3; 정수값을 저장
int *p = & p에는 abc의 메모리 주소가 들어간다.
*p; 는 이제 그 메모리 주소안에 있는 실제 값 3을 가리키게 된다.

그럼 고운 하루

=========================
CharSyam ^^ --- 고운 하루
=========================

댓글 달기

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