指针02

指向指针的指针

指针02

#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));
}
C++

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

传值和传引用

传值

写一段程序说明

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

你觉得结果是多少?

指针02

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

指针02

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

指针02

程序开始执行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;
}
C++

运行结果

指针02

指针02

指针02

代码首先把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;
}
C++

指针02

传引用

如果要实现交换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;
}
C++

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

C语言未分类

指针01

2024-11-14 11:04:32

C语言

指针03

2024-11-14 11:20:25

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索

Powered by atecplugins.com