在我继续之前,我想告诉你,我是c语言的初学者(6个月),当我必须在我的程序中使用指针时,我对它们不是百分之百肯定,所以请对我温柔一点。
今天,我在编写代码时,突然意识到我需要使用交换。
选项1: --这是我使用的:
#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
After Swap:
A = 10
B = 5后来,我决定在程序中必须包含指针,于是我就这样修改了这个程序:
备选方案2:
#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;
}再一次,它对我所需要的一切都很好:
Before Swap:
PA = 5
PB = 10
After Swap:
PA = 10
PB = 5接下来是有趣的部分。我正在继续编写代码,并使用指针到指针作为参数更改了交换函数,得到如下结果:
选项3:
#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
After Swap:
PA = 10
PB = 5因此,当我在main中调用交换函数时,必须使用& operator。我的问题是(因为我在这里感到困惑)选项2和选项3都可以使用,或者仅仅使用其中之一,以及为什么。我不是要求一个更好的编码,我只是不知道选项2和3,两者都是合法的或不合法的,为什么两者都工作良好。
L.E:@Olaf说:
如果你在交换中加上第三颗或第四颗星,那也没问题。你好好想想看
现在我更困惑了,因为它不像他所说的那样起作用:
#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:所有警告都被视为错误。
发布于 2015-07-29 16:22:54
没有什么是错误的,因为它是合法的和有效的。唯一的考虑是它有多大的用处和效率。将指针传递给指针,生成的代码将包含一个三重寻址,第一个地址将检索指向变量的指针地址,第二个地址将从指针检索变量的地址,最后将得到变量。在您的情况下,您必须传递指针,以使函数交换能够修改函数范围之外的两个参数。
但是,如果考虑到以下代码,则传递指针可以有一定的意义:
#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;
}在这种情况下,您是在交换指针,而不是变量。当您需要交换大数据(如字符串)时,这非常有用,因为它比在对象之间复制整个数据要快得多。
发布于 2015-07-30 09:28:43
为了得到正确的结果,你应该很好地理解指针和回溯之间的区别。
此外,您还应该很好地了解按值调用、指针调用和函数引用之间的区别:
在这里,一些例子应该向你澄清这个概念:
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;在这里,通过指针和引用调用函数参数:
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请注意,如果不想在变量解密时初始化,则应该使用指针;如果需要将另一个变量赋值给指针,则可以使用指针处理多个变量,而当您只需要对一个变量使用一个参考并坚持使用它时,您的想法是只指向一个变量“使用参考”。
https://stackoverflow.com/questions/31705703
复制相似问题