2014-09-20 2 views
1

Я запутался, как использовать указатели, чтобы получить этот код, чтобы работать:C указатель ARGV тип

#include<stdio.h> 

int main(int argc, char *argv[]){ 

    char* test = argv[1][0]; 
    printf("hello %s\n", test); 
} 

Здесь ошибка:

incompatible integer to pointer conversion initializing 
    'char *' with an expression of type 'char'; take the address with & 
    [-Wint-conversion] 
+2

Вы должны использовать например 'char * test = argv [1];' .'argv [1] [0] 'является типом' char', и вы назначили его 'char *', из-за чего вы вызываете проблему. –

+0

Для распечатки 'char' вы должны использовать'% c'. '% s' ist, чтобы распечатать' '' 'завершенный' char' массив aka "string". – alk

ответ

8

Тип argv[1][0] является char.

Тип argv[1]: char*.

Вы должны использовать:

char* test = argv[1]; 

Если вы вызываете вашу программу:

program "First Arguent" "Second Argument" 

затем, в main, argc равно 3.

argv[0] = "program" 
argv[1] = "First Arguent" 
argv[2] = "Second Arguent" 
argv[3] = NULL 

Учитывая такой случай,

argv[1][0] вычисляет первый символ argv[1], который равен 'F'.

Если это то, что вы хотели бы получить, вы можете использовать:

char test = argv[1][0]; 

Если вы хотите, чтобы получить весь первый аргумент, то вам нужно использовать:

char* test = argv[1]; 
+0

Обычно стоит рассмотреть _meaning_ выражений, а не только их тип. В этом случае, конечно, тип помогает вам. Но поскольку мы учим, оба следует изучить. –

+0

Это превосходно, что я хотел получить первый символ из arv [1], поэтому я просто использовал char * вместо char при аварии. Благодаря! –

+1

@LightnessRacesinOrbit, спасибо за то, что помогли лучше ответить. –

6

Первый аргумент argv[1], и argv[1][0] - первый символ этого аргумента. Измените код на

char* test = argv[1]; 
1

обугленного * ARGV [] представляет собой массив указателей, и каждый указатель указывает на массив символов (с нулевым завершением). Предположите, что вы передаете «Hello World» в качестве аргумента командной строки для вашей программы. Базовый адрес строки (нулевой конец символьного массива) хранится внутри argv [1]. Так как argv [1] указывает на строку, то argv [1] [0] дает символ в 0th
индекс в строке.

Теперь рассмотрим ваше задание:

char* test = argv[1][0]; 

Здесь с помощью ARGV [1] [0], вы на самом деле индексации внутри строки, на которую указывает
ARGV [1], и назначая charcater хранимую при 0-м индексе строки к тесту
указатель. Так как «test» является указателем таким образом, он обязан хранить адрес, а не значение.
выше присваивание присваивает значение символа, чтобы проверить, и так как персонажи
внутренне представлены в виде целых чисел в C, поэтому вы получаете предупреждение, что говорит:

incompatible integer to pointer conversion initializing 

здесь целое значение относится к ARGV [ 1] [0], а указатель - тест.

выше назначение может быть использовано в качестве:

char *test = &argv[1][0]; // assignment 1 

что эквивалентно:

char *test = argv[1]; // assignment 2 

до тех пор, как индекс в присвоении 1 0.

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