c - 将指针作为参数传递时,编译器不需要/自动添加地址和符号吗?
问题描述
在下面的代码中,*Pointer 被传递给函数。
地址和符号被省略。
这些函数仍然可以修改传递的指针中的值。
编译器是否自动添加&?
char * input();
void get_command() {
char * command_pointer = input();
char * second = second_arg(command_pointer); //second needs to be before first
char * first = first_arg(command_pointer); //becuase first adds a /0
choose(first, second);
free(command_pointer);
}
char * first_arg(char * arg) {
char * j = strchr(arg, '-');
if(j==NULL) {
return arg;
}
*j = '\0';
return arg;
}
char * second_arg(char * arg) {
char * j = strchr(arg, '-');
if( j==NULL ) {
return NULL;
}
return ++j;
}
解决方案
只有在指针上使用 * 时才会更改值。如果你不会,值不会改变,地址会改变。考虑这些函数:
char * first_arg(char * arg) {
arg = 'a';
// some other code //
}
char * second_arg(char * arg) {
*arg = 'c';
// some other code //
}
第一个函数将更改arg 指向的地址。这个函数可能很危险,因为我们现在不知道地址“a”中存储的内容。此功能可能会以意想不到的方式改变 otter 范围的行为。但它不会改变 arg 指向的值。(除了硬编码 arg 的确切地址的情况)
第二个函数将更改arg 指向的地址中的值。这是我们正在寻找的明确定义的行为。这只会改变 arg 指向的内存值。
推荐阅读
- java - SecondaryTable 可以是 OneToMany 关系吗?
- reactjs - 在 Kubernetes Ingress 后面为静态反应应用程序提供服务
- c - C 编程 为什么这段代码显示分段错误(核心转储)?
- function - 封装 Powershell 函数
- c - 未初始化的值是由堆分配链表创建的
- django - 更新操作期间嵌套 AbstractUser 模型失败,“user_id 列中的空值违反非空约束”
- sql - Redshift - 加入两个表时缺少最新日期
- python - Python IDLE 无法打开
- yaml - 在 helm 中合并两个 Value 文件
- javascript - Node js Puppeteer goto youtube 链接到屏幕截图图像的数组