在C中交换指针

时间:2016-02-19 14:23:58

标签: c pointers parameter-passing

# 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

5 个答案:

答案 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') 不会交换值。它只是将指针mysteryptra分别交换到ptrbptrb指向的位置。

ptra

执行陈述后

                        a
                 +--------------+
                 |              |
ptra ----------> |    2016      |
                 |              |
                 +--------------+



                        b
                 +--------------+
                 |              |
ptrb ----------> |      0       |
                 |              |
                 +--------------+

答案 3 :(得分:0)

函数mystery()几乎没有任何作用,编译器通过优化消除了几乎所有函数,只留下ret

demo on Compiler Explorer

答案 4 :(得分:0)

首先要注意的是:神秘的东西在指针副本上传递给它。这有很大的影响,其中大多数是当你在ptrb中分配指针mysteryvoid 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

)

)
`