C strcpy函数和char *

时间:2015-01-30 15:32:31

标签: c string pointers

我有一个关于从function1发送指针到function2的问题,而function2更改指针。 让我们来看看自制的' strcpy

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strcopy(char* targ, char* src) {
    while(*src) {
        *targ = *src;
        targ++;
        src++;
    }
    *targ = 0;
}
int main() {
    char* src = "this is aa string";
    char* targ = malloc(strlen(src)*sizeof(*targ)+1);
    strcopy(targ, src);
    printf("'%s'\n", targ);
    return 0;
}

输出为'this is aa string'

问题: 虽然我们在函数中做targ,但targ++如何指向字符串的开头? 好像我们按值发送指针!! 有人可以给出解释吗?感谢。

4 个答案:

答案 0 :(得分:2)

当你将指针传递给函数时,你确实传递了指针的值,你的“targ”变量是main()函数中targ指针的副本。在strcopy()内增加它对原始指针没有影响。 当您按值传递变量时,您确实将隐藏指针传递给原始变量,但在这种情况下,您将内存地址存储到堆栈中的新变量中。

答案 1 :(得分:0)

void strcopy(char* targ, char* src)

当您调用此API时,targ将获得targ中指针main()的值,因此main中的targ永远不会被移动只是API正在填充值为了清楚起见,location将参数重命名为其他内容。

void strcopy(char* dest, char* src)

所以现在你可以读取它,因为指针dest被移动以复制值而targ中的main()保持不变

答案 2 :(得分:0)

  

好像我们按值发送指针

确实你是!

在C中,所有内容都按值传递。直到C ++我们才有了通过引用传递内容的概念。在这种情况下,您传递的是指针值的副本(即它指向的内存地址)。

如果你想改变targ指向的内容,可以写下:

void strcopy(char** targ, char* src) { /* ... */ }

strcopy( &targ, src );

答案 3 :(得分:0)

您的函数中的targtarg中的main彼此非常不同。事实上,如果我们更改了strcopy中的参数名称,可能有助于您理解:

void strcopy(char* first_pointer, char* second_pointer) {
    while(*second_pointer) {
        *first_pointer = *second_pointer;
        first_pointer++;
        second_pointer++;
    }
    *first_pointer = 0;
}

我承认它的可读性较差,但实际上与您的版本相同。在函数内部,参数的名称实际上只是昵称&#39;对于第一个参数&#39;,&#39;第二个参数&#39;等等。

将值传递给函数时,&#39;名称&#39;在函数返回之前,该值无意义。

在C中,默认情况下,所有内容都按值传递。如果您致电foo(x,y),则xy将不会更改。如果您将&放在前面,则可以通过引用传递x&#39;,允许foo修改来电者中的x,但写成foo(&x,&y)。如果您未在值前面看到&,那么它就是值。

按值传递指针意味着原始指针将继续指向同一位置。当然,指针指向的数据可能会在某个时候发生变化,但指针本身会指向同一个位置。