首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针或指针指向指针

指针或指针指向指针
EN

Stack Overflow用户
提问于 2015-07-29 16:07:14
回答 2查看 169关注 0票数 2

在我继续之前,我想告诉你,我是c语言的初学者(6个月),当我必须在我的程序中使用指针时,我对它们不是百分之百肯定,所以请对我温柔一点。

今天,我在编写代码时,突然意识到我需要使用交换。

选项1: --这是我使用的:

代码语言:javascript
复制
#include <stdio.h>

void swap(int *pa, int *pb){
    int temp;
    temp = *pa;
    *pa = *pb;
    *pb = temp;
}


int main(void){
    int a = 5;
    int b = 10;

    printf("Before Swap:\n");
    printf("A = %d\nB = %d\n\n",a,b);

    swap(&a,&b);

    printf("After Swap:\n");
    printf("A = %d\nB = %d\n",a,b);

    return 0;
}

对于我所需要的一切都很好:

掉期前:A=5B= 10

代码语言:javascript
复制
After Swap:
A = 10
B = 5

后来,我决定在程序中必须包含指针,于是我就这样修改了这个程序:

备选方案2:

代码语言:javascript
复制
#include <stdio.h>

void swap(int *pa, int *pb){
    int temp;
    temp = *pa;
    *pa = *pb;
    *pb = temp;
}


int main(void){
    int a = 5;
    int b = 10;

    int *pa = &a;
    int *pb = &b;

    printf("Before Swap:\n");
    printf("PA = %d\nPB = %d\n\n",*pa,*pb);

    swap(pa,pb);

    printf("After Swap:\n");
    printf("PA = %d\nPB = %d\n",*pa,*pb);

    return 0;
}

再一次,它对我所需要的一切都很好:

代码语言:javascript
复制
Before Swap:
PA = 5
PB = 10

After Swap:
PA = 10
PB = 5

接下来是有趣的部分。我正在继续编写代码,并使用指针到指针作为参数更改了交换函数,得到如下结果:

选项3:

代码语言:javascript
复制
#include <stdio.h>

void swap(int **ppa, int **ppb){
    int temp;
    temp = **ppa;
    **ppa = **ppb;
    **ppb = temp;
}


int main(void){
    int a = 5;
    int b = 10;

    int *pa = &a;
    int *pb = &b;

    printf("Before Swap:\n");
    printf("PA = %d\nPB = %d\n\n",*pa,*pb);

    swap(&pa,&pb);

    printf("After Swap:\n");
    printf("PA = %d\nPB = %d\n",*pa,*pb);

    return 0;
}

一切都很好:

交换前: PA =5 PB = 10

代码语言:javascript
复制
After Swap:
PA = 10
PB = 5

因此,当我在main中调用交换函数时,必须使用& operator。我的问题是(因为我在这里感到困惑)选项2和选项3都可以使用,或者仅仅使用其中之一,以及为什么。我不是要求一个更好的编码,我只是不知道选项2和3,两者都是合法的或不合法的,为什么两者都工作良好。

L.E:@Olaf说:

如果你在交换中加上第三颗或第四颗星,那也没问题。你好好想想看

现在我更困惑了,因为它不像他所说的那样起作用:

代码语言:javascript
复制
#include <stdio.h>

void swap(int ****pa, int ****pb){
    int temp;
    temp = ****pa;
    ****pa = ****pb;
    ****pb = temp;
}


int main(void){
    int a = 5;
    int b = 10;

    int *pa = &a;
    int *pb = &b;

    printf("Before Swap:\n");
    printf("PA = %d\nPB = %d\n\n",*pa,*pb);

    swap(&pa,&pb);

    printf("After Swap:\n");
    printf("PA = %d\nPB = %d\n",*pa,*pb);

    return 0;
}

输出:

C:函数‘main’:program.c:21:14: error:从不兼容的指针类型-Werror交换(&pa&pb)中传递‘-Werror’的参数1;^ program.c:3:10:注意:预期的‘int *’但是参数类型是‘int**’void交换(int*pa,int*pb){^ program.c:21:18: program.c:21:18:从不兼容的指针类型-Werror交换区(&pa&pb)传递‘-Werror’的参数2;^ program.c:3:10:注意:预期的‘int *’但是参数类型是‘int**’void交换(int*pa,int*pb){^ cc1:所有警告都被视为错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-29 16:22:54

没有什么是错误的,因为它是合法的和有效的。唯一的考虑是它有多大的用处和效率。将指针传递给指针,生成的代码将包含一个三重寻址,第一个地址将检索指向变量的指针地址,第二个地址将从指针检索变量的地址,最后将得到变量。在您的情况下,您必须传递指针,以使函数交换能够修改函数范围之外的两个参数。

但是,如果考虑到以下代码,则传递指针可以有一定的意义:

代码语言:javascript
复制
#include <stdio.h>

void swap(int **ppa, int **ppb){
    int *pTemp = *ppb;
    *ppb = *ppa;
    *ppa = pTemp;
}


int main(void){
    int a = 5;
    int b = 10;

    int *pa = &a;
    int *pb = &b;

    printf("Before Swap:\n");
    printf("PA = %d\nPB = %d\n\n",*pa,*pb);

    swap(&pa,&pb);

    printf("After Swap:\n");
    printf("PA = %d\nPB = %d\n",*pa,*pb);

    return 0;
}

在这种情况下,您是在交换指针,而不是变量。当您需要交换大数据(如字符串)时,这非常有用,因为它比在对象之间复制整个数据要快得多。

票数 4
EN

Stack Overflow用户

发布于 2015-07-30 09:28:43

为了得到正确的结果,你应该很好地理解指针和回溯之间的区别。

此外,您还应该很好地了解按值调用、指针调用和函数引用之间的区别:

在这里,一些例子应该向你澄清这个概念:

代码语言:javascript
复制
 int myAge=39;

cout<< "myAge is locate at " << &myAge << endl; // address of myAge in memory

int* agePtr=&myAge;

cout<<"Address of pointer "<< agePtr << endl;

cout<< " Data at memory address "<< *agePtr << endl;

int badNums[5]={4, 13, 14, 24, 34};

int* numArrayPtr = badNums;

cout<< "Address " << numArrayPtr << " Value " << *numArrayPtr << endl;

numArrayPtr++; // get next value in Array

cout<< "Address " << numArrayPtr << " Value " << *numArrayPtr << endl;

cout<< "Address " << badNums << " Value " << *badNums << endl;

在这里,通过指针和引用调用函数参数:

代码语言:javascript
复制
void makeMeYoung(int* age) {

 cout<< " I used to be " << *age << endl;

    *age = 21;
  } 

void actYourAge(int& age){
     age = 39;                                       
  }

makeMeYoung(&myAge);

cout << "I'm "<< myAge << " years old now" << endl; // 21

int& ageRef= myAge;

cout<<"myAge : " << myAge << endl; // 21

 ageRef++;

 cout<<"myAge : " << myAge << endl; // 22

actYourAge(ageRef);

cout<<"myAge : " << myAge << endl; // 39

请注意,如果不想在变量解密时初始化,则应该使用指针;如果需要将另一个变量赋值给指针,则可以使用指针处理多个变量,而当您只需要对一个变量使用一个参考并坚持使用它时,您的想法是只指向一个变量“使用参考”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31705703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档