Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 简单的交换功能…为什么';这不是交换吗?_C_Pointers - Fatal编程技术网

C 简单的交换功能…为什么';这不是交换吗?

C 简单的交换功能…为什么';这不是交换吗?,c,pointers,C,Pointers,我是C语言的新手,仍然试图掌握指针的概念。我知道如何编写一个可以工作的交换函数……我更关心的是为什么这个函数不能工作 void swap(int* a, int* b) { int* temp = a; a = b; b = temp; } int main() { int x = 5, y = 10; int *a = &x, *b = &y; swap(a, b); printf(“%d %d\n”), *a, *b); } 指针按值传递。这意味着从功能返回

我是C语言的新手,仍然试图掌握指针的概念。我知道如何编写一个可以工作的交换函数……我更关心的是为什么这个函数不能工作

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}

指针按值传递。这意味着从功能返回时,a&b仍然是a和b

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
试试这样的

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
void swap(int* a, int* b)
{
 int temp = *a;
 *a = *b;
 *b = temp;
}

正确的方法是:

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
void swap(int* a, int* b)
{
    int temp = *a;  // Temp is set to the value stored at a (5)
    *a = *b;        // value stored at a is changed to the value stored at b (10)
    *b = temp;      // value stored in address b is changed to 5. 
}

C是一种传递值语言。您的
swap
例程不会取消对传递给它的指针的引用,因此从
main
的角度来看,没有发生任何事情。

您在swap函数中缺少
*
s。尝试:

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
void swap(int* a, int* b)
{
 int temp = *a;
 *a = *b;
 *b = temp;
}

这样,您就不只是交换指针,而是交换指针指向的
int
s。

它确实交换。它在
swap
函数内交换本地指针
a
b
。它可以很好地交换它们,这是它应该做的

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}

如果要交换这些指针指向的值,则应相应地重新实现
交换
函数,即使其交换指向的值,而不是指针。

您的
交换()函数确实有效,以某种方式-它交换
swap()
本地变量
a
b
的值。不幸的是,它们与
main()
中的
a
b
不同,因此您实际上看不到交换它们的任何效果。

zildjohn1的答案是最简单、最清晰的方法。但是,如果坚持交换指针,则必须将指针传递给指针,因为指针本身是按值传递的。

在考虑指针时,需要明确一些抽象概念

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
内存中的对象。这可以是任何类型(和大小)。例如,整数对象将占用内存中的4个字节(在32位计算机上)。指针对象将占用内存中的4个字节(在32位计算机上)。显而易见,integer对象包含整数值;指针对象保存其他对象的地址

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
C编程语言允许符号(变量)在内存中表示这些对象。当你申报时

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
int i

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
符号(变量)i表示内存中的某个整数对象。更具体地说,它表示此对象的值。您可以在程序中使用i来操纵该值

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
&我会在内存中给你这个对象的地址

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
指针对象可以保存另一个对象的地址。使用以下语法声明指针对象:

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
int*ptr

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
就像其他变量一样,指针变量代表一个对象的值,一个指针对象。这个值恰好是其他对象的地址。您可以这样设置指针对象的值

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
ptr=&i

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
现在,当你在程序中说ptr时,你指的是它的值,即i的地址。但是如果你说*ptr,你指的不是ptr的值,而是地址在ptr中的对象的值,即i

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
swap函数的问题是,您正在交换指针的值,而不是这些指针为其保存地址的对象的值。要获得对象的值,您必须使用*ptr。

嗯,也许可以使用这个

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
void swap(int** a, int** b)
{
 int** temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(&a, &b);
 printf(“%d %d\n”), *a, *b);
}

不使用第三个变量(temp)

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}

您需要为swap函数发送a和b的地址,因此在调用swap函数时必须调用ass swap(&a,&b) 这样你就可以传递地址,然后改变地址

void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}
#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b))

工作正常。

一个明显的问题是,此实现与工作正常的实现之间有什么不同?(我知道这一个的问题是什么,我只是想帮你找到它。)(当然,所有热切期待的海狸都愿意直接跳到答案上来。)关于传递值的可靠碰撞课程。谢谢ppl。
void swap(int* a, int* b)
{
 int* temp = a;
 a = b;
 b = temp;
}

int main()
{
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf(“%d %d\n”), *a, *b);
}