c语言中函数参数的修改

c语言中函数参数的修改

惯性思维要不得。

void pointTest(Node* node){	
	Node* tmp = node;
	tmp = tmp->next;
	printf("value is %d\n", tmp->value);	
}

通常写代码是,我会在函数体加一个临时变量指向传递过来的参数,例如上面这个例子。

今天面试别人时,看到了这样的用法:

void pointTest(Node* node){	
    node = node->next;
    printf("value is %d\n", node->value);
}

这位兄弟显然直接就操作参数了,看到这种用法,感觉非常别扭。当时没有经过思索,就问了句你觉得你这样用能编译通过吗?

答案是显然的,是可以这么用的。

反编译后,输出如下内容

pointTest:
.LFB2:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	subq	$16, %rsp
.LCFI2:
	movq	%rdi, -8(%rbp)
	movq	-8(%rbp), %rax
	movq	8(%rax), %rax
	movq	%rax, -8(%rbp)
	movq	-8(%rbp), %rax
	movl	(%rax), %esi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	leave
	ret

可以看到,修改参数,就是修改栈上的内容,因此是没有问题的。下次要注意先思考再提问。

Leave a Reply

Your email address will not be published. Required fields are marked *