2016-06-08 10 views
0

저는 최근에 C에서 프로그래밍에 관한 코드를 연구했습니다. 2 차원 문자열과 포인터를 다루는 동안 나는 여기에서 붙어 있습니다. 또한 printf(), putchar() 및 puts() 함수는 혼란 스럽습니다! 다음 코드로 나를 도와주세요 : 나는 (ptr+1)puts에 대한 오류를 제공하는 동안 printf에 대한 *(ptr+1)(ptr+1) 모두 일을 할 이유를 알고 싶어C 문자열, 포인터, 퍼츠

#include<stdio.h> 

int main() 
{ 
    char wer[3][4]= {"bag", "let", "bud"}; 
    char (*ptr)[4]=wer; 
    printf("%d %d %d\n",ptr, ptr+1, ptr+1); // points to bag, let and bud respectively 
    printf("%d %d %d\n",wer, wer+1, wer+1); // points to bag, let and bud respectively 

    printf("%d %d %d\n", (*ptr), (*ptr+1), (*ptr +2)); // points to b,a,g respectively 

    printf("%s\n",*(ptr+1)); //prints let 
    printf("%s\n", (ptr+1)); //prints let 
    printf("%s\n", (*ptr +1)); //prints ag 


    puts(*(ptr+1)); //prints let 
    //puts((ptr+1)); //gives error 
    puts((*ptr+1)); //prints ag 


    putchar(**(ptr+1));//prints l 
    putchar(*(*ptr +1));//prints a 

    return 0; 
} 

. 또한 putchar은 정수 인수를가집니다. 왜 우리는 여기에 이중 포인터를 사용합니까?

+0

'% p'를 사용하여 포인터를 출력하십시오 –

+0

또한, 매뉴얼 페이지를 다시 읽고 제공된 데이터 유형을 다시 확인하도록 요청합니다. :) –

+0

"오류가 발생했습니다": 어떤 오류가 발생 했습니까? –

답변

0

ptr 변수의 유형은 char (*)[4] (char 어레이에 대한 포인터)입니다. puts의 프로토 타입은 다음과 같습니다 컴파일러는 아마 말한대로

int puts(const char *s); 

그래서, putschar에 포인터를 기대하지만 당신은 유형 char (*)[4]의 인수를 제공합니다.

나는 알고 싶어 왜 * (PTR + 1)과 (PTR + 1)의 printf에 대한 작업 (PTR + 1) 풋 옵션에 대한 오류를 제공하는 동안 모두.

printf에 대한 호출에서 인수 유형이 확인되지 않습니다 (아마도 printf이 가변 인자를 취하기 때문입니다). CFLAGS-Wall을 추가하여 더 많은 경고를 추가하면 컴파일러에서 이에 대한 경고를 내야합니다.

또한 putchar은 정수 인수를 사용한다는 것을 알고 있습니다. 왜 우리는 여기에 이중 포인터를 사용합니까? 두 번이 char (당신은 또한 (*ptr)[1]을 수행 할 수 있습니다) 얻을 당신 ptr 역 참조

. 이 char은 putchar을 호출하면 암시 적으로 int으로 변환됩니다.

+3

'char * [4]'는 4 char 포인터'char (*) [4]'는 4 문자의 배열을 가리키는 포인터입니다. – user694733

+1

'ptr'는 포인터의 배열이 아닙니다. – 2501

+0

그것은 도움이되었고 약간의 명료성을 가져 왔습니다. 감사. –