#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int swap(int x, int y) {
int temp = x;
x = y;
y = temp;
}
int main(){
int a = 1, b = 2;
swap(a, b);
printf("%d %d", a, b);
return 0;
}
我还不知道这个问题!最后打印的结果还是 1 2而不是2 1,难道swap函数失去了作用?
在 C 语言中,函数的参数是通过值传递的
当你调用 swap(a, b)
时,a
和 b
的值被复制到 swap
函数的参数 x
和 y
中。swap
函数内部对 x
和 y
的任何修改都不会影响 a
和 b
,任何修改都只影响复制了a和b的值的形参x、y
总结,C语言中,形参不能改变实参
//形参,即形式参数
如果要交换实参(即a、b)的值,必须要传地址,这就要用到指针
#include <stdio.h>
void swap(int *x, int *y) {
int temp = *x; // 使用指针解引用获取原始变量的值
*x = *y; // 将 y 的值赋给 x 指向的地址
*y = temp; // 将 temp 的值赋给 y 指向的地址
}
int main() {
int a = 1, b = 2;
swap(&a, &b); // 传递 a 和 b 的地址
printf("%d %d\n", a, b); // 输出 2 1
return 0;
}
我刚刚有了一个错误的想法,在这里纠正
int *x = a
这个代码是不合法的,因为 a
是一个整数,而 x
是一个指向整数的指针。你不能将一个整数直接赋值给一个指针
//我刚开始以为:真666,不说取地址运算符&也能表示取地址的意思
//结果是眼瞎,没看到swap(&a,&b),我他妈是小丑!
我再提醒下,上章所强调的*p和p的区别
#define _CRT_SECURE_NO_WARNINGS 1 // 这个宏定义用于禁用一些编译器的安全警告
#include <stdio.h> // 引入标准输入输出库
int main() {
int a = 1, b = 2; // 定义两个整型变量 a 和 b,并分别赋值为 1 和 2
int* p = &a; // 定义一个整型指针 p,并将其指向变量 a 的地址
printf("%p\n", p); // 打印指针 p 的值,p本身存储的数据是 a 的地址,而不是a
printf("%d", *p); // 打印指针 p 指向的值(即 a 的值)
//注意是%d,同时加上解引用符号*
//*p等价于a
return 0; // 返回 0,表示程序正常结束
}
在 C 语言中,%p
是一个格式说明符,用于在 printf
函数中打印指针的值(即指针所指向的内存地址)
%p
会将指针的值以十六进制格式输出,通常以 0x
开头,后面跟随指针地址的十六进制表示
%p
只适用于指针类型,使用其他类型(如整型)时会导致未定义行为
还有个搞笑的,printf("%d", p); 这个时候没有加取地址运算符&
printf("%p", p);
printf("%d", p);
第一行代码,不加&,%p就是用十六进制形式打印p的值
第二行代码,不加&,p
的值会被解释为一个整数(通常是一个整型值)然后以十进制形式输出,而这个解释得到的值其实是狗屁不通,没几把用
因为 %d
是用于打印整数类型(int
)的,而非指针类型,所以下次遇到这种见一个骂一个
printf("%p\n",*p);
这也是错误的,*p
将返回 a
的值,那么用%p打印1这个数字,无稽之谈
Comments NOTHING