所以我正在研究有关自定义linux shell的代码,而我很难理解这一部分:
*
我不了解减少char指针会产生什么,以及本节的一般功能,我知道它的结尾指向标记化数组的最后一个位置,但我不理解以下两行。如果发布了类似的内容,我不介意提供链接(尽管我进行了大量研究)。谢谢!
另外一个简单的问题是:我不认为end是一个数组。我在这方面错了吗?
答案 0 :(得分:1)
减小指针将其在内存中的位置移动到前一个地址。对于char *
字符串,end
现在将指向其前一个字符。
// add null to the end
// declare a `char *`
char *end;
// set `end` to point to the last character of `tokenized`
end = tokenized + strlen(tokenized) - 1;
// decrease `end`; now points to the character before the character is was pointing to
end--;
// set the character after the one `end` points to to `NUL`
*(end + 1) = '\0';
据我所知,我评论了您的代码...
答案 1 :(得分:0)
char *end;
end = tokenized + strlen(tokenized) - 1; //
end--;
*(end + 1) = '\0';
strlen(标记)
这是tokenized
字符串中空终止符的偏移位置。
这意味着,如果将指针增加此偏移量(非空字符的数量),则最后一个指针指向最后一个字符之后的索引。为了使索引恰好位于最后一个字符上,请从偏移量中减去一个。
让offset = strlen(tokenized) - 1
标记+偏移量
这意味着指针tokenized
通过偏移量移动。如果指针将引用1个字节,则意味着它仅增加1,如果其2个字节增加2,依此类推。这是因为如果您有您希望在获取该数组指针的偏移量时仅访问整数的整数数组。 int的大小至少为2个字节,因此在递增时指针将至少移动2个字节。
结束-
与上面相同,这使指针减 一个,因为我们使用偏移量移到了字符串的最后一个字符,所以现在位于字符串的倒数第二个字符就是说这等于end = end - 1;
。
*(end + 1)='\ 0'
同样,我们将指针前移1
的偏移量,因此我们再次指向字符串的最后一个字符。因为我们只将指针减少了相同的偏移量,所以这是多余的。唯一的区别是指针end
本身未更改。
然后我们取消引用并写入指针,这意味着我们更改了指针当前指向的值,即字符串的最后一个字符。我们将其更改为'\0'
,因为这意味着我们将终止的空字节移至该位置,从而通过截断最后一个字符有效地缩短了字符串。
此处的代码等同于
size_t len = strlen(tokenized);
tokenized[len - 1] = '\0';
char *end = tokenized + len - 2; // we still have this pointer
请注意,由于包含-2
语句,因此我们现在进行end--;
。
当前的end
仍然指向现在缩短的字符串的最后一个字符。
正在发生的事情的说明:
tokenized = "hello world"; // [h e l l o w o r l d \0 ]
tokenized = "hello worl"; // [h e l l o w o r l \0 \0 ]
我不认为end是一个数组。我在这方面错了吗?
数组本质上 只是指向内存位置的指针。有一些区别,例如sizeof
结果和写访问权限,但您通常可以说数组是指针。