# include <stdio.h>
void mystery (int *ptra, int *ptrb) {
int *temp;
temp = ptrb;
ptrb =ptra;
ptra = temp;
}
int main () {
int a = 2016, b=0, c= 4, d = 42;
mystery (&a, &b);
if (a < c)
mystery (&c, &a);
mystery (&a, &d);
print f("%d\n", a);
}
我的尝试:
a和d没有被交换,因为函数mystery()不会改变值,而是指向函数本地的指针。
请以正式方式解释。如何运作
mystery
?
答案 0 :(得分:2)
在C中,函数总是按值传递。所以你正在做的指针交换在函数之外没有任何影响,因为你只是改变了本地值。
不需要交换指针,而是需要交换它们指向的内容,即你需要取消引用它们:
void mystery (int *ptra, int *ptrb) {
const int temp = *ptrb;
*ptrb = *ptra;
*ptra = temp;
}
答案 1 :(得分:1)
您的临时需要是int
而非 int*
:
int temp = *ptrb;
然后你需要 defererence 指针:*ptrb = *ptra;
等。
你目前所做的只是交换函数中的指针,这不会反映在函数调用者中。
答案 2 :(得分:0)
a和d未交换,因为函数mystery()不会更改值,而是指向函数本地的指针。
是的,你是对的。函数class CurrentManager(models.Manager):
def match(self, value):
objects = super(CurrentManager, self).get_query_set().all()
#here your code
objects = [o for o in objects if re.match(o, value)]
return objects
class M(Model):
re = CharacterField(max_length=50, blank=true)
objects = RegexManager()
#usage
matched = M.objects.match('123')
不会交换值。它只是将指针mystery
和ptra
分别交换到ptrb
和ptrb
指向的位置。
ptra
执行陈述后
a
+--------------+
| |
ptra ----------> | 2016 |
| |
+--------------+
b
+--------------+
| |
ptrb ----------> | 0 |
| |
+--------------+
答案 3 :(得分:0)
函数mystery()
几乎没有任何作用,编译器通过优化消除了几乎所有函数,只留下ret
。
答案 4 :(得分:0)
首先要注意的是:神秘的东西在指针副本上传递给它。这有很大的影响,其中大多数是当你在ptrb
中分配指针mystery
,void mystery (int *ptra, int *ptrb) {
int *temp;
temp = ptrb;
ptrb =ptra;
ptra = temp;
}
时,你没有改变原始指针。
mystery
第二件事:你确实指定了指针的指针,而不是指针指向的值。鉴于第一个错误,void
mystery (int *ptra, int *ptrb)
{
const int tmp;
tmp = *ptrb;
*ptrb = *ptra;
*ptra = tmp;
}
之外的世界根本没有看到任何变化。
解决方案:
取消引用指针以更改它们指向的值。
`echo off
setlocal EnableDelayedExpansion
echo a,b,c>final.txt
for /f "tokens=1 delims=;" %%i in (source.txt) do (
set x=%%i
for /f "tokens=1,2 delims=," %%a in (config.txt) do (
call SET VAR=!x:~%%a,%%b!
for %%p in (!VAR!) do (echo/|set /p ="%%p,"
) >>final.txt
)
)
`