2012-10-06 3 views
4

이것이 단순한 오류라면 용서해주십시오. 그러나 나는 지금 C를 배우고 있으며 방금 포인터를 파악하기위한 간단한 프로그램을 만들었습니다. 왜 C 포인터가 작동하지 않는지 이해할 수 없다.

은 내가

int x = 4; 
int *p; 
p = &x; 
printf("%d\n\n",*p); 

//output is 4 as expected 

을 기대하지만 출력을 산출 코드의 간단한 조각을 내가 같은 논리를 따를 경우에도 문자 배열과 동일한 작업을 수행하려고 할 때 ...이

char x[] = "Hello, Stack Overflow!"; 
char *p[]; 
p = &x; 
printf("%s\n\n",*p); 

//this gives me an error when compiling as follows 
// 
// run.c:15: error: incompatible types when assigning to type ‘char *[1]’ from type ‘char (*)[23]’ 
+0

사실이 질문은 일반적인 초급 -C 포인터 질문보다 낫습니다. +1. –

+1

스탠드없이 "언더"를 입력하면 너무 빨리 처리하려고합니다. 포인터에는 시간이 필요합니다. –

+0

@HansPassant : 실제로 RAM의 개념을 이해하면 무료 포인터에 대한 이해를 얻을 수 있습니다. C 선언 구문. 이제는 다른 이야기입니다. – bitmask

답변

2

여러 오류가 있습니다. 첫째, char *p[]은 (생각하는 것처럼) 배열에 대한 포인터를 선언하지 않습니다. 대신 char 포인터의 배열을 선언합니다. x 배열이므로

둘째, &xx 같은 수치로 평가한다 (함수에 전달 될 때 어레이 만 포인터, 값에 의해 전달 될 수 없기 때문에, 이들은 포인터로 감쇠). 당신이해야 할 것은 이것은 (문자열 리터럴하고, 즉, 포인터에 char의, 부패의 배열) 쉬운 솔루션입니다 오히려

const char *x = "Hello SO!"; 
const char **p = &x; 
printf("%s\n", *p); 

입니다. 조금 더 생각할 필요가있는 또 다른 솔루션이 있습니다. 컴파일러 오류 메시지에서 &x 유형이 char (*)[]임을 알 수 있습니다. 여기

char x[] = "Hello SO!"; // x is a char array 
char (*p)[] = &x; // p is a pointer to a char array 
printf("%s\n", *p); // printf accesses *p, so it prints the underlying char array - correct! 
+0

두 번째 단락이 옳다고 생각하지 않습니다. x의 값은 "Hello, Stack Overflow!"배열입니다. 포인터가 아닙니다. 배열과 포인터는 동일하지 않습니다. http://c-faq.com/aryptr/index.html을 참조하십시오. 물론, printf 내부에서 여러분은 언급 한 이유들 때문에 동일합니다. 그러나 우리가 바라는 범위가 아닙니다. – nes1983

+0

@ nes1983 방금 배열이 포인터가 아닌 다른 대답 제공 업체 인 dreamzor에게 설명하고있었습니다. 내 대답에도 이것을 기술하지 마십시오. 나는 당신의 요점을 보지 못합니다 - 무엇이 문제입니까? –

+0

완벽하게 작동하지만 아이디어를 얻을 수 있는지 확인하려면 다음을 수행하십시오. - 첫 번째 행은 이제 "Hello SO!"가 포함 된 자동 할당 메모리 위치를 가리키는 포인터를 만듭니다. - 두 번째 줄은 포인터에 대한 포인터를 생성하므로 이중 별표입니까? - 제 3 행에서, 물론 D –

1

char *p[]은 p가 배열에 대한 포인터가 아니라 문자 포인터의 배열임을 의미합니다. p char *p을 유지해야합니다. 그러면 작동합니다.

+0

죄송합니다. 그게 나를 위해 작동하지 않습니다, 그것은 내게이 오류를 준다 : run.c : 함수 'main'에서 : run.c : 15 : 경고 : 호환되지 않는 포인터 유형 에서 지정 및 할당 ... 세그먼트 오류 –

1

char *p[]에서 char p[] 또는 char *p으로 변경하십시오. char *p[]char **p과 같습니다.

+0

'char * p []는 char ** p와 같습니다. 단순히 true가 아닙니다. *** 배열은 포인터가 아닙니다. *** –

+0

범위에 대해 신경 쓰지 않는다면 실제로 동일합니다. 배열 **은 ** 포인터이며'arr [0]'은'* arr'과'arr [i]'=='* (arr + i)'와 같습니다. 그래서 당신은 간단하지 않습니다 :) – dreamzor

+0

당신은 당신의 '배열은 포인터입니다'진술에 의해 자신을 pwning거야. [C FAQ를 편안히 읽고 더 잘 읽으십시오.] (http : //c-faq.com/aryptr/index.html) –

-1

x 자체에 대한 포인터 (배열의 첫 번째 요소에 대한 포인터)입니다 : 그래서 당신이 여기에 선언해야하는 것은 포인터 - 투 - 배열입니다. char *pp = x 만 입력하면 제대로 작동합니다.

+0

'x'는 포인터가 아닙니다. 배열입니다. –

1
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 

    char x[] = "Hello, Stack Overflow!"; 
    char *p; 
    int len = strlen(x); 

    p = malloc(len * sizeof(char) +1); 
    strcpy(p,x); 
    printf("%s\n\n",p); 

    return 0; 
} 
2

배열에 대한 포인터를 만들려면 아래 첨자 연산자가 역 참조 연산자보다 우선하므로 명시 적으로 말해야합니다.

char x[] = "Hello, there"; 
char (*p)[sizeof(x)/sizeof(*x)] = &x; 

은 당신이 여기에서 말하는 것은 첫 번째 역 참조 및 다음는 첨자 (*p)[i]char을 양보해야 적용한다는 것입니다. 다른 사람들은 코드가 char을 가리키는 배열을 선언했다고 말했기 때문입니다.

+0

당신은 지금 만족하고 있기를 바랍니다. –

+1

@ H2CO3 : 게시물에 관한 문제를 지적하지 않겠다는 의사를 표명했다면, 그런 애정 어린 말로 대답하는 대신 그렇게 말할 수 있습니다. – bitmask

+0

나는 문제를 지적하는 것을 선호하지 않는다, 나는 당신이 그것에 접근 한 공격적인 방법을 용인 할 수 없다. –

관련 문제