2015-06-22 5 views
0

мне интересно, что этот синтаксис strcpy() делает в строке 65 и 66:Что делает `strcpy (x + 1, SEQX)` do?

24 #define SEQX "TTCATA" 
25 #define SEQY "TGCTCGTA" 
61 M = strlen(SEQX); 
62 N = strlen(SEQY); 
63 x = malloc(sizeof(char) * (M+2)); /* +2: leading blank, and trailing \0 */ 
64 y = malloc(sizeof(char) * (N+2)); 
65 strcpy(x+1, SEQX);   /* x_1..x_M now defined; x_0 undefined */ 
66 strcpy(y+1, SEQY);   /* y_1..y_N now defined; y_0 undefined */ 

Я знаю, что копирование SEQX и SEQY в x и y, но я не понимаю, что делает +1 делать? Каково официальное название этого типа операции?

+6

Название может быть «указательным арифметическим». 'x + 1' означает адрес элемента массива после того, который' x' является адресом. –

+0

@MattMcNabb, поэтому 'x' здесь указатель? – olala

+0

Если это все код, то 'x [0]' и 'y [0]' являются нежелательными. Он почти выглядит/звучит как его отсутствие назначения в 'x [0]', например 'x [0] = ''' (инициализировать как пробел). – jww

ответ

4

pointer + offset обозначения используются в качестве удобного средства ссылаются на ячейки памяти.

В вашем случае pointer обеспечивается malloc() после того, как выделение достаточного объема памяти кучи, и представляет собой массив M + 2 элементов типа char, таким образом, обозначения, как используется в коде представляет следующий адрес:

<x + 1 * sizeof(char)> 

И это также происходит с такой же, как:

&x[1] 

другими словами, адрес x[1] (второго элемента x). После strcpy() работы памяти будет выглядеть следующим образом:

[0] [1] [2] [3] [4] [5] [6] [7] 
??? 'T' 'T' 'C' 'A' 'T' 'A' '\0' 
^ 
x 

Другими словами:

strcmp(x + 1, SEQX) == 0 

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

x[0] = '='; // now the string holds "=TTCATA" 
7

strcpy(x+1, SEQX); копирует SEQX в буфер x, но оставляет первый байт без изменений. В комментарии говорится: /* +2: leading blank, and trailing \0 */. он пропущен намеренно.

Это структура выделенного буфера:

+---+---+---+---+---+---+---+ 
| x |x+1|x+2|x+3|...| | | 
+---+---+---+---+---+---+---+ 
+0

спасибо за ответ. это 'x', теперь указатель на копию' SEQX', и это первый элемент указывает на второй элемент 'SEQX'? – olala

+0

Нет, второй элемент 'x' - это копия первого элемента' SEQX' и т. Д. Из приведенного выше кода мы ничего не знаем о первых элементах 'x' и' y'. – mlp

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