繁体   English   中英

C strcpy函数和char *

[英]C strcpy function and char*

我有一个关于将指针从function1发送到function2function2更改该指针。 让我们看一下“自制” 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++的功能? 看来我们正在按值发送指针! 谁能对此做出解释? 谢谢。

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

void strcopy(char* targ, char* src)

当您调用此API时, targ将在main()获得指针targ值,因此main中的targ永远不会移动,只是API将值填充到该位置,以使参数更清晰。

void strcopy(char* dest, char* src)

因此,现在您可以在移动指针dest复制值时读取它,并且main() targ保持不变

似乎我们正在按值发送指针

确实是你!

在C语言中,一切都是通过值传递的。 直到C ++才有了通过引用传递某些内容的概念。 在这种情况下,您将传递指针值的副本(即,指针指向的内存地址)。

如果要更改targ指向的内容,可以编写以下代码:

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

strcopy( &targ, src );

targ在功能和targmain是彼此非常不同。 实际上,如果我们在strcopy更改了参数的名称,可能会帮助您理解:

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

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

当您将值传递给函数时,在函数返回之前,该值的“名称”是没有意义的。

在C语言中,默认情况下,所有内容均按值传递。 如果调用foo(x,y) ,则xy不会改变。 如果将&放在前面,则可以通过引用传递x ,从而允许foo修改调用方中的x ,但这被写为foo(&x,&y) 如果在值前面看不到& ,则按值表示。

通过值传递指针意味着原始指针将继续指向同一位置。 当然,数据指向指针有时可能会改变,但指针本身将指向同一位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM