c язык программирования, указатель - PullRequest
1 голос
/ 10 октября 2010
#include<stdio.h>
#include<conio.h>
main()
{
    char *q[]={"black","white","red"};
    printf("%s",*q+3);
    getch();
    return 0;
}

Код дает вывод "ck". В этом я хочу знать, как оценивается выражение *q+3. Означает, что сначала оценивается *q, затем добавляется 3, на что указывает *q. В случае целочисленного массива это просто реализовать, но здесь *q указывает на «черный», тогда добавляется 3 в чем?

Ответы [ 5 ]

3 голосов
/ 10 октября 2010

q разыменовывается, указывая на q [0]. Это указатель на строковый литерал «черный». Затем вы добавляете три, делая это, чтобы указать на «с» в «черном». При передаче в виде строки printf () интерпретирует ее как «ck».

Что еще ты не понимаешь?

2 голосов
/ 10 октября 2010

Char * [] - это массив char *.То есть каждый элемент в q является символом *.Поэтому, когда вы делаете * q, вы получаете указатель на «черный», почти так же, как если бы вы сделали это:

char const * str = "black";

Таким образом, если вы добавляете 3, вы перемещаетесь внутри строки до символа "c", таким образом это печатает" ck ".

1 голос
/ 10 октября 2010

* -dereferencer знает (по компилятору), насколько оно велико, и если вы добавляете значение, вы переходите на следующую позицию в соответствии с типом значения.

so int *п;* p + 3 продвинуться на три дюйма (sizeof (int)) вперед.(* p) +3 дает значение под p и добавляет три.

1 голос
/ 10 октября 2010

* q указывает на адрес памяти, содержащей 'b'. Например, предположим, что этот адрес равен 100 в памяти. Добавление 3 дает 103, где хранится «с».

Когда вы определяете строку, используя «...» в C, она автоматически имеет «\ 0» или 0 в конце всех символов, и C использует этот нулевой символ для определения конца строки. В вашем случае адрес 105 содержит «\ 0».

То есть он печатает только символы 103 и 104: "ck".

0 голосов
/ 10 октября 2010

Очень хороший ресурс, когда у вас есть вопросы о C / C ++: http://www.cplusplus.com/.

Статья об указателях находится здесь: http://www.cplusplus.com/doc/tutorial/pointers/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...