指针02

指向指针的指针

image.png

#include<stdio.h>
int main()
{
	int x = 5;
	int* p0 = &x;
	int** p1 = &p0;
	int*** p2 = &p1;
	printf("address of p0 = %d\n", p0);
	printf("address of *p0 = %d\n", *p0);
	printf("address of *p1 = %d\n", *p1);
	printf("address of **p1 = %d\n", **p1);
	printf("address of ***p2 = %d\n", ***p2);
	***p2 = 10;
	printf("x = %d\n", x);
	**p1 = *p0 + 2;
	printf("x = %d\n", x);
	printf("size of p1 = %d", sizeof(p1));

}

结合代码和图看一下不难,套娃 – –

传值和传引用

传值

写一段程序说明

#include<stdio.h>
void addnumber(int a)
{
	a += 1;
}
int main()
{
	int a = 10;
	addnumber(a);
	printf("a = %d\n", a);
}

你觉得结果是多少?

image.png

结果是10 匪夷所思 明明把a传进去了 为什么没有用??因为main函数的aaddnumber函数的a不是一个a

image.png

打印出两个a 证明事实确实是如此 为什么会不一样??有疑问就是好的,没有疑问大家都不用学习了
see the pic:
一下内容涉及一些内存的知识,内存对学编程的人来说多重要不言而喻
程序在系统上运行开始时,会在系统中开辟一块内存,用来存放程序的数据 代码等等

image.png

程序开始执行main函数 会在栈中压入参数 局部变量返回地址 以及正在执行的指令等等信息 当程序执行到函数addnumber会在栈开辟一块新的区域存放这个函数的的信息 两者并不是一块内存的数据 因此本函数中的a和main函数中的a并不是一个东西 在addnumber函数执行完之后 栈会清空这个函数的所有信息 包括’a’ 然后在继续回到main执行其他函数
再通过参数传递的方式说明一下
值传递
将实参的值赋给形参,形参不能改变实参。传递的过程相当于在函数内部重新定义与实参同类型的变量,再把实参的值赋给该变量
规则:

  1. C语言中参数传递本质都是值传递(引用传递是C++中的概念)
  2. 形参只在调用时分配内存,调用结束时释放内存,形参被销毁。
  3. 参数传递是单向的,只能由实参传给形参。
  4. 形参只是实参的一份拷贝,形参的改变对实参本身没有影响。
    注意:如果指针或者地址作为实参传入函数,指针指向的内容或者地址存放的数据是可以改变的,但是指针的值和地址本身是不会改变的。
    通过一个程序辨析一下
#include<stdio.h>
void swap(int *x,int*y)
{
	int* temp = NULL;
	temp = x;
	x = y;
	y = temp;
}
int main()
{
	int a = 5;
	int b = 10;
	int* p1 = &a;
	int* p2 = &b;
	swap(p1, p2);
	return 0;

}

运行结果

image.png

指针02

image.png

代码首先把a和b的地址作为实参传给了swap函数的形参也就是说 int* x = p1;
int* y = p2; 由此就能知道swap里面交换的是p1和p2指针的值地址 也就是拷贝a b的地址给形参 然后通过x y这两个指针交换 a b两个地址 实际交换的是x y指针指向的地址 与实参的a b并没有关系 就比如你把你的书借给了你的同学 他学会了你就学会了吗?

#include<stdio.h>
void swap(int *x,int*y)
{
	int* temp = NULL;
	printf("x = %d y = %d\n", x,y);
	temp = x;
	x = y;
	y = temp;
	printf("x = %d y = %d\n", x, y);
}
int main()
{
	int a = 5;
	int b = 10;
	int* p1 = &a;
	int* p2 = &b;
	printf("a = %d\n", &a);
	printf("b = %d\n", &b);
	//printf("p1 = %d\n", &p1);
	//printf("p2 = %d\n", &p2);
	swap(p1, p2);
	printf("a = %d b= %d\n", a, b);
	return 0;

}

image.png

传引用

如果要实现交换a b值的效果,不通过形参修改实参就可以,下面介绍两种方法

#include<stdio.h>
void swap(int *x,int*y)
{
	printf("xy交换前的地址\n");
	printf("x = %d  y=%d\n", x, y);
	printf("------------\n");
	int temp = 0;
	temp = *x;
	*x = *y;
	*y = temp;
}
int main()
{
    int a = 5;
	int b = 10;
	int* p1 = &a;
	int* p2 = &b;
	printf("交换前ab的地址\n");
	printf("a = %d\n", &a);
	printf("b = %d\n", &b);
	printf("------------\n");
	printf("p1 = %d\n", p1);
	printf("p2 = %d\n", p2);
	printf("------------\n");
	swap(&a, &b);
	printf("交换后ab的地址\n");
	printf("a = %d\n", &a);
	printf("b = %d\n", &b);
	printf("------------\n");
	printf("p1 = %d\n", p1);
	printf("p2 = %d\n", p2);
	printf("------------\n");

	printf("a = %d b= %d\n", a, b);


	return 0;

}

这改变的是传入地址的内容 并不是改变改变传入的地址 因此有效

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c-2/80/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 2024年11月14日 上午11:04
下一篇 2024年11月14日 上午11:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注