Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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 K&;R练习5-3:向函数传递指针_C_Pointers - Fatal编程技术网

C K&;R练习5-3:向函数传递指针

C K&;R练习5-3:向函数传递指针,c,pointers,C,Pointers,对main()中的stru cat(char*,char*)的调用不正确。如果你取一个指针,比如char*p=a,则*p是一个允许您访问p引用的内存的表达式。因此,对指针执行*p操作称为取消引用。在这种情况下,这不是您想要的,因为str_cat需要一个指针而不是一个值。我下面的例子符合您的意图。您可以看到,声明附加指针是不必要的 str_cat.c: In function ‘main’: str_cat.c:13:11: warning: passing argument 1 of ‘str_

main()
中的
stru cat(char*,char*)
的调用不正确。如果你取一个指针,比如
char*p=a
,则
*p
是一个允许您访问p引用的内存的表达式。因此,对指针执行*p操作称为取消引用。在这种情况下,这不是您想要的,因为str_cat需要一个指针而不是一个值。我下面的例子符合您的意图。您可以看到,声明附加指针是不必要的

str_cat.c: In function ‘main’:
str_cat.c:13:11: warning: passing argument 1 of ‘str_cat’ makes pointer from integer without a cast [-Wint-conversion]
   str_cat(*p, *q);
           ^
str_cat.c:3:6: note: expected ‘char *’ but argument is of type ‘char’
 void str_cat(char *s, char *t);
      ^~~~~~~
str_cat.c:13:15: warning: passing argument 2 of ‘str_cat’ makes pointer from integer without a cast [-Wint-conversion]
   str_cat(*p, *q);
               ^
str_cat.c:3:6: note: expected ‘char *’ but argument is of type ‘char’

在str_cat函数中,您应该传递str_cat(p,q),而不是str_cat(*p,*q)。 这个函数中的代码有问题。在第一个while循环中,while循环将在*s='\0'时结束。并将s递增到下一个地址。因此,在下一个while循环中,指针s指向的字符串将包含“\0”字符。结果将是这样的:“你好,\0“世界!”。因此,在str_cat()调用之后,字符串a仍然是“Hello”。此代码应按预期工作:

int main()
{
    char a[MAX] = "Hello, ";
    char b[MAX] = "world!";
    str_cat(a, b);
    printf("The new string is %s.\n", a);

    return 0;
}
#包括
#包括
#定义最大值100
void str_cat(char*s,char*t);
int main()
{
字符a[MAX]=“你好,”;
char b[MAX]=“世界!”;
char*p;
char*q;
p=a;
q=b;
stru猫(p,q);
printf(“新字符串是%s.\n”,a);
返回0;
}
void str_cat(char*s,char*t)
{
而(*s)
s++;
而(*s++=*t++);
}

问题是什么?编译器是非常清楚的。是的,编译器错误是要被人们读取的。编译器编写人员花了大量时间考虑错误报告系统及其可能的实现,他们努力使错误消息尽可能清晰(诚然,有时他们并不那么成功,但仍然如此)。你看到这个错误消息了吗?这是什么意思?哦,对不起。它为什么给我这个警告?你读过这个警告吗?很清楚:
void str_cat(char*,char*)
希望它的两个参数是指针,但您只传递了两个
char
s。谢谢。我犯了一个错误。我没有意识到*p是char s。
*p
的计算结果是内存位置,而不是存储值。您可以使用该表达式检索存储值,但也有其他用法无法检索存储值,例如p='x'
int main()
{
    char a[MAX] = "Hello, ";
    char b[MAX] = "world!";
    str_cat(a, b);
    printf("The new string is %s.\n", a);

    return 0;
}
#include <stdio.h>
#include <string.h>
#define MAX 100
void str_cat(char *s, char *t);

int main()
{
    char a[MAX] = "Hello, ";
    char b[MAX] = "world!";
    char *p;
    char *q;
    p = a;
    q = b;
    str_cat(p, q);
    printf("The new string is %s.\n", a);

    return 0;
}

void str_cat(char *s, char *t)
{
    while(*s)
        s++;
    while(*s++ = *t++);
}