2016-06-08 7 views
0

В последнее время я изучаю код программирования. Я застрял здесь, имея дело с двумерными строками и указателями. Кроме того, функции printf(), putchar() и puts() запутывают! Пожалуйста, помогите мне со следующим фрагментом: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; 
} 

Я хочу знать, почему *(ptr+1) и (ptr+1) как работа для printf в то время как (ptr+1) дает ошибку для puts. Также я знаю, что putchar принимает целочисленный аргумент. Почему мы используем двойной указатель здесь?

+0

напечатайте указатели, используя '% p' –

+0

Кроме того, я прошу вас перечитать man-страницы и дважды проверить поставляемые типы данных. :) –

+0

«дает ошибку»: какая ошибка? –

ответ

0

Ваша переменная ptr имеет тип char (*)[4] (указатель на char). Прототип puts является:

int puts(const char *s); 

Так что, как ваш компилятор, вероятно, говорит, puts ожидает указатель на char но вы даете аргумент типа char (*)[4].

Я хочу знать, почему * (ptr + 1) и (ptr + 1) работают для printf while (ptr + 1) дает ошибку для puts.

Типы аргументов не проверяются на вызов к printf (вероятно, потому, что printf принимает VARIADIC аргументы). Добавьте -Wall в свой CFLAGS, чтобы добавить дополнительные предупреждения, и ваш компилятор должен предупредить об этом.

Также я знаю, что putchar принимает целочисленный аргумент. Почему мы используем двойной указатель здесь?

Вы разыменования ptr дважды, чтобы получить char (вы также можете сделать (*ptr)[1]). Это char неявно вставляется в int, когда вы вызываете putchar.

+3

'char * [4]' - массив из 4 символов указатели, 'char (*) [4]' - указатель на массив из 4 символов. – user694733

+1

'ptr' не является массивом указателей. – 2501

+0

Это помогло и принесло некоторую ясность. Благодарю. –