2015-06-15 2 views
0

Я новичок в указателях. после завершения целочисленных массивов и указателей я смещен в массивы символов и указатели. я ожидал тех же результатов, но это было странно.символьные массивы и указатели основные путаницы

int main() {  
    char chararray[20]="Char Array";  
    void printarray(char *);  
    void printarraydirect(char *); 

    printf("Passing chararray to funtion printarray\n");  
    printarray(chararray);   
    printf("Printing directly as c in printarraydirect function");   
    printarraydirect(chararray); 

    return 0; 
} 

void printarray(char *c){   
    int i=0;  
    //while(c[i]!= ' ')-----------------------> checks for empty space   
    while(c[i]!='\0')  
    {  
     printf("%c",c[i]);  
     i++;  
    }  
    printf("\n");  
} 



void printarraydirect(char * c){   
    printf("Printing c-------------->");   
    printf("%s\n",c);   
    int i=0;   
    printf("Printing c[i]-------------->\n"); 
    // shows error here , if so why didnt it show me error in printarray function. and why didnt it print the whole array when printed c in printarray function.. 

    printf("%s\n" c[i]); 

} 
+0

Вы определяете свою функцию внутри 'main()'? Зачем? –

+4

'printf ("% s \ n "c [i]);' не то же самое, что 'printf ("% c ", c [i]);' –

+2

последней строке должно быть 'printf ("% c \ n "c [i]);', потому что это только один символ. – Himanshu

ответ

2

Прежде всего, вам не хватает запятой на линии printf("%s\n" c[i]);. Во-вторых, c[i] - это один char (тип элемента вашего массива), поэтому неправильное форматирование %s - для печати одного символа должно быть %c. Если вы хотите распечатать всю строку с этой точки, вам необходимо передать адрес этого элемента (&c[i]), но в этом случае это то же самое, что и c, так как i равно нулю.

+0

извините за ошибку. рассмотрим массив int, int a [5]; int * p = a; то a [i] и * (a + i) вернут значение, а & a [i] и a + i вернут адрес. Если так, тогда в моем случае, почему бы не печатать c, верните мне адрес только 1-го символа, но он вернется весь массив. – Jagdeesh

0

В основном спецификатор формата %s ожидает адрес для печати в выходной поток, и он печатает до тех пор, пока не найдет символ NULL (\0). Здесь, когда вы даете просто c, в качестве аргумента передается базовый адрес массива. Но когда вы даете c[i], это значение находится в местоположении (базовый адрес + индекс) i.e, addressOf (c) + valueOf (i).

+0

, тогда каков способ печати адреса каждого символа в printarraydirect ?? – Jagdeesh

+0

Если вы хотите напечатать «адрес» каждого символа, вы должны использовать цикл «для», а функция printf должна печатать адрес типа (printf («% d», & c [i])). это напечатает адрес каждого символа. вы также можете использовать длинный двойной формат. –

+0

Спасибо Tamil selvan.in C++, если я напечатал & a [0], он печатает Char Array, и если я печатаю & a [2], он печатает ar Array, .why so? и в C++ как распечатать адрес? – Jagdeesh

Смежные вопросы