我有一个关于从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++
如何指向字符串的开头?
好像我们按值发送指针!!
有人可以给出解释吗?感谢。
答案 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)
您的函数中的targ
和targ
中的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)
,则x
和y
将不会更改。如果您将&
放在前面,则可以通过引用传递x
&#39;,允许foo
修改来电者中的x
,但写成foo(&x,&y)
。如果您未在值前面看到&
,那么它就是值。
按值传递指针意味着原始指针将继续指向同一位置。当然,指针指向的数据可能会在某个时候发生变化,但指针本身会指向同一个位置。