Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谁能给我解释一下这段代码吗?我是C的新手_C_String_Reverse - Fatal编程技术网

谁能给我解释一下这段代码吗?我是C的新手

谁能给我解释一下这段代码吗?我是C的新手,c,string,reverse,C,String,Reverse,我正在尝试学习C语言,所以我尝试了C语言中的一些coderbyte挑战,其中之一就是反转字符串。由于语法的原因,在出现多个编译错误后,我试图寻找示例,但在上遇到了这一个 #包括 整数字符串长度(字符*); 无效反向(字符*); main() { 字符串[100]; printf(“输入字符串”); 获取(字符串); 反向(字符串); printf(“输入字符串的反面是\%s\”\n,字符串); 返回0; } void reverse(字符*字符串) { int长度,c; 字符*开始,*结束,温

我正在尝试学习C语言,所以我尝试了C语言中的一些coderbyte挑战,其中之一就是反转字符串。由于语法的原因,在出现多个编译错误后,我试图寻找示例,但在上遇到了这一个

#包括
整数字符串长度(字符*);
无效反向(字符*);
main()
{
字符串[100];
printf(“输入字符串”);
获取(字符串);
反向(字符串);
printf(“输入字符串的反面是\%s\”\n,字符串);
返回0;
}

void reverse(字符*字符串)
{
int长度,c;
字符*开始,*结束,温度;
长度=字符串长度(字符串);
开始=字符串;
结束=字符串;
对于(c=0;c

c甚至不是字符,那么为什么要添加它呢?或者指针是考虑while循环上下文的某种索引吗?

根据我的理解,如果字符串是:abcd 结果将是:dcba 如果输入为:HELLO-WORLD 输出将是:DLROW-OLLEH

记住
*(指针+c)
相当于
指针[c]

c
被用作索引。

这里的
+
运算符并不意味着字符串连接;它意味着指针运算<代码>指针
是指向
char
的指针,而
c
int
,因此
指针+c
会导致指向
char
的指针,即
c
char在内存中的进一步向前移动。例如,如果有一个数组
{j',k',l',m'}
指针
指向
'j'
,并且
c
是2,那么
指针+c
将指向
'l'
。如果像这样推进一个指针,那么遵循它,其作用与数组索引语法相同:
pointer[c]
。因此,循环相当于:

while( pointer[c] != '\0' )
  c++;

将指针添加到整数(反之亦然)的效果会根据指针(假定)指向的对象的大小进行缩放,因此不需要考虑对象的不同大小
foo+5
,如果
foo
是一个指针,则将在内存中向前移动5个对象,无论对象
foo
指向什么大小(假设
foo
指向它声明指向的类型)。

这里您可以讨论指针算法

int a[3] = {1, 3, 6};

printf("%d\n", *(a + 1)); // print 3, look 4 bytes ahead

printf("%d \n", *(a + 2)); //print 6, look 8 bytes ahead
有一个重要的概念:

  • 向指针添加一个整数将向前移动指针。要添加的数字将乘以指针所指向类型的大小
例如:

整数是在4个字节上编码的,所以当我们将指针增加1时,我们必须乘以4才能得到常规算术中真正发生的结果

int a[3] = {1, 3, 6};

printf("%d\n", *(a + 1)); // print 3, look 4 bytes ahead

printf("%d \n", *(a + 2)); //print 6, look 8 bytes ahead
就你而言:

字符按1字节编码,因此

*(pointer + c) with c == 3
将计算为前面3个字节(3个字符)的内存地址

因此,代码:

while( *(pointer + c) != '\0' )
  c++;

将在特定内存地址处计算指针的值。如果字符等于空字符,则我们已到达字符串的末尾。

获取(字符串)
表示您正在从旧文本/讲师那里学习,因为自C11以来,
gets()
已从C中删除。您应该使用fgets(),它还可以防止缓冲区溢出://我不理解这一部分:“
指针
字符串
的第一个元素的地址。由于字符串由字符组成,字符的大小为
1
,字符串以
\0
(空字符)结尾,因此计数器将前进,直到达到
\0
并返回最后一个值。请认真对待不要使用
get()
的建议。使用变量
c
作为字符串的索引可能不是清晰的最佳做法,但也没有什么不寻常的地方。反向函数会更改字符串。。怎样?从2到lengh/2,在每次迭代中切换end和begin,ofc begin++&end,以避免产生无限循环
int a[3] = {1, 3, 6};

printf("%d\n", *(a + 1)); // print 3, look 4 bytes ahead

printf("%d \n", *(a + 2)); //print 6, look 8 bytes ahead
*(pointer + c) with c == 3
while( *(pointer + c) != '\0' )
  c++;