2015-02-08 2 views
1

Указатель командной строки char * argv [], используемый на языке C, позволяет такие операции, как;Как создать аналогичный указатель char, как char * argv

ptintf ("%c", argv [3][6]); // to print the 7th element of 4th argument 

printf ("%s", argv [3]); // to print the 4th parsed argument 

Теперь я понимаю, что ARGV массив символов создается до основной функции вызывается и символ * ARGV [] направляет только указатель в сторону этого массива, созданного компилятором.

Как мы можем создать указатель в коде C, который позволит подобные операции?

Я пытался делать,

#include <stdio.h> 

int main() { 

char array [20] [20]; 
     char *ptr_array = array ; 
     array [0] [0]= 'a'; 
     array [0][1]= 'b'; 
     array [0] [2] = '\0'; 

     array [1] [0]= 'a'; 
     array [1][1]= 'b'; 
     array [1] [2] = '\0'; 

     array [2] [0]= 'a'; 
     array [2][1]= 'b'; 
     array [2] [2] = '\0';   

// assuming there is content in the array 
    printf("%s\n", ptr_array [1]); 
    return 0; } 

, но я в конечном итоге с предупреждением при компиляции и дампа памяти при выполнении.

+0

'ptr_array' является указателем на символ. Я не вижу, что он делает в вашем коде. Вам нужен либо двумерный массив (который у вас есть, это «массив»), либо указатель на указатель (который на самом деле «argv»). Просто удалите 'ptr_array' из кода и вместо этого используйте' array'. 'printf ("% s \ n ", array [1]);' должен работать нормально. (Также кажется, что вы вводите в заблуждение строки и отдельные символы - пожалуйста, прочитайте базовое руководство по строкам и символам C, а также прочитайте справочную страницу для 'printf()'.) –

+0

Буду поступать так же, как советовал. С уважением. и цените ваше время. – deepIglicious

+1

Но один вопрос: зачем мы используем * argv внутри int main (int argc, char * argv)? Если у argc есть все свойства массива, я не понимаю, почему мы используем argv как массив указателей. – deepIglicious

ответ

0

Вы можете выполнить то, что хотите, просто array. Нет необходимости в ptr_array.

char array[20][20]; 
// array initialization 
printf("%s\n", array[1]); 
printf("%c\n", array[1][1]); 

argv представляет собой массив символьных массивов. Точно как array в вышеуказанном коде.

Аргументы командной строки передаются как строки (char), а argv - это массив, содержащий все эти строки.


Об использовании * и []:

char array[10]; 

array теперь указатель на первый элемент в этом массиве, таким образом, это char*.

Например, char* argv[] такого же, как char** argv:

  • argv является указателем на первый элемент в массиве с указанной char* элементов, таким образом, она является char**.

  • argv[x] получает доступ к argv массив с индексом x, таким образом, является argv[x]char*, указывающий на первый char в строке (а char массив).

  • argv[x][y] получает доступ к char массив argv[x] по индексу y, таким образом, является argv[x][y]char, элемент в строке с char массива.

+1

Это просто усилия, направленные на понимание применения argv. Я не понимаю, почему мы используем argv как массив указателей. Почему он определен как используемый? почему мы не можем использовать его как notmal char argv вместо того, чтобы его кодировать как char * argv? – deepIglicious

+0

@deepIglicious, если бы это был двухмерный массив, вам нужно было бы указать максимальную длину для каждой строки, которая является излишне ограничительной и отнимает огромную сумму памяти. –

+0

@deepIglicious. Сделано редактирование, чтобы очистить это. Отвечает ли это на ваши вопросы? – emlai

1

Вы можете использовать массив указателей как

int main() { 

     char *ptr_array[5] = { "ab","cd", "ef","gh" };  
     printf("%s\n", ptr_array [1]); 
     return 0; 
    } 

Как вы видите ARGV был массив указателей char *argv [] вы можете придумать такой же, как показано выше.

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

int main() { 

     char *ptr_array[5]; 
     char str[20]; 
     int i=0; 
     for(i=0;i<5;i++) 
     { 
     ptr_array[i] = malloc(20); 
     scanf("%s",str); 
     strcpy(ptr_array[i],str); 
     } 
     printf("%s\n", ptr_array [1]); 
     return 0; 
    } 

PS: argv может быть *argv[] или **argv

+0

Строки, на которые указывает 'argv', доступны для записи, поэтому это не совсем соответствует требованиям OP –

+0

@MattMcNabb Да да ..Я просто показал, что такое * argv [] Будет включать ваш комментарий в мой ответ – Gopi

0

Ваш array имеет тип char[20][20].

В большинстве контекстов, используя просто array преобразует его в указатель на его первый элемент: &(array[0]), который имеет тип (*)char[20] (указатель на массив 20 символов).

Вы можете назначить этот адрес указателю того же типа:

char array[20][20]; 
char (*ptr_array)[20]; // ptr_array is a pointer to an array of 20 char 
ptr_array = array;  // types of ptr_array and (the converted) array are compatible 
printf("%s\n", ptr_array[1]); 
1

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

char *ptr_array[20]; // an array of 20 pointer-to-char 

Следующий код использует strcpy для заполнения двух строк в array. {{0}} гарантирует, что все остальные строки будут обнулены. Затем объявляется ptr_array, и все 20 указателей инициализируются. Наконец, печатается одна из строк.

int main(void) 
{ 
    char array[20][20] = {{0}}; 
    strcpy(array[0], "hello"); 
    strcpy(array[1], "world"); 

    char *ptr_array[20]; 
    for (int i = 0; i < 20; i++) 
     ptr_array[i] = array[i]; 

    printf("%s\n", ptr_array[0]); 
    return 0; 
} 
+0

, нет необходимости создавать отдельный массив указателей. Просто печать 'array [i]' будет работать, потому что 'array [i]', который является массивом, распадается на указатель. –

+0

@ TheParamagneticCroissant Правда, но все дело в том, как создать массив указателей, похожих на массив 'argv', который имеет' main'. Таким образом, 'array [20] [20]' - это просто хранилище, которое позволяет 'ptr_array' без кучи' mallocs'. Единственное, что OP заботится, это 'ptr_array', потому что это * массив-указатель-к-char *, как' argv'. – user3386109

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

  • Нет связанных вопросов^_^