2015-06-22 107 views
0

我不知道这是什么语法strcpy()确实在65行和66:`strcpy(x + 1,SEQX)`做了什么?

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 */ 

我知道这是抄袭SEQXSEQYxy,但我不明白什么是+1吗?这种类型的操作的正式名称是什么?

+6

该名称可能是“指针算术”。 'x + 1'表示数组元素的地址,它是'x'地址之后的数组元素的地址。 –

+0

@MattMcNabb所以'x'是一个指针吗? – olala

+0

如果这是所有提供的代码,那么'x [0]'和'y [0]'是垃圾。它几乎看起来像听起来像缺少一个赋值到'x [0]'中,像'x [0] ='''(初始化为一个空格)。 – jww

回答

4

pointer + offset符号被用作参考存储器位置的方便手段。

在你的情况下,pointermalloc()分配足够的堆存储器上之后提供,并表示char类型的M + 2元件,从而在您的代码中使用的符号的阵列表示以下地址:

<x + 1 * sizeof(char)> 

而这也正好是相同:

&x[1] 

换句话说,x[1](012第二元件的地址)。在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