11.3 下午 接上午 指针作为函数参数

发布于 20 天前  26 次阅读


#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这个数字,无稽之谈

届ける言葉を今は育ててる
最后更新于 2024-11-03