2013-03-04 2 views
1

Я написал небольшую тестовую программу, чтобы увидеть, как передать указатель на массив символов функции. Это мой код:Передача указателя на массив символов в c

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

int scopy(char *org){ 
    printf("the value of org is %s" , org); 
    printf("\n"); 
} 

int main(void) 
{ 
    char original[11]; 
    strcpy(original , "helloworld"); 

    scopy(original); 

    printf("the value of original now is %s" , original); 

    return 0; 
} 

Мои знания указателей говорят мне, что орг является указателем, который передается адрес памяти оригинала [0], когда я исполняю эту программу я наблюдаю несколько вещей, которые смутили меня и заставил меня усомниться в фактах, которые я узнал о указателях.

Когда я печатаю org, я получаю полное слово назад. но в соответствии с логикой, если указатели не должны печатать адрес памяти;

когда я пытаюсь распечатывания из [1], из [2], codepad говорит мне, что процесс завершился ненормально

Моя основная сомнения в этом вопросе является то, что именно орг делать, я понимаю, что это указатель char, указывающий на адрес памяти (который?). Любая помощь будет оценена по достоинству. Я очень новичок в программировании.

Кроме того, когда я пытаюсь время цикла, как

while(out[i] !='\0') 
printf("%s",out[i]); 

не прекращается в «\ 0». в документации strcpy указано, что '\ 0' скопирован в массив символов.

ответ

3

org - это указатель на символ, который вы передаете в scopy (указатель на первый элемент массива). Когда вы используете спецификатор %s в printf, вы обрабатываете указатель на символ в виде строки; если вы хотите напечатать его значение как указатель, вместо этого вы должны использовать %p. Например: printf("The memory address in org is %p\n", org);

От того, что вы говорите, мне кажется, что вы думаете, что %s преобразует число в строку. Он этого не сделает, он ожидает указатель на первый символ строки.

Помните, что имя массива эквивалентно &array[0], то есть когда вы передаете имя массива в функции, вы передаете указатель на первый элемент. Итак, здесь, когда вы звоните scopy(original), это то же самое, что и запись scopy(&original[0]), а так как original[0] - это и & - указатель на него, поэтому ваша функция принимает char *.

0

Да, вы правы, когда вы вызываете scopy(original);, scopy получает указатель на элемент 1. в массиве original.

scopy(original); точно такой же, как scopy(&original[0]);

Однако, вы используете% s с Printf. % s ожидает, что совпадающий аргумент будет указателем символа, поместив последовательность символов, а конец этой последовательности - 0 байт. Это то, что C вызывает строку.

Это означает, что вы не можете этого сделать. printf("%s",org[i]);, так как org [i] - это char, это не указатель на символ в массив, который заканчивается 0 байтом.

Вы можете напечатать один символ, выполнив prinf["%c", org[0]) `while (out [i]!= '\ 0')

Или для вашего время цикла:

while(out[i] !='\0') 
    printf("%c",out[i]); 

И вы можете также попробовать:

while(out[i] !='\0') 
    printf("%s",&out[i]); 
Смежные вопросы